ios – 具有浮动缓冲器AudioUnit的FFT输出

ios – 具有浮动缓冲器AudioUnit的FFT输出,第1张

概述我有vDSP_zrip&的问题AudioUnit的使用和配置.其实我 配置AudioUnit以将打包数据保存为float. 我创建一个循环缓冲区,当这个缓冲区满了我计算一个fft. 我有结果,但我不明白为什么fft输出不好(参见图) AudioUnit配置: // describe formatAudioStreamBasicDescription audioFormat;audioForma 我有vDSP_zrip&的问题AudioUnit的使用和配置.其实我
配置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输出所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1078306.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存