向我解释FFT

use*_*879 15 audio signals fft frequency

我想获取音频PCM数据并在其中找到峰值.具体来说,我想返回峰值出现的频率和时间.

我对此的理解是我必须将PCM数据转储到一个数组中,将其设置为实数值,将复杂的部分设置为0.然后我接受FFT,然后得到一个数组.如果数组中的每个数字都是一个幅度值,我如何获得与每个数字相关的频率?另外,我是否考虑了真实和复杂部分的大小或者只是丢弃了复杂的值?

最后,如果我想在一首歌中找到峰值,我是否只需设置一个小窗口进行FFT并将其滑过所有音频?有关该窗口应该有多大的任何建议?

Han*_*Han 15

如果PCM数据的采样率为F,则FFT中的最高频率分量为F/2.假设您的PCM数据以44100Hz采样,那么您的FFT值将从0Hz(DC)运行到22050Hz.如果从N个样本开始(N是2的幂),则FFT可以返回表示从0到F/2的所有正频率的N/2个值,或者它可以返回N个值,这些值也包括来自的负频率 - F/2到0.您应该检查FFT算法的规范,以找出每个数组项映射到的频率.

要查找峰值,您需要查看FFT值的大小.因此,您需要添加每个复数值的平方实部和虚部.

假设您的N个PCM样本的FFT返回表示正频率的N/2个复数值.然后,2个复合样本之间的距离为F/2N Hz.当F = 44100Hz且N = 1024个样本时,这将是21.5Hz.这是您的频率分辨率.如果您需要找到较低频率的节拍,则需要扩展FFT窗口.


tom*_*m10 3

您实际上可能正在寻找频谱图,它基本上是沿时间轴滑动的小窗口中的数据的 FFT。如果您有实现此功能的软件,它可能会节省您一些精力。它通常用于分析随时间变化的声学信号,并且是一种非常有用的观察声音的方法。此外,还有一些技巧,例如,对于 FFT 的加窗数据,频谱图可能会正确,但对您来说更难(尽管不是很难)正确完成。