我正在编写一个可视化音乐的应用程序。到目前为止,我已经将 ipod 库中的音频文件转换为 PCM 并放置在 APPs 目录中。现在,我正在尝试对该 PCM 文件执行 FFT,以提供随时间变化的频率和分贝。这是我发现的使用 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 文件。 “数据”我认为是一组复杂的对象,其中包含将应用 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);
}
最佳答案
“Apple Accelerate framework”不错,我在一个项目上用过。请仔细阅读文档。基本上,您需要将 PCM 数据读入内存并可能修改格式,然后对其调用 FFT。
要通过 PCM 数据循环处理数据,逐个采样并根据需要复制到另一个阵列。
文档是 here ,您需要 vDFT_fft* 函数。
Mike Ash 的文章很好 Friday Q&A网站。
音频数据是定期对音频进行电压采样的结果。形式有许多不同的形式。如果您要使用它,您将不得不花一些时间学习基础知识。此外,如果您要对音频数据运行 FFT,则需要了解采样频率和“混叠”(有时称为“折回”)。
关于ios - 对 PCM 文件执行 FFT 以生成频谱图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20318800/