振幅估计和填零
此示例说明如何使用填零来获得正弦信号振幅的精确估计。离散傅里叶变换 (DFT) 中频率的间隔为 ,其中 是采样率, 是输入时间序列的长度。在尝试估计正弦波振幅时,如果频率无法对应到 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 和奈奎斯特之外的所有频率乘以 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
100 Hz 的振幅估计是准确的,因为该频率对应到一个 DFT bin。然而,202.5 Hz 的振幅估计并不准确,因为该频率无法对应到一个 DFT bin。
您可以通过填零对 DFT 插值。填零使您能够获得可分辨信号分量的更精确振幅估计。另一方面,填零并不能提高 DFT 的频谱(频率)分辨率。分辨率由采样数和采样率决定。
将 DFT 的长度填充到 2000,即 x
原始长度的两倍。使用此长度时,DFT bin 的间距是 。此时,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
通过填零,您可以对这两个频率的振幅都做出正确估计。