为什么我们说“零填充并不能真正提高频率分辨率”

信息处理 fft 傅里叶变换 信号分析 自由度 零填充
2022-01-18 05:06:01

这是一个频率的正弦曲线f = 236.4 Hz(它长 10 毫秒;它有N=441采样率的点fs=44100Hz)及其 DFT,没有零填充

在此处输入图像描述

通过查看 DFT,我们可以得出的唯一结论是:“频率大约为 200Hz”。

这是信号及其 DFT,具有较大的零填充

在此处输入图像描述

现在我们可以给出一个更精确的结论:“通过仔细观察频谱的最大值,我可以估计出 236Hz 的频率”(我放大后发现最大值在 236 附近)。

我的问题是:为什么我们说“零填充不会提高分辨率”(我经常看到这句话,然后他们说“它只添加插值”)

=> 在我的示例中,零填充帮助我以更精确的分辨率找到正确的频率!

2个回答

在这种情况下,分辨率有一个非常具体的定义。它指的是您在附近频率解析两个独立音调的能力。您已经提高了频谱估计的采样率,但是您还没有获得任何区分两种音调的能力,例如,236 Hz 和 237 Hz。相反,无论您应用多少零填充,它们都会“融合”成一个单一的斑点。

提高分辨率的解决方案是观察信号更长时间,然后使用更大的 DFT。这将导致其宽度与 DFT 大小成反比的主瓣,因此如果您观察足够长的时间,您实际上可以分辨出彼此相邻的多个音调的频率。

--

要了解这是如何发生的,这里是两个信号相加的放大 FFT 图:您的原始正弦曲线,以及一个与它的频率相差 0 到 100 Hz 的正弦曲线。

只有在图的 100Hz 差异端(此处为左侧),您才能区分(解析)两者。

用于生成下图的 Scilab 代码。

在此处输入图像描述

f = 236.4;
d = 10;
N=441;
fs=44100;
extra_padding = 10000; 

t=[0:1/fs:(d/1000-1/fs)]
ff = [0:(N+extra_padding-1)]*fs/(N+extra_padding);

x = sin(2*%pi*f*t);

XX = [];

for delta_f = [0:100];
    y = sin(2*%pi*(f+delta_f)*t);
    FFTX = abs(fft([x+y zeros(1,extra_padding)]));
    XX = [XX; FFTX];
end

mtlb_axis([0 1300 0 500])

figure(1);
clf
[XXX,YYY] = meshgrid(ff,0:100);
mesh(XXX(1:100,[50:90]),YYY(1:100,[50:90]),XX(1:100,[50:90]))

“决议”一词有多种含义,当使用两种不同的含义时,这可能会使试图交流的人感到困惑。

在光学意义上,能够分辨两个附近明显分开的点(或光谱中的两个相邻峰)而不是一个模糊的斑点,零填充将无济于事。这是在声明零填充不会提高分辨率时最有可能使用的含义。

如果一个人对分辨率的要求需要频谱峰值之间的下降(例如至少降低 3 dB),那么分辨率将甚至低于 FFT 箱间距,例如甚至不是 Fs/N,而是 2X 到 3X 或更多,取决于使用的窗口。对分辨率的较弱要求可能只是 DFT 的正交基向量的频率间隔,例如 Fs/N。

就绘图点而言,是的,零填充将为您提供更多绘图点,如 DPI(每英寸绘图点)分辨率。这可能更容易通过眼球挑选出极值。然而,它们与您在没有任何零填充的情况下进行非常高质量的绘图插值(Sinc 插值)所获得的点相同,因此它们确实没有添加没有零填充否则无法计算的信息。

在音高跟踪方面,窗口化非零填充 FFT 结果的抛物线或 Sinc 插值(FFT 结果箱之间的插值)可能会为您提供与计算量更大的较长零填充 FFT 图一样好的结果。因此,零填充为您提供比非零填充和非插值峰值拾取“更好”的音高跟踪结果,但通常比仅使用插值效率低得多。

如果您在示例中添加噪声,但略小于信号,您会发现零填充峰值可能与非零填充峰值一样不准确。因此,在更一般的情况下,您可能找不到比以前更准确的“正确”频率。零填充仅对由于噪声导致的不准确结果进行插值,这也是据说它不会提高分辨率的另一个原因。