周波数分解能が良い場合、ゼロパディング後にDFTで周波数リークが発生するのはなぜですか?


12

この例を考えてみましょう:

Fs=1000; 
Ns=500;
t=0:1/Fs:(Ns-1)*1/Fs;
f1=10;
f2=400;
x=5+5*sin(2*pi*f1*t)+2*sin(2*pi*f2*t);
X=fft(x);

このシナリオでは、周波数分解能は2で、すべての周波数成分が正しくキャプチャされています。ただし、これを行うと:

  X=fft(x,1000);

周波数分解能は1ですが、スペクトル漏れがあります。ここでも同様の効果が見られます。両方のウィンドウのフーリエ変換(1つは長さ500、もう1つは長さ1000)は、信号で示される周波数でゼロを持っているように思えます。そのため、リークが発生する理由がわかりません。


ゼロパディングでは、見かけのスペクトルリークは減少しませんが、スペクトルリークの隆起がより滑らかに見えるだけになります。
ロバートブリストウジョンソン

回答:


18

N Δf

Δf=fsN

Δf2Hz

N10001Hzsincsinc


sincsinc

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

sinc0sinc


N=1000N=10000

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

そしてズームされた部分:

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

注目すべきこと:

  • N=500

  • 最下部でFFTノイズを観察することもできます。

  • N=10000sinc


そして明らかに結果を再現するコード:

Fs=1000; 
Ns=500;
Ns2=1000;
Ns3=10000;
t=0:1/Fs:(Ns-1)*1/Fs;
f1=10;
f2=400;
x=5+5*sin(2*pi*f1*t)+2*sin(2*pi*f2*t);

X1 = abs(fft(x))/length(x);
X2 = abs(fft(x, Ns2))/Ns;
X3 = abs(fft(x, Ns3))/Ns;

F1 = 0:Fs/Ns:Fs-Fs/Ns;
F2 = 0:Fs/Ns2:Fs-Fs/Ns2;
F3 = 0:Fs/Ns3:Fs-Fs/Ns3;

plot(F1, 20*log10(X1))
hold on
plot(F2, 20*log10(X2))
plot(F3, 20*log10(X3))
xlim([0, Fs/2])
grid on
legend({'N=500', 'N=1000', 'N=10000'})

1
非常に完全な答え+1。「[...]周波数間隔を増やすだけです。」それはあるべき減少私は考えます。
Matt L.

2

スペクトル漏れは通常、Sinc畳み込み効果または他のドメイン(tまたは時間の場合は時間)での矩形ウィンドウ処理のアーティファクトの別名です。そして、ゼロパディングは、長方形のウィンドウ(元の非ゼロパッドデータ)をより長いFFTに追加することによって行われます。

FTはすべてゼロでなければならないというあなたの仮説は、一般に1つの周波数ではありません。有限の長さ(および非ゼロ)の信号は、非ゼロのスペクトルの範囲が無限になります。その無限のスペクトル範囲(Sincシェーピング、または他のウィンドウの変換)は、FFT幅全体にまたがるよりも純粋な正弦波の場合にのみ、DFT / FFTの結果では見えません。ゼロパディングはそれを許可しません。


1

漏れは、特に、実際に常にある有限長のウィンドウで発生します。ただし、正弦成分の周期が正確に整数である場合、FFT固有の周期化は、正弦が「無限」であるかのように機能し、その周波数は離散化されたビンに正確に当てはまります。したがって、漏れは何らかの形でキャンセルされ、運が悪かった:信号の周期を事前に知っていれば、フーリエツールで分析する必要はありません。

ゼロパディングを使用すると、純粋な正弦がなくなります。整数以外の期間の複数ウィンドウもありません。あなたは、ウィンドウの境界で急激な変化を持つ正弦のチャンクを連結しています。したがって、周期化された信号全体は、もはや「無限の正弦」ではありません。したがって、@ jojekで完全に説明されているように、リークに同化するものを取得できますが、これはゼロパディング効果です。

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