在PCM文件上执行FFT以生成频谱图

时间:2013-12-01 23:58:41

标签: ios objective-c fft audio-processing

我正在编写一个可视化音乐的应用程序。到目前为止,我有一个来自ipod库的音频文件转换为PCM并放在APPs目录中。现在我试图在该PCM文件上执行FFT,以便随时间给出频率和db。以下是我发现的使用Apple Accelerate框架执行FFT的代码:

int bufferFrames = 1024;
int bufferlog2 = round(log2(bufferFrames));
FFTSetup fftSetup = vDSP_create_fftsetup(bufferlog2, kFFTRadix2);
float outReal[bufferFrames / 2];
float outImaginary[bufferFrames / 2];
COMPLEX_SPLIT out = { .realp = outReal, .imagp = outImaginary };
vDSP_ctoz((COMPLEX *)data, 2, &out, 1, bufferFrames / 2);
vDSP_fft_zrip(fftSetup, &out, 1, bufferlog2, FFT_FORWARD);

现在我不明白如何提供这个PCM文件。 'data'我相信是一个COMPLEX对象数组,它保存了FFT应用的音频部分。如何从PCM文件构建这样的数据结构?

我发现了一些可能有用的Java代码,但不知道如何将其转换为C.还有audioData,我如何从PCM文件中填充它:

Complex[] complexData = new Complex[audioData.length];
for (int i = 0; i < complexData.length; i++) {
    complextData[i] = new Complex(audioData[i], 0);
}

1 个答案:

答案 0 :(得分:1)

“Apple Accelerate框架”很好,我在项目中使用过它。请仔细阅读文档。基本上你需要将PCM数据读入内存并按下格式,然后在其上调用FFT。

通过PCM数据按摩数据循环,逐个样本并根据需要复制到另一个数组。

文档为here,您需要vDFT_fft *函数。

Mike Ash有一个很好的写作Friday Q&A网站。

音频数据是定期拍摄音频的电压样本的结果。形式有许多不同的形式。如果您打算使用它,您将不得不花一些时间学习基础知识。此外,如果您要对音频数据运行FFT,您需要了解采样频率和“混叠”,有时称为“折叠”。