【问题标题】:Performing FFT on PCM file to generate a spectrogram对 PCM 文件执行 FFT 以生成频谱图
【发布时间】:2013-12-17 14:24:48
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c fft audio-processing


    【解决方案1】:

    “Apple Accelerate 框架”很好,我在一个项目中使用过。只需仔细阅读文档。基本上,您需要将 PCM 数据读入内存并可能修改格式,然后对其调用 FFT。

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

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

    Mike Ash 的 Friday Q&A 网站写得很好。

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

    【讨论】:

    • 记忆?你是说电子记忆吗?
    • 是的,我已经阅读了 FFT。复杂的主题。我读过 Mike Ash 的网站。您知道我可以查看的任何实现此功能的示例吗?
    • 我快速浏览了一下,似乎已经没有我写的代码了。它是采样图像而不是声音,因此不能直接适用。
    • 不,我没有听说过 CocoaHeads
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2019-05-20
    相关资源
    最近更新 更多