OS X 环境中的音频文件 FFT
Posted
技术标签:
【中文标题】OS X 环境中的音频文件 FFT【英文标题】:Audio File FFT in an OS X environment 【发布时间】:2009-12-27 02:11:17 【问题描述】:我希望在 OS X 上对线性 PCM 音频文件(可能有多个音频通道)执行 FFT。最好的方法是什么?
多个消息来源表明我需要 Apple 的 Accelerate Framework。如果是这样,我应该如何提取和正确准备浮点数据以用于这些 FFT 函数?
【问题讨论】:
【参考方案1】:这大致就是您想要做的事情。填写自己的输入输出函数。
// 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);
希望对您有所帮助。
【讨论】:
什么是inData,你能解释一下【参考方案2】:对音频数据进行 FFT 时,样本应进入实部,虚部应为零。
大多数 FFT 库,包括 Apple 的 vDSP,都包含一种称为“实数 FFT”的方法,其中输入是实数(没有虚部),输出是复数。
【讨论】:
【参考方案3】:在我看来,您应该研究 Core Audio... 我对它不是很熟悉,但看起来它应该已经为您提供了通道解交织,并且它直接与 PCM 数据一起使用。由于我不太熟悉,所以对此持保留态度,但我会尝试将 FFT 放在音频单元中,将单通道 PCM 数据作为输入,将 FFT 的结果存储在可访问的地方,然后传递输入通过输出。
就实际执行 FFT 而言,对我而言,主要挑战似乎是将 PCM 输入强制转换为 FFT 例程想要操作的双 * 向量。通过 vDSP.h(加速框架的一部分),我看到了像 vDSP_vflt16D(将 16 位整数向量转换为双精度实数向量)之类的函数,这看起来可以解决您的问题。
Core Audio Introduction
【讨论】:
vDSP_vflt16 确实可以将这些 16 位整数转换为 32 位浮点数,但恐怕这还不够。我需要将这些值转换为 32 位浮点复数。以上是关于OS X 环境中的音频文件 FFT的主要内容,如果未能解决你的问题,请参考以下文章