快速傅立叶变换(FFT)输入和输出来分析音频文件的频率



我必须使用FFT来分析音频文件的频率。但是我不知道输入和输出是什么。

如果我想绘制频谱的音频文件,我必须使用一维,二维或三维数组吗?有人能建议我在J2ME上的FFT库吗?

@thongcaoloi,

关于输入数据的维度,简单的答案是:你需要一维数据。现在我来解释一下这是什么意思。

因为你想分析音频数据,你的离散傅立叶变换(DFT或FFT)的输入是一个实数的一维序列,它代表了音频信号随时间变化的电压,而你的音频文件是电压随时间变化的数字表示。

您的音频文件是通过以固定采样率(也称为采样频率)对连续音频信号的电压进行采样而产生的,对于CD质量的音频,通常为44.1 KHz。

但是你的数据文件可以在一个更低的频率上采样,所以在你对数据做FFT之前,试着找出你的数据的采样频率。

所以现在您必须从音频文件中提取单个样本。如果你的文件是立体声的,它将有两个单独的样本序列,一个用于右通道,一个用于左通道。如果文件是单声道的,它将只有一个样本序列。

如果您的文件是立体声,或任何其他多声道音频格式,如5.1或7.1,您可以单独FFT每个声道,或者您可以使用电压加法将任意数量的声道组合在一起。这取决于你,取决于你想用FFT结果做什么。

DFT或FFT的输出是一个复数序列。每个复数都是由实部和虚部组成的一对,通常表示为一对(re,im)。

如果你想绘制音频文件的功率谱密度图,这是大多数人想从FFT中得到的,你将绘制20*log10(sqrt(re^2 + im^2)),使用FFT输出的前N/2个复数,其中N是FFT输入样本的数量。

你可以尝试构建自己的频谱分析仪软件程序,但我建议使用已经构建和测试过的软件。

这两个FFT频谱分析仪可以立即给出结果,并且内置了IFFT合成,这意味着您可以对频域频谱数据进行傅里叶反变换,以在时域中重建原始信号。

http://www.mathworks.com/help/techdoc/ref/fft.html

http://www.sooeet.com/math/fft.php

关于这个主题,以及一般的数字信号处理主题还有很多内容,但这篇简短的介绍应该能让你入门。

在理论意义上,FFT映射complex[N] => complex[N]。但是,如果您的数据只是一个音频文件,那么您的输入将是没有虚分量的简单复数。因此你将映射实[N] =>复[N]。然而,通过一些数学运算,您可以看到输出的格式始终是output[i]==complex_conjugate(output[N-i])。因此,您实际上只需要查看前N/2+1个样本。此外,FFT的复杂输出为您提供了有关相位和幅度的信息。如果你所关心的只是某个频率在音频中的占多少,你只需要看看幅度,它可以计算为输出的每个元素的平方根(虚数^2+实数^2)。

当然,要了解哪个数组元素对应于第n个复数输出的实部,以及找到第n个复数输出的虚部,您需要查看所使用的库的文档。

由于我记得FFT算法并不是那么复杂,所以我曾经在我的论文中写过一个FFT计算类。此时,输入是一个从*. wav文件中读取的值的1D数组。但在FFT之前,进行了一些滤波和归一化。

最新更新