【发布时间】:2011-10-01 00:33:02
【问题描述】:
我必须使用 FFT 来分析音频文件的频率。但我不知道输入和输出是什么。
如果我想绘制频谱的音频文件,是否必须使用一维、二维或三维数组?有人可以建议我使用 J2ME 上的 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]。但是,如果您的数据只是一个音频文件,那么您的输入将只是没有虚部的复数。因此,您将映射 real[N] =>complex[N]。但是,通过一些数学运算,您会看到输出的格式将始终为 output[i]==complex_conjugate(output[N-i])。因此,您实际上只需要查看前 N/2+1 个样本。此外,FFT 的复数输出为您提供有关相位和幅度的信息。如果您关心的只是某个频率在您的音频中有多少,您只需要查看幅度,可以计算为 square_root(imaginary^2+real^2),对于输出的每个元素。
当然,您需要查看您使用的任何库的文档,以了解哪个数组元素对应于第 N 个复数输出的实部,同样要找到第 N 个复数输出的虚部。
【讨论】:
因为我记得 FFT 算法并不复杂,我曾经为我的论文写了一个 FFT 计算类。那时输入是从 *.WAV 文件中读取的一维值数组。但在 FFT 之前,执行了一些滤波和归一化。
【讨论】: