具有高分辨率的实时 FFT,同时保持低延迟

Posted

技术标签:

【中文标题】具有高分辨率的实时 FFT,同时保持低延迟【英文标题】:Real-Time FFT with High Resolution while Keeping Latency Low 【发布时间】:2011-07-24 21:29:06 【问题描述】:

我已阅读有关 fft 和分辨率的所有 wikipedia 文章和 *** 文章。但是,在学习如何获得高分辨率频率而又没有巨大的延迟问题方面,没有任何帮助。

如果我正确理解信号处理:

我的采样率为 44,100,我占用了 256 个块。那么使用 FFT 的频率分辨率将为 44,100/2/256 = 86.1 Hz。

我经常看到像 http://www.tunelab-world.com/ 和 http://www.spectraplus.com/ 这样的例子,它们能够确定低至 0.01 Hz 的频率。

如果我用上述方法做到这一点,我需要 4410,000 个 bin 才能获得这种分辨率。在 44,100 采样率下,从输入中填充数据需要 100 秒。

我知道我错过了什么,但我不知道是什么。

我怎样才能得到一个信号,然后以这种精度绘制图表或显示峰值的频率,而无需占用大量的 bin 或永远等待?

提前感谢您的帮助!

【问题讨论】:

什么是“实时”?你知道有海森堡测不准原理这样的东西吗?为什么需要 100 秒? 实际上,当您对实信号(无虚部)进行 256 个样本时,在 fft 之后,“有用的”箱从索引 0 变为 128(即 N /2 + 1)共有 129 个垃圾箱。剩下的只是第一个的镜像,中间的(索引 128)是“镜像”。 【参考方案1】:

如果您想要高频率分辨率的 FFT 输出,则必须对多个样本执行 FFT:根本无法绕过。

您可能在其他应用程序中看到的是重叠的:它们可能对第一组数据进行 4096 pt FFT,然后沿 256 个样本移动并再进行 4096 pt FFT(在他们已经使用的 3840 个样本上,加上新的 256 个样本)。

这允许您以精细的频率分辨率显示定期(不同)更新。它不适合捕捉瞬态信号,但在活动显示器上看起来不错。

【讨论】:

钢琴上的持续音符会被认为是短暂的吗?我的理解是,这不是因为频率会有些恒定。 我不会这么认为:在这种情况下,瞬态信号比 FFT 样本长度短得多,以至于它的幅度会随着它不存在的时间而减小。但是,如果您有 100 秒的采样时间并且音符仅持续一秒钟,那么是的,这将是短暂的:您仍然会在正确的 bin 处看到一个峰值,但不是一个强峰值。如果其他一切都只是短暂的,那么您可能会没事(这都是相对的)。 @Ryan 虽然单个钢琴音符的基频是恒定的,但随着时间的推移,它的谐波含量却不是。【参考方案2】:

您可以获得更高准确度的原因是频率估计问题比许多其他估计问题更适合以更高的准确度解决。

准确率上的 Cramer-Rao 下限 (CRLB) 为 given by:

这意味着频率估计的方差(预期误差的度量)随着测量持续​​时间 T 的立方下降。 “正常”估计问题倾向于使该度量随着 T 的平方而下降。

使用 FFT 最大化器(峰值最大的 bin)只会得到 T 的平方。

正如 Adrian Taylor 所说,您提供的示例可能从更多的样本开始,然后以更短的持续时间进行更新。

对于踢球,有可能感兴趣的some frequency estimation algorithms here。它们比 FFT 更快,更准确。

【讨论】:

感谢您提供文章链接和解释。使用这些频率估计算法,我假设它们适用于时域数据,而不是从数据的 FFT 获得的频域数据。 @Ryan,是的,大多数有用的算法都适用于时域数据——尽管有几个使用 FFT 点并在峰值周围进行插值以获得更准确的估计。如果您出于其他原因已经在进行 FFT,那么这些可能值得一看。如果您需要更多指点,请告诉我,我会看看我能做些什么。【参考方案3】:

SpectraPlus 显示“高达 1,048,576 点的高分辨率 FFT 分析”;这不会让你在 44.1 kHz 时达到 0.01 Hz 的分辨率。

TuneLab 似乎下降到 0.01 美分,但“频谱显示”的分辨率似乎在 440 Hz 时约为 2.5 Hz。 “相位显示”没什么特别的。

你想做什么?如果您只想实现吉他调音器,则不需要(并且可能不想要)FFT。不知道更好,我会去一个 PLL。

【讨论】:

TuneLab 的相位显示似乎显示了大约 2.5 Hz 的分辨率。我现在可以看到了。我在 Audacity 中使用音调发生器运行了 tunelab,并能够确定它可以区分 440.00 Hz 和大约 440.010。那么,如果频谱显示只有 2.5 Hz 分辨率,他们是否能够通过其他方式确定独立于 FFT 频谱频率分辨率的频率? (我希望能做一个钢琴调音程序。) 正如我所说,如果你已经知道你的目标是什么音符,我会选择 PLL。您还可以在 FFT 箱之间进行插值以猜测峰值;我不知道这有多准确。您甚至可以尝试检测存在的谐波以确定基波是什么,但这开始变得困难。

以上是关于具有高分辨率的实时 FFT,同时保持低延迟的主要内容,如果未能解决你的问题,请参考以下文章

用高分辨率替换低分辨率图像时保持完全相同的缩放位置

cocos2d iOS游戏录制视频,视频低分辨率,正常情况下高分辨率

为移动设备、低分辨率桌面和高分辨率桌面编写媒体查询 [重复]

移动端实时音视频直播如何做给延迟做优化

RealSense R200 在高色彩分辨率和低深度分辨率下崩溃

实时立体匹配网络StereoNet