7

I am new to FFTs and signal processing, so hopefully this question makes sense and/or isn't stupid.

I would like to perform spectrum analysis on a live audio signal. My goal is to find a good tradeoff between responsiveness and frequency resolution, such that I can take a guess at the pitch of the incoming audio in near-realtime.

From what I've gathered about the math behind the Fourier transform, there is an inherent balance between sample size and frequency resolution. The bigger the sample, the better resolution. Since I am trying to minimize sample size (to attain the near-realtime requirement), this means my resolution suffers (each slot in the output buffer corresponds to a wide frequency range, which is undesirable).

However, for my intended application, I don't care about most of the spectrum. I only need spectrum info for a narrow frequency range, say 100hz - 1600hz for example. Is there any way to modify an FFT implementation such that I can improve the resolution of the frequency domain output while keeping the input buffer size constant (and small)? In other words, can I trade output total bandwidth for output resolution? If so, how is this done?

Although I have a weak grasp of the math at best, it seems that padding the input buffer with zeros might be interesting, no?

Thanks in advance for any help you can offer.

4

6 回答 6

8

您无法从任何地方获得更多信息,但您可以通过重叠连续的 FFT来减少延迟。对于实时功率谱估计,通常将连续输入窗口重叠 50%。

在样本之间插入零是另一个有用的技巧 - 它在输出箱中为您提供更明显的分辨率,但实际上您所做的只是插值,即没有获得额外的信息(当然)。除了上面的重叠建议之外,您可能会发现这种技术很有用。

于 2010-11-02T22:47:20.813 回答
3

正如马克所说,添加零会引入谐波(不需要的频率)。

另外,当您说“更大的样本”时,您是指更多的样本还是更高的频率采样率?更高频率的采样率将导致每单位时间产生更多样本,但似乎您意味着以固定采样率获得更多样本(即分析更大的时间块)。

您提到了 1600Hz 的上限频率,因此您需要至少 3200Hz 的采样率,即。双倍的。

至于一次处理的时间段:您需要权衡响应性(10 秒的缓冲区将需要 10 秒 + 处理时间才能获得结果)与减少噪音。较小的缓冲器更有可能拾取杂散噪声信号。

顺便说一句,在频域中思考起初可能具有挑战性。我发现对此最好的东西,不是我在大学上的各种应用数学课,而是晶体学课。晶体衍射图案仅仅是二维傅里叶变换。在我的第一份工作中处理地震数据的 FFT 时,掌握衍射图案如何在视觉上与晶体结构相关证明非常有用。

于 2010-11-02T22:01:49.333 回答
3

我认为没有什么“技巧”可以超越 FFT。“加零”也可能意味着对信号进行过采样。为了消除谐波,必须对信号进行滤波(这肯定会引入额外的噪声)。然后你会做一个更长的 FFT,但之后整体分辨率仍然是相同的。

此外,您的窗口函数将扩大结果中的频率峰值。

OTOH,如果频率落在两个 FFT 箱之间,则可以通过查看相邻箱的比率来获得更好的分辨率: http ://www.tedknowlton.com/resume/FFT_Bin_Interp.html

但这不适用于更复杂的信号(具有许多同时频率)。

  • 如果您想知道是否存在某些频率,我会研究过滤器和相关性。

  • 如果要确定某个频率,可以先将其过滤掉,然后检测过零。设计滤波器时有很多参数,所以滤波器长度只是导致一定滤波器(阶跃)响应时间的一个参数。您可以对多个频率执行此操作,一个接一个...

补充:一些直觉:

  1. 因为 FFT 足以用于重建,所以原则上存在无限多个导致相同样本向量的高分辨率光谱,没有一个更正确。bin 插值本质上计算了另一种(“更好的拟合”)表示,而不是快速傅立叶变换的均匀间隔的 bin。

  2. 在离散、量化的情况下,例如 8 位,考虑两个非常接近的频率。如果差异足够小,它们将产生相同的样本,例如 256 个样本。但是查看更多样本(可能是 1024 个),您会注意到差异变得大到可以看到。

PS:过采样的过滤也可以在 FFT 之后通过简单地忽略较高的 bin 来完成。

于 2010-11-02T22:30:21.740 回答
2

您可以在 1600 Hz(或更高一点,例如 2k)下对数据进行低通滤波,然后重新采样到较低的采样率(滤波器频率的两倍,例如 4k)以减少采样数。然后使用零填充来提高频率分辨率。

于 2010-11-03T08:46:02.213 回答
0

您可能想研究Compressed Sensing。您可以对本质上是预压缩信号的内容进行采样(和存储),以后可以对其进行重构。只要信号稀疏度很高(在您的情况下可能就是这种情况),Shanon-Nyquist 约束可能会有所弯曲。缺点是重新创建原始信号的后处理可能需要大量计算时间。此外,您可能必须开发自己的设备驱动程序来管理您用来采样信号的任何硬件,因为工厂驱动程序可能假设您有兴趣遵守 Nyquist-Shannon 约束。更多信息可以在这里找到。

于 2010-11-11T05:19:21.090 回答
0

您陈述的目标与您的问题不符。音频的音高与解析的频率峰值不同。请阅读有关人声和音乐音高估计的大量文献(适用于许多其他类型的具有感知音高的声音)。与基于频域块的技术相比,自适应/增量/滑动时域技术可以为您提供更低的延迟。

音频样本向量的零填充与频域数据的插值几乎相同。如果噪音很小或附近有干扰,您可能会找到更准确(更高“分辨率”)的频率峰值位置。但是您不会更好地抑制附近的光谱峰值(分离分辨率)或噪声。

在 FFT 之前对数据进行窗口化(von Hann 等)可能有助于消除一些由附近但非 bin 或 2-bin 相邻频率引起的噪声。

补充:除非您的后采样低通滤波器几乎完美且相位线性,否则您实际上可能会在所需频带边缘附近失去频率分辨率。过滤不会将任何实际信息添加到感兴趣的波段中,因此对提高“分辨率”没有帮助。开窗更有可能减少来自其他频率的干扰。

于 2010-11-03T17:38:33.017 回答