Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

振幅推定とゼロ パディング

この例では、ゼロ パディングを使用して、正弦波信号の振幅の正確な推定を取得する方法を示します。離散フーリエ変換 (DFT) の周波数は Fs/N の間隔で配置されます。ここで、Fs はサンプル レート、N は入力時系列の長さです。DFT "ビン" に対応しない周波数の正弦波の振幅を推定すると、不正確な推定になります。DFT を計算する前にデータをゼロ パディングすると、振幅推定精度の向上に役立つことがよくあります。

2 つの正弦波から構成される信号を作成します。2 つの正弦波は 100 Hz と 202.5 Hz の周波数をもちます。サンプル レートは 1000 Hz で、信号は 1000 サンプルの長さです。

Fs = 1e3;
t = 0:0.001:1-0.001;
x = cos(2*pi*100*t)+sin(2*pi*202.5*t);

信号の DFT を求めます。DFT ビンは 1 Hz の間隔で配置されます。したがって、100 Hz の正弦波は DFT ビンに対応しますが、202.5 Hz の正弦波は対応しません。

信号が実数値なので、DFT から正の周波数だけを使用して振幅を推定します。DFT を入力信号の長さによってスケーリングしてから、0 およびナイキスト周波数を除くすべての周波数に 2 を乗算します。

比較のため、結果を既知の振幅とともにプロットします。

xdft = fft(x);
xdft = xdft(1:length(x)/2+1);
xdft = xdft/length(x);
xdft(2:end-1) = 2*xdft(2:end-1);
freq = 0:Fs/length(x):Fs/2;

plot(freq,abs(xdft))
hold on
plot(freq,ones(length(x)/2+1,1),'LineWidth',2)
xlabel('Hz')
ylabel('Amplitude')
hold off

Figure contains an axes object. The axes object with xlabel Hz, ylabel Amplitude contains 2 objects of type line.

周波数が DFT ビンに対応しているため、100 Hz における振幅推定は正確です。しかし、202.5 Hz における振幅推定は、周波数が DFT ビンに対応していないため正確ではありません。

ゼロ パディングにより DFT を内挿できます。ゼロ パディングの使用によって、分解可能な信号成分のより正確な振幅推定を求めることができます。しかし、ゼロ パディングによって DFT のスペクトル (周波数) 分解能が向上するわけではありません。分解能はサンプル数とサンプル レートによって決定されます。

2000 または元の長さ x の 2 倍まで DFT をパディングします。この長さでは、DFT ビンの間隔は Fs/2000=0.5Hz になります。この場合、202.5 Hz 正弦波のエネルギーは DFT ビンに直接収まります。DFT を取得し、振幅の推定をプロットします。2000 サンプルまでゼロ パディングを使用します。

lpad = 2*length(x);
xdft = fft(x,lpad);
xdft = xdft(1:lpad/2+1);
xdft = xdft/length(x);
xdft(2:end-1) = 2*xdft(2:end-1);
freq = 0:Fs/lpad:Fs/2;

plot(freq,abs(xdft))
hold on
plot(freq,ones(2*length(x)/2+1,1),'LineWidth',2)
xlabel('Hz')
ylabel('Amplitude')
hold off

Figure contains an axes object. The axes object with xlabel Hz, ylabel Amplitude contains 2 objects of type line.

ゼロ パディングの使用によって、両方の周波数の振幅を正確に推定することができます。

参考