Answers:
频率分辨率取决于FFT长度和输入信号采样率之间的关系。
如果我们为FFT采集8192个样本,则将有:
如果我们的采样率为10 kHz,则Nyquist-Shannon采样定理说我们的信号可以包含高达5 kHz的频率。然后,我们的频点分辨率为:
这可能是从概念上进行解释但更简单的方法:您的bin分辨率仅为,其中是输入信号的采样率,N是FFT点数使用(样本长度)。
从上面我们可以看到,要获得较小的FFT箱,我们可以运行更长的FFT(即在运行FFT之前以相同的速率获取更多的样本)或降低采样率。
抓住:
在时间分辨率和频率分辨率之间总是要权衡取舍。
在上面的示例中,我们需要先收集8192个采样,然后才能运行FFT,以10 kHz采样时需要0.82秒。
如果我们试图通过运行较长的FFT来获得较小的FFT档,则收集所需样本所需的时间甚至更长。
那可能还可以,也可能不是。重要的一点是,在固定的采样率下,提高频率分辨率会降低时间分辨率。也就是说,您在频域中的测量越准确,则在时域中的准确性就越差。您实际上会丢失FFT长度内的所有时间信息。
在此示例中,如果在8192个样本FFT的前半部分中开始和停止一个1999 Hz音,并且在窗口的后半部分中播放一个2002 Hz的音,我们将看到两者,但是它们似乎是同时发生的时间。
您还必须考虑处理时间。8192点FFT需要一些体面的处理能力。减少这种需求的一种方法是降低采样率,这是提高频率分辨率的第二种方法。
在您的示例中,如果将采样率降低至4096 Hz,则仅需要4096点FFT即可实现1 Hz频段* 4096 Hz,则仅需要4096点FFT即可实现1hz频段,并且仍然可以解析2khz信号。这减小了FFT仓的大小,但也减小了信号的带宽。
最终,使用FFT总是会在频率分辨率和时间分辨率之间进行权衡。您必须采取一些平衡的措施才能实现所有目标。
基本FFT分辨率为,其中是采样频率。
区分两个非常接近的信号的能力在很大程度上取决于相对幅度和所使用的窗口函数。
您可能会发现,使用Baudline信号分析仪是解决此问题的一种好方法-不,在Matlab或Python / Numpy中运行一些FFT并一次绘制一个频谱确实不一样。
编辑:还有一个技巧可以用零填充输入并采用更大的FFT。它不会提高您的区分能力,但可能会使频谱更具可读性。基本上,这是一种与矢量图形中的抗锯齿相似的技巧。
值得注意的是,FFT是计算Sample [k] * SineRefWave [j] [k]和Sample [j] * CosRefWave [j]的多个独立对和(k = 0..sample_length-1)的替代方法] [k],对于所有j直到采样长度的一半。如果需要在所有这些频率上进行幅度读数,则FFT将在O(NlgN)时间内全部计算出来,而单独计算它们将花费O(N ^ 2)时间。另一方面,如果仅需要几个频率的幅度读数,则通常最好单独进行计算,特别是如果使用的处理器或DSP可以有效地计算出总和的样式时。
还值得注意的是,虽然具有20ms采样窗口的FFT不能区分单个1975Hz音调,或N <25的频率组合(1975-N)Hz和(1975 + N)Hz,如果附近没有其他频谱内容,它可以用来测量隔离频率,其精度要比采样窗口更好。单独的1975Hz频率将在1950Hz和2000Hz频段中平均拾取,就像1974Hz和1976Hz音调的组合一样。但是,孤立的1974Hz音在1950Hz频段中比在2000Hz频段中更强地拾取,而1976Hz音在2000Hz频段中则更强。