ios - 对 PCM 文件执行 FFT 以生成频谱图

标签 ios objective-c fft audio-processing

我正在编写一个可视化音乐的应用程序。到目前为止,我已经将 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/

相关文章:

ios - 为什么身份验证不适用于我的 ASP.NET REST API?

c++ - 使用 FFT 计算两个信号之间的相关性

ios - iPhone 11 Simulator 中的主页 View 背景颜色未全屏显示

ios - 使用BLE RSSI值进行邻近连接

objective-c - 预定功能

objective-c - 在 NSWindow 中呈现不同 NSViewController 的正确方法

fft - 如何表示 FFT 的立体声音频数据

c++ - 在 O(nlogn) 中查找数组中的所有差异,其中 n 是元素的最大范围

ios - 如何获得 native (硬件支持的)音频采样率以避免内部采样率转换?

javascript - SoundCloud 如何在他们的移动网站上自动播放下一首歌曲?