我有一个应用程序,它从 iPod 库中选择一首歌曲,然后将该歌曲作为“.caf”文件复制到应用程序的目录中。我现在需要播放并同时从 Accelerate 框架将该文件读入 Apples FFT,这样我就可以像频谱图一样可视化数据。这是 FFT 的代码:
void FFTAccelerate::doFFTReal(float samples[], float amp[], int numSamples)
{
int i;
vDSP_Length log2n = log2f(numSamples);
//Convert float array of reals samples to COMPLEX_SPLIT array A
vDSP_ctoz((COMPLEX*)samples,2,&A,1,numSamples/2);
//Perform FFT using fftSetup and A
//Results are returned in A
vDSP_fft_zrip(fftSetup, &A, 1, log2n, FFT_FORWARD);
//Convert COMPLEX_SPLIT A result to float array to be returned
amp[0] = A.realp[0]/(numSamples*2);
for(i=1;i<numSamples;i++)
amp[i]=sqrt(A.realp[i]*A.realp[i]+A.imagp[i]*A.imagp[i])/numSamples;
}
//Constructor
FFTAccelerate::FFTAccelerate (int numSamples)
{
vDSP_Length log2n = log2f(numSamples);
fftSetup = vDSP_create_fftsetup(log2n, FFT_RADIX2);
int nOver2 = numSamples/2;
A.realp = (float *) malloc(nOver2*sizeof(float));
A.imagp = (float *) malloc(nOver2*sizeof(float));
}
我的问题是如何在播放歌曲的同时循环播放“.caf”音频文件以提供 FFT?我只需要一个频道。我猜我需要获取歌曲的 1024 个样本,在 FTT 中对其进行处理,然后进一步向下移动文件并获取另外 1024 个样本。但我不明白如何读取音频文件来做到这一点。该文件的采样率为 44100.0 hz,采用线性 PCM 格式,16 位,我相信如果有帮助的话,它也是交错的......