配置AudioUnit以将打包数据保存为float.
我创建一个循环缓冲区,当这个缓冲区满了我计算一个fft.
我有结果,但我不明白为什么fft输出不好(参见图)
AudioUnit配置:
// describe formatAudioStreamBasicDescription audioFormat;audioFormat.mSampleRate = 44100;audioFormat.mFormatID = kAudioFormatlinearPCM;audioFormat.mFormatFlags = kAudioFormatFlagsNativeEndian|kAudioFormatFlagIsPacked|kAudioFormatFlagIsfloat|kAudioFormatFlagIsNonInterleaved;audioFormat.mFramesPerPacket = 1;audioFormat.mChannelsPerFrame = 1; // monoaudioFormat.mBitsPerChannel = sizeof(float) * 8;audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(float);audioFormat.mBytesPerPacket = audioFormat.mFramesPerPacket * audioFormat.mBytesPerFrame;
循环缓冲区:
_audioSample = new AudioSample(8192,44100);// in recording callback :for(int i = 0; i < bufferList.mNumberBuffers; ++i){ if(!status) { if(_sample->needData()) _sample->put((float*)bufferList.mBuffers[i].mData,bufferList.mBuffers[i].mDataByteSize); [...] }}
vDSP电话:
// get a split complex vector (real signal divIDed into an even-odd config vDSP_ctoz((COMPLEX *)sample.get(),2,&_complex,1,_fftsize); vDSP_fft_zrip(_fftsetup,_log2n,kFFTDirection_Forward); // scale (from vDSP reference) float scale = 1.0 / (2.0 * _samples); vDSP_vsmul(_complex.realp,&scale,_complex.realp,_fftsize); vDSP_vsmul(_complex.imagp,_complex.imagp,_fftsize); _complex.imagp[0] = 0.0;
其中_fftsize = _audioSample.capacity()/ 2
解决方法 你的输出看起来很合理,所以我将把你的问题解释为“如何清理这些结果?”1)你可能正在使用矩形窗口
这意味着你没有做任何windowing,这会在你的结果中引入一些噪音. vDSP附带了一些执行窗口的功能,您可以像这样使用:
// N = number of samples in your bufferint N = _audioSample.capacity();// allocate space for a hamming windowfloat * hammingWindow = (float *) malloc(sizeof(float) * N);// generate the window values and store them in the hamming window buffervDSP_hamm_window(hammingWindow,N,0);
然后,无论何时您要进行FFT,都要先将样品放样(例如,在vDSP_ctoz调用之前执行此 *** 作):
vDSP_vmul(sample.get(),hammingWindow,sample.get(),N);
2)您可能希望对结果运行幅度函数
这将为您提供类似于您在标准FFT条形图音乐可视化器中看到的结果.在FFT之后执行此 *** 作:
vDSP_zvmags(&_complex,&_complex.realp,_fftsize);
之后,_complex.realp将是一个浮点值数组,表示每个FFT bin的大小.
总结以上是内存溢出为你收集整理的ios – 具有浮动缓冲器AudioUnit的FFT输出全部内容,希望文章能够帮你解决ios – 具有浮动缓冲器AudioUnit的FFT输出所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)