这是频率为f = 236.4 Hz的正弦曲线(长10毫秒;以N=441的采样率具有fs=44100Hz点)及其DFT,无零填充:



通过观察DFT可以得出的唯一结论是:“频率大约为200Hz”。

这里是信号及其DFT,带有大的零填充: >

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

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

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

评论

考虑这个非常古老的问题的另一种方法:如果您根本没有时间序列图,而只有“低分辨率” fft,则可以将其转换为时间序列,零填充并重新-fft可获得236Hz。因此,“低分辨率” ftf必须包含所有与平滑信息相同的信息。

#1 楼

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

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

-

要查看结果如何,这是两个信号相加后的放大FFT图:原始正弦波,和一个频率相差0至100 Hz的正弦波。 />
只有在图的100Hz差值末端(在此处为左侧),您才能区分(解析)这两个图。 br />


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]))


评论


$ \ begingroup $
谢谢!好的,零填充将无助于解决附近频率上的两个单独的音调;但是,在我的示例中,为了找到频谱的峰值,从而找到音调的基础频率(例如,用于精确的音调跟踪目的),它可能会很有用。
$ \ endgroup $
–巴吉
13年8月8日在16:34

$ \ begingroup $
我认为“零填充不会增加分辨率”意味着“您无法在零填充的帮助下进行精确的音高跟踪”(在此情况并非如此,该示例显示可以精确检测到某个音高)
$ \ endgroup $
–巴吉
13年8月8日在16:35

$ \ begingroup $
我认为您理解正确。零填充确实有其用途,例如根据粗谱对峰位置进行精细估算。这不是灵丹妙药。
$ \ endgroup $
–Jason R
13年8月8日在16:49

$ \ begingroup $
我只是尝试了除零填充以外的其他方法,但与此相关。而不是使x(n)变长(结尾处为0),而是保持长度为N的x(n),但是变化在这里:而不是DFT(k)= \ sum x(n)exp(-2 * i * pi * n * k / N)对于k = 0,1,...,N-1,我做DFT2(k)= \ sum x(n)exp(-2 * i * pi * n * k /(10 * N))对于k = 0,1,...,10 * N-1 ...这就像添加更多的bin(10 N个bin而不是N个频点),但保持相同的x(n)的长度现在是10hz,20hz,...,100hz,110hz,120hz ...
$ \ endgroup $
–巴吉
13年11月8日在22:34



$ \ begingroup $
是否添加更多的bin(10N个而不是N个):DFT2(k)= \ sum x(n)exp(-2 * i * pi * n * k /(10 * N)),对于k = 0, 1,...,10 * N-1并保持长度N的x(n)相同,比零填充得到相同的结果:分辨率实际上不是更高,而只是插值?
$ \ endgroup $
–巴吉
13年9月9日13:35



#2 楼

术语“解决”具有多种含义,当使用两种不同的含义时,可能会使尝试进行交流的人们感到困惑。

从光学意义上讲,能够分辨两个附近的明显分开的点(或光谱中的两个相邻峰)而不是一个模糊的斑点,零填充将无济于事。声明零填充不会提高分辨率时,这是最有可能使用的含义。分辨率将甚至低于FFT二进制间隔,例如甚至不是Fs / N,而是2倍至3倍或更高,具体取决于所使用的窗口。对分辨率的较弱要求可能只是DFT正交基向量的频率间隔,例如Fs / N。

就绘图点而言,是的,零填充将为您提供更多绘图点,如DPI(每英寸绘图点)分辨率一样。这样可能更容易通过眼球挑出极端。但是,它们是通过高质量的图形插值(Sinc插值)而没有任何零填充而获得的相同点,因此,它们实际上不添加没有零填充无法计算的信息。

就音调跟踪而言,窗口化非零填充FFT结果的抛物线或Sinc插值(FFT结果仓之间的插值)可能会提供与计算强度更高的较长的零填充FFT图一样好的结果。因此,零填充比非零填充和非插值的峰值选择为您提供“更好”的音调跟踪结果,但通常效率不如仅使用插值。

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

评论


$ \ begingroup $
请记住:如果仅在相同的10ms内具有相同的正弦曲线f = 236.4 hz,但fs = 192khz而不是44.1khz,会发生什么情况:那么真实的频率分辨率会更高吗?
$ \ endgroup $
–巴吉
13年11月8日23:03



$ \ begingroup $
提高采样率将为您提供更多的高频频段,但是在任何感兴趣的低频附近,相同的DFT频段间距,
$ \ endgroup $
– hotpaw2
13年9月9日,0:06

$ \ begingroup $
增加采样率会使DFT中的Sinc-like曲线变窄吗?如果不是这样,则意味着增加采样率不会增加分辨率(意味着解析频率的能力)
$ \ endgroup $
–巴吉
13年9月9日13:34

$ \ begingroup $
@Basj确定信号的特定频率通常称为参数估计,即您正在尝试估计频率参数。对于分辨率(分离2个音调),分辨率由$ 1 / T $给出,其中$ T $是信号的长度。因此,仅更改采样率(而不是持续时间)不会影响分辨率-会影响估计的准确性。
$ \ endgroup $
–大卫
2014年2月26日14:43在

$ \ begingroup $
频率上Sinc的宽度与时间上的数据窗口的宽度有关,零填充或更改采样率并不会真正影响它(采样或量化问题除外)。
$ \ endgroup $
– hotpaw2
2014-2-26在17:03