使用APPLE FFT与加速框架

使用APPLE FFT与加速框架

有人用过Apple FFT对于iPhone应用程序,或者知道在哪里可以找到如何使用它的示例应用程序?我知道Apple发布了一些示例代码,但我不太确定如何将其实现到实际项目中。



慕容708150
浏览 565回答 3
3回答

墨色风雨

下面是一个真实的例子:c+的一个片段,它使用ABER的vDSPFFT例程对远程IO音频单元的输入进行自相关。使用这个框架相当复杂,但文档不是也是坏的。OSStatus&nbsp;DSPCore::initialize&nbsp;(double&nbsp;_sampleRate,&nbsp;uint16_t&nbsp;_bufferSize)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;sampleRate&nbsp;=&nbsp;_sampleRate; &nbsp;&nbsp;&nbsp;&nbsp;bufferSize&nbsp;=&nbsp;_bufferSize; &nbsp;&nbsp;&nbsp;&nbsp;peakIndex&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;frequency&nbsp;=&nbsp;0.f; &nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;maxFrames&nbsp;=&nbsp;getMaxFramesPerSlice(); &nbsp;&nbsp;&nbsp;&nbsp;displayData&nbsp;=&nbsp;(float*)malloc(maxFrames*sizeof(float)); &nbsp;&nbsp;&nbsp;&nbsp;bzero(displayData,&nbsp;maxFrames*sizeof(float)); &nbsp;&nbsp;&nbsp;&nbsp;log2n&nbsp;=&nbsp;log2f(maxFrames); &nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=&nbsp;1&nbsp;<<&nbsp;log2n; &nbsp;&nbsp;&nbsp;&nbsp;assert(n&nbsp;==&nbsp;maxFrames); &nbsp;&nbsp;&nbsp;&nbsp;nOver2&nbsp;=&nbsp;maxFrames/2; &nbsp;&nbsp;&nbsp;&nbsp;A.realp&nbsp;=&nbsp;(float*)malloc(nOver2&nbsp;*&nbsp;sizeof(float)); &nbsp;&nbsp;&nbsp;&nbsp;A.imagp&nbsp;=&nbsp;(float*)malloc(nOver2&nbsp;*&nbsp;sizeof(float)); &nbsp;&nbsp;&nbsp;&nbsp;FFTSetup&nbsp;fftSetup&nbsp;=&nbsp;vDSP_create_fftsetup(log2n,&nbsp;FFT_RADIX2); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;noErr;}void&nbsp;DSPCore::Render(uint32_t&nbsp;numFrames,&nbsp;AudioBufferList&nbsp;*ioData)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;bufferSize&nbsp;=&nbsp;numFrames; &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;ln&nbsp;=&nbsp;log2f(numFrames); &nbsp;&nbsp;&nbsp;&nbsp;//vDSP&nbsp;autocorrelation &nbsp;&nbsp;&nbsp;&nbsp;//convert&nbsp;real&nbsp;input&nbsp;to&nbsp;even-odd &nbsp;&nbsp;&nbsp;&nbsp;vDSP_ctoz((COMPLEX*)ioData->mBuffers[0].mData,&nbsp;2,&nbsp;&A,&nbsp;1,&nbsp;numFrames/2); &nbsp;&nbsp;&nbsp;&nbsp;memset(ioData->mBuffers[0].mData,&nbsp;0,&nbsp;ioData->mBuffers[0].mDataByteSize); &nbsp;&nbsp;&nbsp;&nbsp;//fft &nbsp;&nbsp;&nbsp;&nbsp;vDSP_fft_zrip(fftSetup,&nbsp;&A,&nbsp;1,&nbsp;ln,&nbsp;FFT_FORWARD); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Absolute&nbsp;square&nbsp;(equivalent&nbsp;to&nbsp;mag^2) &nbsp;&nbsp;&nbsp;&nbsp;vDSP_zvmags(&A,&nbsp;1,&nbsp;A.realp,&nbsp;1,&nbsp;numFrames/2); &nbsp;&nbsp;&nbsp;&nbsp;bzero(A.imagp,&nbsp;(numFrames/2)&nbsp;*&nbsp;sizeof(float));&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Inverse&nbsp;FFT &nbsp;&nbsp;&nbsp;&nbsp;vDSP_fft_zrip(fftSetup,&nbsp;&A,&nbsp;1,&nbsp;ln,&nbsp;FFT_INVERSE); &nbsp;&nbsp;&nbsp;&nbsp;//convert&nbsp;complex&nbsp;split&nbsp;to&nbsp;real &nbsp;&nbsp;&nbsp;&nbsp;vDSP_ztoc(&A,&nbsp;1,&nbsp;(COMPLEX*)displayData,&nbsp;2,&nbsp;numFrames/2); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Normalize &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;scale&nbsp;=&nbsp;1.f/displayData[0]; &nbsp;&nbsp;&nbsp;&nbsp;vDSP_vsmul(displayData,&nbsp;1,&nbsp;&scale,&nbsp;displayData,&nbsp;1,&nbsp;numFrames); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Naive&nbsp;peak-pick:&nbsp;find&nbsp;the&nbsp;first&nbsp;local&nbsp;maximum &nbsp;&nbsp;&nbsp;&nbsp;peakIndex&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(size_t&nbsp;ii=1;&nbsp;ii&nbsp;<&nbsp;numFrames-1;&nbsp;++ii)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((displayData[ii]&nbsp;>&nbsp;displayData[ii-1])&nbsp;&&&nbsp;(displayData[ii]&nbsp;>&nbsp;displayData[ii+1]))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peakIndex&nbsp;=&nbsp;ii; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Calculate&nbsp;frequency &nbsp;&nbsp;&nbsp;&nbsp;frequency&nbsp;=&nbsp;sampleRate&nbsp;/&nbsp;peakIndex&nbsp;+&nbsp;quadInterpolate(&displayData[peakIndex-1]); &nbsp;&nbsp;&nbsp;&nbsp;bufferSize&nbsp;=&nbsp;numFrames; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;ii=0;&nbsp;ii<ioData->mNumberBuffers;&nbsp;++ii)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bzero(ioData->mBuffers[ii].mData,&nbsp;ioData->mBuffers[ii].mDataByteSize); &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP