FFTを実装して、その仕組みを理解しようとしています。ランダムなサウンドファイルを使用しています(つまり、 44,1Khzのサンプリング周波数で「信号のサイズを制御できません)。私はこのライブラリを使用しています
https://www.nayuki.io/res/free-small-fft-in-multiple-languages/Fft.java
目的は、この式を頻度を取得します: F = n * Fs / N
n ビンの数。 Fs サンプリング頻度、および N FFTのサイズ
1)Fftは長さがあると想定されており、ほとんどの場合、2基数の累乗を使用します。しかし、FFTをデータの配列全体に適用した場合、どうすればFFTの長さを知ることができますか?その配列のサイズですか?
2)ビンがわかりません。どのように処理されますか?FFTがデータのチャンクで機能することは知っていますが、データの完全な配列を指定すると、ビンはどのように「作成」されますか。
コメント
- これらの質問には、インターネットで少し検索して読むだけで答えることができます。また、数学的に構築されたものからコーディングを開始することをお勧めします。かなり短い持続時間の信号を送信し、FFTソフトウェアをそれらに適用して、結果を調べます。
- 実際には多くの検索を行いましたが、理解できませんでした。' i '遅すぎます。ご心配をおかけしていただきありがとうございます。
- "離散フーリエ変換で検索してみてください"または" DFTはivid = “130ae32bec”の代わりに"どのように機能しますか>
FFTはどのように機能しますか"。高速フーリエ変換は、離散フーリエ変換の計算上のショートカットです。形。後者の検索では、基礎となるプロセスではなく、計算効率に関する情報を見つける可能性が高くなります。 '誰かが、それを行うことに専念している多数のWebサイトよりも、簡単なフォーラムの回答で基本をよりよく説明することを期待できる方法がわかりません。私のブログの最初の4つの記事はあなたにも役立つはずです。 dsprelated.com/showarticle/754.php から始めます。
回答
質問1
配列の全長に適用すると、FFTの長さは配列の長さになります。ただし、長さが2の累乗の場合、FFTの方が効率的であるため、長さが2の累乗になるまで、信号の末尾に0を埋め込むのが一般的です。
非常に単純な例…
x = [3.4, 2.56, 1.3]
x
の長さは3、次の累乗3の後の2は4なので、x
を
x = [3.4, 2.56, 1.3, 0]
に変更します。長さ4のFFTを適用します。
もう1つの大きなしかし!信号が長い場合は、一度にすべてを実行するのは非常に非効率になります。短い曲の長さでもオーディオファイルに対してFFTを実行しようとは思わないでしょう。その場合、信号を適切なサイズのチャンクに分割し、それぞれについてFFTを実行し、結果を平均化します。
データを実際に使用したいのは、標準のFFTだけでなく、上記の平均化プロセスである可能性があります。GoogleBartlettand Welchより多くのdのための方法etails。
質問2
ここで何を質問しているのか100%わかりません。周波数ビンの幅がどのように決定され、それで実行されるかを知りたいと思うように解釈します。
各周波数ビンの幅は、信号がサンプリングされたレートとFFTの長さ。各ビンの幅は、サンプリング頻度をFFT内のサンプル数で割ったものです。
df = fs / N
周波数ビンは-fs/2
から始まり、fs/2
まで上がります。つまり、100サンプルで100Hzでサンプリングした場合、周波数ビンは幅になります。 1Hz。200個のサンプルを取得すると、周波数ビンの数は2倍になり、幅はそれぞれ1 / 2Hzになります。
コメント
- どうもありがとうございました。'理解できなかったことがすべてでした。