質問するログイン新規登録

Q&A

解決済

2回答

7961閲覧

FFTの周波数分解能について

sepasepa

総合スコア1

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/10/28 09:06

0

0

前提・実現したいこと

現在音声を録音し、その音に対してフーリエ変換を行うことで周波数解析を行っています。
1Hzの周波数分解能でデータを取得したかったので、
サンプリングレート44.1kHz,量子化ビット数16ビット,サンプリング点数65336でデータを取得すると、0.67Hzの周波数分解能で取得することができました。

しかし、サンプリングレート44.1kHz,量子化ビット数16ビット,サンプリング点数1024の設定で取得したデータを繋ぎ合わせ、サンプリング点数を先ほどと同じ数まで増やしても、周波数分解能が細かくならず43.06Hzになってしまいます。

この現象について、納得の行く答えが出せず困っています。
もしお分かりなら教えていただけないでしょうか?

イメージ図

![イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

jbpb0

2021/10/28 11:36 編集

周波数分解能を具体的にどうやって計算してるのかの情報を提示しないで、計算した結果が変だけど何で? って聞かれても、他人には分かりません 計算が間違ってるのでしょう、って思うだけです 間違えずに計算したら、周波数分解能は全データ長さの逆数なので、そのデータがもともと一つのデータでも、複数のデータをつないだものでも、全データ長さが同じなら、周波数分解能は同じです なお、ここでの全データ長さとは、データ数ではなく、単位は時間とか距離とかです この質問の場合は、音声データの秒数です > サンプリングレート44.1kHz,量子化ビット数16ビット,サンプリング点数65336でデータを取得すると、0.67Hzの周波数分解能 の場合は、65536/(44.1*1000)秒なので、その逆数の 44.1*1000/65536=0.67Hz ですね データがつなげたものだろうと、 > サンプリングレート44.1kHz,量子化ビット数16ビット,サンプリング点数65336 が同じなら、周波数分解能も同じです 【追記】 上記はFFTの場合の話です FFT結果の周波数は0から始まって等間隔に並びますけど、その周波数の間隔のことを周波数分解能として説明しました
thkana

2021/10/28 11:03

なんだか「分解能」っていう言葉を誤解している気がする。43.06(40.06)ってどういう数字でしょう? フーリエ変換した結果から「分解能」が導かれることはないと思います。二つの、周波数がdHz異なる正弦波についてフーリエ変換を比較した結果がどう違うか、という形でなら「分解能」になるでしょうけれど。 > データを繋ぎ合わせ、サンプリング点数を先ほどと同じ数まで増やしても それが同じでないのなら「繋ぎ合わせ」の操作もなにか私の思うものと違っていそうです。「繋ぎ合わせ」とはどうすることでしょう?
sepasepa

2021/10/28 11:26 編集

私の質問が不十分で申し訳ございません。 >43.06(40.06)ってどういう数字でしょう? この数字は、サンプリング周波数44100、サンプリング定数1024で取得したときの周波数分解能で、以下の式で導きました。 周波数分解能=サンプリング周波数/サンプリング点数=44100/1024=43.06Hz > それが同じでないのなら「繋ぎ合わせ」の操作もなにか私の思うものと違っていそうです。「繋ぎ合わせ」とはどうすることでしょう? サンプリング周波数44100、サンプリング定数1024の設定で音声データを1024個取得し、配列に格納します。 この処理をwhileループで回しながら実行し、65536個のデータに達するまで配列に音声データを格納して、繋ぎ合わせるという作業をしています。 補足なのですが、AndroidのAudioRecordを用いて実装しています。
jbpb0

2021/10/28 11:44

> サンプリング周波数44100、サンプリング定数1024で取得したときの周波数分解能で、以下の式で導きました。 周波数分解能=サンプリング周波数/サンプリング点数=44100/1024=43.06Hz 音声データをつながずに、1024個だけでFFT処理した場合は、そうです つなげてもっと長いデータにしたら、違います 65536個のデータがある時、そのデータがもともと65536個あったのか、それともつなげて65536個になったのかなんて関係無いです
sepasepa

2021/10/28 11:49

丁寧に返信ありがとうございます。 今回の実装は音声データを繋げてFFT処理をしているので、皆さんの意見を聞く限り、私のコードが間違っている確率が高そうです。 もう一度コードを見直してみます。
jbpb0

2021/10/28 11:53

逆の場合を考えてみてください 65536個のデータをそのままFFTした場合の周波数分解能は0.67Hzですよね では、そのデータを64分割して、それぞれが1024個のデータになりました それをFFTした場合の周波数分解能は0.67Hzでしょうか? そんなはずないですよね 1024個のデータなら43.1Hzです データを64分割したから、周波数分解能は64倍に大きく(粗く)なります 分割してデータ数が減ったら周波数分解能は大きく(粗く)なり、つなげたらその反対
guest

回答の取得に失敗しました

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問