signal-processing - 是否可以使用 "rolling"FFT 并且可以使用它吗?

标签 signal-processing fft processing

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

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

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

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

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

最佳答案

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

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

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

关于signal-processing - 是否可以使用 "rolling"FFT 并且可以使用它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20771080/

相关文章:

java - 将二维数组中的每个元素相除

android - 尝试为 Android 应用程序导出签名包时出现错误 "setTestClassesDir(File) method has been deprecated"

c++ - FFT平滑器如何在c++/openframeworks中工作?

python - Numpy fft 卡住更长的样本

matlab - 频域和空间域的汉明滤波器

c++ - 端口音频导致 50% 的测试发出响亮的嗡嗡声

c++ - OpenCV 中的逆傅里叶变换

android - AudioFormat 在 android.media.AudioFormat 中不公开

python - 使用 python 和 FFT 计算均方位移

java - "Exception in thread "Animation Thread”在Eclipse中使用Processing时出错