最近我一直在尝试使用音频和FFT,特别是Processing中的Minim库(基本上是Java,而不是它对这个问题特别重要)。我所了解的是,使用缓冲区/样本大小N和采样率K,在执行正向FFT之后,我将获得N个频率区间(仅N / 2个可用数据,实际上Minim仅返回N / 2个区间)线性间隔表示从0到K / 2HZ的光谱。
使用Minim(以及其他典型的FFT实现),您等待收集N个样本,然后执行正向变换,然后再等待N个样本,依此类推。为了获得合理的帧速率(用于音频可视化,节拍检测等),我必须使用相对于采样频率的小样本量。
然而,问题在于,当我计算对数间隔平均值时,小样本量导致频谱低端的分辨率非常低(因为低音八度音程比高音调八度音程窄得多)。
我想知道一种可能的方法来挤出更明显的分辨率,是否会比比我目前使用的稍大一些样本大小的每N个样本更频繁地执行FFT。 (I.E.,输入缓冲区大小为2048,每100个样本,将这些样本添加到输入缓冲区并删除最旧的100个样本,并执行FFT)。看起来这可能会产生滚动平均类型的影响(我可以忍受),但我不太确定。
这种方法的优点和缺点是什么?还有其他方法可以提高我的表观分辨率,同时还能够进行实时可视化和分析吗?
答案 0 :(得分:6)
这种方法的名称是短时傅里叶变换。您可以在维基百科上获得所有问题的答案:https://en.wikipedia.org/wiki/Short-time_Fourier_transform
它在实践中效果很好,你甚至可以通过使用fft之间的相位差来获得更好的分辨率。与滚动窗口的预期相比。
这是一篇做音频信号音高变换的文章。解释如何获得更高频率分辨率的方法:http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/
答案 1 :(得分:0)
我们使用您描述的方法,我们称之为重叠,以确保填充光谱瀑布的所有行。重叠可用于提供与单个采样间隔紧密间隔的光谱。
主要缺点是产生所有光谱的额外处理。
从积极的方面来说,虽然每个光谱的时间分辨率仍然受到FFT大小的限制,但是观察间隔很近的相邻光谱似乎提供了一种视觉插值,我认为,它可以让您以更高的精度看到数据
答案 2 :(得分:0)
这种方法的一种常见方法是在相同数据上使用多个窗口FFT,使用短FFT以获得良好的时间分辨率,使用更长的FFT以获得更低频率的更好频率分辨率。然后,可视化的问题变得从每个绘图点(例如最高对比度子块等)中的几个可能的最佳FFT结果中挑选出来并且将它们混合得很有吸引力。
大多数现代处理器(在个人电脑和手机等)都可以轻松实现多个长度(数十个)的FFT实时音频。