【问题标题】:Improving frequency resolution of FFT output by limiting frequency range?通过限制频率范围来提高 FFT 输出的频率分辨率?
【发布时间】:2011-05-04 04:47:14
【问题描述】:

我是 FFT 和信号处理的新手,所以希望这个问题有意义和/或不愚蠢。

我想对现场音频信号进行频谱分析。我的目标是在响应性和频率分辨率之间找到一个很好的平衡点,这样我就可以近乎实时地猜测传入音频的音高。

根据我收集到的有关傅立叶变换背后的数学知识,样本大小和频率分辨率之间存在固有的平衡。样本越大,分辨率越好。由于我试图最小化样本大小(以达到近乎实时的要求),这意味着我的分辨率会受到影响(输出缓冲区中的每个插槽都对应于很宽的频率范围,这是不可取的)。

但是,对于我的预期应用,我并不关心大部分频谱。我只需要窄频率范围的频谱信息,例如 100hz - 1600hz。有什么方法可以修改 FFT 实现,以便我可以提高频域输出的分辨率,同时保持输入缓冲区大小不变(并且很小)?换句话说,我可以用输出总带宽换取输出分辨率吗?如果是这样,这是如何完成的?

虽然我对数学的理解充其量只是很弱,但用零填充输入缓冲区似乎很有趣,不是吗?

提前感谢您提供的任何帮助。

【问题讨论】:

  • 用零填充输入缓冲区与突然关闭的信号相同 - 突然转换将在输出中产生自己的频率。
  • 确实如此,但是用零填充不会对整体相对频率分布产生净影响,对吧?而且增加的缓冲区大小也会给我更好的输出分辨率,对吧?不过,这确实感觉像是“不劳而获”:/
  • 在输入样本之间插入零比填充输入缓冲区更有用(即在每个真实样本之间插入 N 个零样本)。这提供了更高分辨率的输出光谱,尽管实际上没有获得任何新信息 - 实际上它只是插值。

标签: audio signal-processing fft frequency-analysis


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢。这个问题起初看起来很简单,这显然表明我对这个问题了解得很少:) 现在阅读音高估计。您关于时域分析可能比频域分析更有效的评论很有趣,您能详细说明一下吗?
    • @gga80,时域分析可能是一个全新问题的好主题。
    【解决方案3】:

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

    【讨论】:

    • 非常有趣的建议。为什么需要“重新采样”?你不能只是零填充并重新解释生成的 FFT 的 bin 吗?另外,当您说零填充时,您的意思是在样本之间插入零吗?
    • 一旦数据经过低通滤波,重采样实际上可能相当于每 N 个样本中丢弃 1 个样本。但是,如果原始采样率不是所需采样率(4k)的整数倍,则需要某种插值。使用零填充是指在信号末尾添加零以获得足够的样本来满足所需的频率分辨率。
    【解决方案4】:

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

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

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

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

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

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

    补充:一些直觉:

    1. 因为 FFT 足以进行重建,所以原则上存在无限多的高分辨率光谱,它们导致相同的样本向量,没有一个更正确。与 Fast-Fourier-Transform 的均匀间隔 bin 相比,bin 插值本质上计算了另一种(“更好的拟合”)表示。

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

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

    【讨论】:

    • 感谢您的指点。我还没有真正理解窗口函数的作用,还有更多的学习要做:)
    【解决方案5】:

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

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

    【讨论】:

    • 很有用,谢谢!重叠输入缓冲区听起来是一种很有前途的方法。
    【解决方案6】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回复,可能我可以通过提高采样率来更接近目标,将进行调查。
    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多