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

时间:2011-07-08 06:10:56

标签: java audio java-me fft

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

如果我想绘制光谱的音频文件,是否必须使用1维,2维或3维数组?有人可以建议我在J2ME上使用FFT库吗?

3 个答案:

答案 0 :(得分:28)

@thongcaoloi,

关于输入数据维度的简单答案是:您需要1D数据。现在我将解释这意味着什么。

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

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

但您的数据文件可能会以更低的频率进行采样,因此在对该数据进行FFT之前,请尝试找出数据的采样频率。

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

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

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

如果你想要绘制音频文件的功率谱密度,这是大多数人想要的FFT,你将使用第一个图表20 * log10(sq ^(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

这个主题还有很多内容,对于一般的数字信号处理主题,但是这个简短的介绍,应该可以帮助你开始。

答案 1 :(得分:3)

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

当然,您需要查看您使用的任何库的文档,以了解哪个数组元素对应于第N个复数输出的实部,并同样找到第N个复数输出的虚部。 / p>

答案 2 :(得分:1)

我记得FFT算法并不复杂,我曾经为我的论文写了一类FFT计算。此时输入是从* .WAV文件读取的一维值数组。但在FFT之前,有一些过滤和规范化。