Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

幅值估计和填零

此示例说明如何使用填零来获得正弦信号幅值的精确估计。离散傅里叶变换 (DFT) 中频率的间隔为 Fs/N,其中 Fs 是采样率,N 是输入时序的长度。在尝试估计正弦波幅值时,如果频率无法对应到 DFT bin,则可能导致估计不准确。在计算 DFT 之前对数据填零通常有助于提高幅值估计的准确度。

创建由两个正弦波组成的信号。这两个正弦波的频率分别为 100 和 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 bin 的间距为 1 Hz。相应地,100 Hz 正弦波对应到一个 DFT bin,但 202.5 Hz 正弦波无法对应。

由于信号是实数值信号,此处只使用 DFT 的正频率来估计幅值。按输入信号的长度缩放 DFT,并将 0 和 Nyquist 之外的所有频率乘以 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. The axes contains 2 objects of type line.

100 Hz 的幅值估计是准确的,因为该频率对应到一个 DFT bin。然而,202.5 Hz 的幅值估计并不准确,因为该频率无法对应到一个 DFT bin。

您可以通过填零对 DFT 插值。填零使您能够获得可分辨信号分量的更精确幅值估计。另一方面,填零并不能提高 DFT 的频谱(频率)分辨率。分辨率由采样点数量和采样率决定。

将 DFT 的长度填充到 2000,即 x 原始长度的两倍。使用此长度时,DFT bin 的间距是 Fs/2000=0.5Hz。此时,202.5 Hz 正弦波的能量正好落入一个 DFT bin。获得 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. The axes contains 2 objects of type line.

通过填零,您可以对这两个频率的幅值都做出正确估计。

另请参阅