正弦波のFFT結果を確認するにはどうすればよいですか?


9

FFTアルゴリズムへの入力として、オーディオファイル(正弦波)1000Hzが与えられました。アレイに8192のパワースペクトルサンプルがあります。

出力が正しいか間違っているかを確認する最も簡単な方法は何ですか?

サイレントオーディオファイルを指定すると、すべてのサンプルの出力がゼロになります。サイン波では、o / pは20(0番目のサンプル)から26059811(743番目のサンプル)に増加し、徐々に40に減少します。

出力範囲がわかれば、FFTが機能しているかどうかを技術的に証明できます。

どんなアイデアも役に立ちます。

技術的な疑問については、このリンクを参照しください。


1
配列をプロットできますか?(多分表計算ソフトウェアで?)

配列には8192の値があります。手動でプロットするか、スプレッドシートで処理します。MACで作業しています

2
MS Excelで数万のサンプルをプロットしました。Gnumericなども適しています。またはgnuplotも。

オープンオフィスをお忘れなく
偽名

@Fake名前:私は、グラフをプロットすることはできませんよ...

回答:


4

10ウィンドウを平均して(オーバーラップしていない?)スペクトルを計算して、8192または8193の周波数(0からナイキストまで)で2乗された振幅を取得しているようですが、一部のアルゴリズムでは、ビン8192でナイキスト周波数をドロップする場合があります。

最初に確認することは、ピークが右のビンにあることです。サンプリングレートとは何とも言わなかったが、ビン743はサンプリングレートの743/16384倍になる。信号が実際に800 Hzである場合、Fsは約17640サンプル/秒になります。それは間違っているようです。テスト信号はおそらく8000、16000、22050、32000、44100、または48000などの標準レートになります。Fs= 22050の場合、ピークはビン800/22050 * 16384 = 594で鋭くなります。

チェックする別の基準は、信号の総エネルギーが時間領域と周波数領域の両方でほぼ同じであることです。Pythonでの例を次に示します。

In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)

In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384)  # PSD by Welch's Method

In [4]: sum(x**2)/Fs           # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384       # frequency-domain energy
Out[5]: 0.24148752834391252

Fs = 22050サンプル/秒でサンプリングされた2つの正弦波で構成される入力信号xは、サイズNFFT = 2048サンプルの10個の重複しないウィンドウに分割されます。psd(パワースペクトル密度)の呼び出しは、10の16384ポイントDFTの絶対値の2乗の平均としてスペクトルyを計算します(xは実数値なので、実際には8193ポイントです)。

psd関数はyを信号の合計長ではなくDFTサイズにスケーリングしたため、計算された周波数領域エネルギーのスケーリング係数はN / 16384です。これが問題であるかどうかは、システムがPSDの正規化を処理する方法によって異なります。別のオプションの正規化は、1 / Fによるスケーリングです。これは、元のアナログ信号にエネルギーを一致させます。デフォルトの正規化は、ライブラリに十分に文書化されているはずです。


1000 Hzの正弦波信号をテストしました。私のFFTは正しい答えを出します。ご協力ありがとうございます。

10

FFTの出力の大きさをプロットする必要があります。私はプログラミング言語に精通していませんが、Pythonではのようなものを使用しますplot(abs(fft(a)))。サイレント入力の場合、出力はすべてゼロでなければなりません。正弦波入力の場合、2つのスパイクが表示されます。

代替テキスト

実際の信号の場合、スパイクは左から右に対称になります。ただし、実際のFFTを実行している場合(これは計算的に効率的です)、冗長なミラーイメージを無視するため、プロットの左半分しか出力として取得できません。

周波数が高いほど、スパイクは中心に近くなります。場合は、周波数はチャンクサイズと同期して完璧で、スパイクは広い一点となり、他のすべてが正確に0それ以外の場合は、上記のような先細り「スカート」を持つことになりますとなります。


振幅としてパワースペクトル値を意味しますか?

t->時間を参照して?

時間を気にしないでください。FFTが機能しているかどうかを確認するだけの場合は、マグニチュードの形状がこれに似ていることを確認するだけです。
内部石

FFTが正しく機能しているのに、どうしてもプロットできません。私は自由時間に間違いなくグラフを実装しようとします。ありがとうございました。

1
@clabacchio:ああ。FFTは、プロットの最初と最後にf = 0軸の出力を生成します。プロットの中点はf = fs / 2軸です。多くの場合、0周波数が中心になるようにプロットを再配置するためのfftfreqまたはfftshift関数があります。flic.kr/p/arVeZT
endolith

0

Excel Analysis Toolpak内のフーリエ解析ツールを使用して、データと結果をすばやく確認しました。


私はMACに取り組んでいます。

@Warrior-次にMacPortsまたはFinkを使用してGnumericをインストールしますこれが必要な場合は、Platypusラッパーに関する情報についてもこのページを参照してください
Kevin Vermeer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.