4

我希望在 OS X 上对线性 PCM 音频文件(可能有多个音频通道)执行 FFT。最好的方法是什么?

一些消息来源表明 Apple 的 Accelerate Framework 正是我所需要的。如果是这样,我应该如何提取并正确准备浮点数据以用于这些 FFT 函数?

4

3 回答 3

7

这大致是您想要做的。填写自己的输入输出函数。

    // Stick new data into inData, a (float*) array
    fetchFreshData(inData); 

    // (You might want to window the signal here... )
    doSomeWindowing(inData);

    // Convert the data into a DSPSplitComplex 
    // Pardon the C++ here. Also, you should pre-allocate this, and NOT
    // make a fresh one each time you do an FFT. 
    mComplexData = new DSPSplitComplex;
    float *realpart = (float *)calloc(mNumFrequencies, sizeof(float));
    float *imagpart = (float *)calloc(mNumFrequencies, sizeof(float));
    mComplexData->realp = realpart;
    mComplexData->imagp = imagpart;

    vDSP_ctoz((DSPComplex *)inData, 2, mComplexData, 1, mNumFrequencies);

    // Calculate the FFT
    // ( I'm assuming here you've already called vDSP_create_fftsetup() )
    vDSP_fft_zrip(mFFTSetup, mComplexData, 1, log2f(mNumFrequencies), FFT_FORWARD);

    // Don't need that frequency
    mComplexData->imagp[0] = 0.0;

    // Scale the data
    float scale = (float) 1.0 / (2 * (float)mSignalLength);
    vDSP_vsmul(mComplexData->realp, 1, &scale, mComplexData->realp, 1, mNumFrequencies);
    vDSP_vsmul(mComplexData->imagp, 1, &scale, mComplexData->imagp, 1, mNumFrequencies);

    // Convert the complex data into something usable
    // spectrumData is also a (float*) of size mNumFrequencies
    vDSP_zvabs(mComplexData, 1, spectrumData, 1, mNumFrequencies);

    // All done!
    doSomethingWithYourSpectrumData(spectrumData);

希望有帮助。

于 2010-10-28T01:57:58.253 回答
3

在对音频数据进行 FFT 时,样本应该进入实部,虚部应该为零。

大多数 FFT 库,包括 Apple 的 vDSP,都包含一种称为“实数 FFT”的方法,其中输入是实数(没有虚部),输出是复数。

于 2009-12-30T08:55:14.863 回答
0

在我看来,您应该研究 Core Audio ......我对它不是很熟悉,但看起来它应该已经为您获得了通道去交织,并且它直接与 PCM 数据一起使用。由于我不太熟悉,所以对此持保留态度,但我会尝试将 FFT 放在音频单元中,将单通道 PCM 数据作为输入,将 FFT 的结果存储在可访问的地方,然后传递输入通过输出。

就实际执行 FFT 而言,对我而言,主要挑战似乎是将 PCM 输入强制转换为 FFT 例程想要操作的双 * 向量。通过查看 vDSP.h(加速框架的一部分),我看到了诸如 vDSP_vflt16D 之类的函数(将 16 位整数向量转换为双精度实数向量),看起来它可以解决您的问题。

核心音频介绍

于 2009-12-27T04:30:40.510 回答