你能在不增加窗口大小的情况下增加 FFT 的频率分辨率吗?

信息处理 过滤器 fft 沥青 stft
2022-01-10 08:11:57

我想使用 STFT 进行多音高分析。我意识到检测信号中存在的部分只是一个开始。我仍然有问题。

假设我有以“CD”频率采样的信号44100Hz有了1024样本窗口,我得到的频域分辨率为22500Hz/512=43Hz. 这仅足以辨别高音钢琴音符,例如: C5 = 523.251HzC#5 = 554.365

我以前认为1024是一个相当大的窗口。但也许不是,通常更大的窗口用于检测部分?

除了增加窗口大小之外,是否可以通过其他方法来增加频率分辨率,这会降低时间分辨率?我想到了两种方法:

方法1:

  1. 0-11.25Hz使用带通滤波器(例如和)将信号划分为频带11.25-22.5Hz
  2. 对较高频段进行下采样,以便原来的高频现在变为低频(第二个频段也是如此11.25-22.5Hz -> 0Hz-22.5Hz) - 不确定这是否可能。
  3. 使用调整后的标签连接生成的 bin 集。

方法2:

  1. 使用一系列限制增加的低通滤波器。
  2. 对增加的频率范围执行 FFT。
  3. 对于每个频率,使用可能的最佳分辨率(来自包含该频率的第一个 FFT 的 bin)。
  4. 这将导致低频具有更好的分辨率,但我认为这没关系,因为对于更高的音符,频率差异更大。

我将不胜感激有关此问题的任何评论。

我还在这里阅读: 窗口大小、采样率如何影响 FFT 音高估计? 关于提高拾峰结果的方法。我想会尝试使用它。

4个回答

如果您真的坚持使用 FFT(而不是参数方法,它不会受到时间/频率权衡的影响),您可以通过使用相位信息来恢复每个 FFT 箱的瞬时频率来伪造更好的分辨率。然后可以通过寻找函数中的平台来检测部分,该函数将瞬时频率作为 FFT bin 索引的函数。如本文所述,此技术的常见实现将“花费”您一个额外的 STFT(瞬时频率通过对信号的 STFT 和信号导数的 STFT 的操作来恢复)。

例如,请参阅此 Matlab音频信号正弦建模实现中的 ifgram 函数。

请注意,这无助于解决掉入相邻 FFT 箱的两个部分。与仅将频谱峰值的 FFT bin 索引转换为频率相比,它只会提供更准确的频率估计。

术语“分辨率”具有多种含义。通常,您无法通过使用相同窗口长度的数据进行插值来提高分离(或“解析”)紧密间隔的光谱峰的能力。但是,您可以通过各种插值方法以比 FFT bin 间距更精细的分辨率(有时更精细的分辨率)来估计远高于本底噪声的孤立固定频谱峰值的频率。

用于更高分辨率估计的常见 FFT 结果插值方法包括抛物线插值、Sinc 插值、将数据零填充到更长的 FFT 中,以及使用(略微)偏移重叠窗口的相位声码器方法。

FFT 本质上是一组带通滤波器,对于给定的 FIR 滤波器内核长度,每个滤波器都具有非常陡峭的过渡,但有大量的阻带纹波。因此,这些滤波器对非周期性窗口噪声没有很好的噪声抑制。如果您怀疑这种类型的干扰是一个问题,那么窗口 FFT 或自定义滤波器组的性能可能会更好。

在Jim Clay问题和pichenettes在评论中回答的进一步研究之后,我发现我的Method2是重新发明的有界 Q 变换,例如 Kashima 和 Mont-Reynaud 描述的(我不确定我可以链接到这篇文章,文件看起来被撕掉了) .

他们的方法在算法上更有效,因为它们从最大的频率范围开始并迭代地向下采样 2 直到它们达到最低倍频程。

例如,布朗还探讨了 Q 变换的好处它可能不如单个 FFT 高效,但具有在不需要的高频带上不计算厚 FFT 的优点。

感谢所有答案、评论和链接。

如果您保留输入的“历史”,并使用它来重叠您的 DFT,那么它将提供更多信息以从中提取光谱内容。当然,这取决于信号的时变特性。它在形式上类似于概率分布函数。

这将为您提供时间间隔更近的 DFT。然而,它仍然会增加每个 DFT 的时间不确定性,这是受自然规律限制的:时间和频谱行为的确切值不能同时确定。

但是,如果频率内容在窗口内变化不大,那么应该没问题。