“滚动” FFT 是不是可能,是不是有用?

Posted

技术标签:

【中文标题】“滚动” FFT 是不是可能,是不是有用?【英文标题】:Is a "rolling" FFT possible and could it be of use?“滚动” FFT 是否可能,是否有用? 【发布时间】:2013-12-25 09:11:52 【问题描述】:

最近我一直在尝试音频和 FFT,特别是 Processing 中的 Minim 库(基本上是 Java,这对于这个问题并不是特别重要)。我所了解的是,在缓冲区/样本大小 N 和采样率 K 的情况下,在执行前向 FFT 后,我将获得 N 个频率箱(只有 N/2 个可用数据,实际上 Minim 只返回 N/2 个箱)线性间隔表示从 0 到 K/2 HZ 的光谱。

使用 Minim(以及其他典型的 FFT 实现),您等待收集 N 个样本,然后执行正向变换,然后等待 N 个更多样本,依此类推。为了获得合理的帧速率(用于音频可视化、节拍检测等),我必须使用相对于采样频率较小的样本大小。

不过,问题在于,当我计算对数间隔的平均值时,小样本量会导致频谱低端的分辨率非常低(因为低音八度音程比高音八度音程窄得多)。

我想知道是否有一种可能的方法来压缩更明显的分辨率,即在比我目前使用的稍大的样本量上比每 N 个样本更频繁地执行 FFT。 (即输入缓冲区大小为 2048,每 100 个样本,将这些样本添加到输入缓冲区并删除最旧的 100 个样本,然后执行 FFT)。看起来这可能会产生滚动平均类型的影响(我可以忍受),但我不太确定。

这种方法的优缺点是什么?有没有其他方法可以提高我的表观分辨率,同时还能进行实时可视化和分析?

【问题讨论】:

【参考方案1】:

这种方法被称为短时傅里叶变换。您可以在***上获得所有问题的答案:https://en.wikipedia.org/wiki/Short-time_Fourier_transform

它在实践中效果很好,通过使用 fft 之间的相位差,您甚至可以获得比滚动窗口所期望的更好的分辨率。

这是一篇对音频信号进行音高转换的文章。获得更高频率分辨率的方法很好解释:http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

【讨论】:

【参考方案2】:

我们使用您描述的方法(我们称之为重叠)来确保填充光谱瀑布的所有行。重叠可用于提供与单个样本间隔一样紧密的光谱。

主要缺点是产生所有这些光谱的额外处理。

从积极的方面来说,虽然每个光谱的时间分辨率仍受 FFT 大小的限制,但查看间隔很近的相邻光谱似乎提供了一种视觉插值,我认为它可以让您以更高的精度查看数据.

【讨论】:

【参考方案3】:

执行此操作的一种常见方法是对同一数据使用多个长度的加窗 FFT,较短的 FFT 可实现良好的时间分辨率,较长的 FFT 可实现较低频率的更好频率分辨率。那么可视化的问题就变成了在每个绘图点(例如最高对比度的子块等)中从几个可能的 FFT 结果中挑选出最佳的 FFT 结果,并将它们融合在一起。

大多数现代处理器(在 PC 和手机等中)可以轻松地对音频进行多个长度(数十个)仍然实时的 FFT。

【讨论】:

以上是关于“滚动” FFT 是不是可能,是不是有用?的主要内容,如果未能解决你的问题,请参考以下文章

在div+css为啥写滚动条效果在谷歌浏览器有用,而在火狐没用呢

表格视图在它上面的视图下滚动而不是它

uiwebview 中的滚动条

检测天气用户是不是在反应js和javascript中滚动div的底部

jquery实现无限滚动瀑布流实现原理

为啥我拉滚动条的时候屏幕抖动的厉害,象波浪一样的?