正弦波のFFTが期待どおりに到達しない、つまり単一ポイント


14

シアンのプロットは50 Hzのスペクトルであり、マゼンタのプロットは50.1 Hzの正弦波(振幅0.7)です。両方とも1024サンプル/秒でサンプリングされます。このスペクトルを取得するために、1024ポイントのFFTを実行しました。

なぜ50Hzのスペクトルだけが単一の値なのですか?50.1 Hzのサインが50.1 Hz以外の他の周波数で構成されているのはなぜですか。これらの新しい周波数はどこから来たのですか?

50.1 Hzの信号に対して非線形処理をしませんでした!また、実際に生成された正弦波の振幅が0.7である場合、50.1 Hzは最大振幅が小さいように見えます。つまり、0.7ではありません。

どうしてこれなの?

それぞれ50Hzと50.1Hzの2つのスペクトル MATALBコマンドfft()で取得;


このプロットの作成に使用したコードを投稿してください。私の最良の推測は、信号が非常に接近しているため、fftはそれらを適切に解決できないことです。それ、またはサンプルが周波数と一致しないため、スペクトルが不鮮明になる。
トムキーリー

4
以下の答えは正しいです。観測対象の用語はスペクトルリークと呼ばれ、周波数がDFT出力ビンの1つの中心に正確にない正弦波を分析するときに観測されます。
ジェイソンR

私はuはあなたが50Hzのマークであなたのスパイクを得ることができるようにするために何に対してプロットかを知ることができますしてください
Nazario_Jnr

問題の詳細と修正方法については、この回答をご覧ください。
ディリップサルワテ

回答:


14

Acually Mattの答えは、ここで問題に関する1つの見解をすでに示しています。DFTは、時間領域と周波数領域の両方で暗黙的に周期的です(この質問を参照)。パラメータから、観測期間が1秒であると計算できます。つまり、50 Hzトーンの50周期を観察します。観測間隔を定期的に延長すると、常に正弦波が発生します。50.1 Hzのトーンを使用する場合、50.1周期の振動を変換しています。その信号を定期的に延長すると、位相ジャンプが発生し、追加のスペクトルトリビュタリが発生します。

fs/NDFT=1024Hz/1024=1Hz

上記の両方の効果は、観測しているスペクトルに影響します。


1
それは理にかなっている。しかし、あなたが説明したより明確なスペクトル漏れは、スペクトルを観測するためのツール(FFT)の問題です。信号の欠陥自体ではありません。意味50.1 Hzのオーディオ信号を「聞く」と、ある種の「ノイズ」ではなく、単一のトーンとして耳に聞こえます。私は正しいですか?
gpuguy

1
あなたは絶対に正しい。DFTを正しく解釈できるようにするために、DFTが実際に何をしているかを理解することがいかに重要かを示しています。補足:実際の実装で「聞く」ことは、ディスクリートをアナログ信号に変換する方法にも依存します。
DEVE

11

これは、サイン信号の切り捨てまたはウィンドウ処理の効果です。切り捨てられた信号にシフトされた信号を追加しても、元の正弦波のままになるように切り捨てる必要があります。


6

FFTの開口部または幅で周期的に正確に整数である純粋な変調されていない正弦波の周波数に対して、単一の結果FFTポイントのみを取得します。正弦波のその他の周波数は、デフォルトウィンドウ(長方形)の変換(周期的Sinc)と畳み込まれたように表示されます。

50.1 Hzは、FFTの1秒ウィンドウでは正確に周期的ではありません。

それらの他の「漏れ」FFT結果ビンまたは周波数は、FFT幅で正確に整数周期ではない信号によってウィンドウ境界間で生じる不連続性を表すために必要です。これは、DFTのすべての基底ベクトルがDFTの幅内で正確に周期的な整数であり、基底ベクトルの終わりと始まりの間に急激な不連続性がないためです。したがって、これらの特性を持たない信号は、1つのDFT基底ベクトル(およびその複素共役)で表すことができないため、残りの信号に関する情報はどこかに行かなければなりません。

総エネルギーはFFT変換(Parseval'a定理)によって保存されるため、「漏れ」ビンのエネルギーはピークビンから取り除かれます。したがって、ピークビンの大きさは低くする必要があります。


5

最初と最後のサンプルであなたの正弦波はゼロだと思いますか?すべきではありません。最後のサンプルの後の次のサンプルがゼロになるように並べる必要があります。これにより、信号のコピーを次々とコピーして貼り付けることができ、サンプルが重複せずに連続して見えるようになります。たぶん、タイル張りのデスクトップの壁紙のようなものだと思うかもしれません。:)

Pythonの例については、https://gist.github.com/endolith/236567を参照してください

# Sampling rate
fs = 128 # Hz

# Time is from 0 to 1 seconds, but leave off the endpoint, so that 1.0 seconds is the first sample of the *next* chunk
length = 1 # second
N = fs * length
t = linspace(0, length, num = N, endpoint = False)

# Generate a sinusoid at frequency f
f = 10 # Hz
a = cos(2 * pi * f * t)

# Use FFT to get the amplitude of the spectrum
ampl = 1/N * abs(fft(a))

信号の2つのコピーがエンドツーエンドでどのように組み合わさって連続波を作るかを確認します。

ここに画像の説明を入力してください

これが発生すると、FFTエネルギーは完全に1つのビンに含まれます。

ここに画像の説明を入力してください


1
OPと同じ問題がありました。エンドポイント= Falseフラグを設定することで解決しました。デフォルトでは、ラインスペースは(閉じている、開いている)と思っていましたが、(閉じている、閉じている)ことが判明しました。あなたのコードのおかげでバグを見つけました。
Trismegistos

-1

これは、スペクトルリークとウィンドウイングが原因で発生します。理想的な応答、つまりインパルス関数は、連続時間正弦波用です。デジタルコンピューターで離散正弦波のDFTを取得する場合、基本的には、ウィンドウ化およびサンプリングされた正弦波のフーリエ変換を取得し、それを周波数領域でサンプリングします。これにより、スペクトル漏れが発生します。参照:http : //w.astro.berkeley.edu/~jrg/ngst/fft/leakage.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.