iOS FFT Accerelate.framework在播放过程中绘制谱图

前端之家收集整理的这篇文章主要介绍了iOS FFT Accerelate.framework在播放过程中绘制谱图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
UPDATE 2016-03-15

请看这个项目:https://github.com/ooper-shlab/aurioTouch2.0-Swift.它已经移植到Swift,并包含你要找的所有答案,如果你在这里凸轮.

我做了大量的研究,并学到了很多关于FFT和加速框架.但经过几天的实验,我感到很沮丧.

我想在图中播放时显示音频文件的频谱.对于每个时间间隔,应在X轴上通过FFT计算的每个频率(在我的情况下为512个值)中显示Y轴上的数值(以红色条显示).

输出应如下所示:

我填写一个1024个样本的缓冲区,仅提取左侧通道开始.然后我做所有这些FFT的东西.

这是我的代码到目前为止

设置一些变量

  1. - (void)setupVars
  2. {
  3. maxSamples = 1024;
  4.  
  5. log2n = log2f(maxSamples);
  6. n = 1 << log2n;
  7.  
  8. stride = 1;
  9. nOver2 = maxSamples/2;
  10.  
  11. A.realp = (float *) malloc(nOver2 * sizeof(float));
  12. A.imagp = (float *) malloc(nOver2 * sizeof(float));
  13. memset(A.imagp,nOver2 * sizeof(float));
  14.  
  15. obtainedReal = (float *) malloc(n * sizeof(float));
  16. originalReal = (float *) malloc(n * sizeof(float));
  17.  
  18. setupReal = vDSP_create_fftsetup(log2n,FFT_RADIX2);
  19. }

进行FFT. FrequencyArray只是一个包含512个浮点值的数据结构.

  1. - (FrequencyArry)performFastFourierTransformForSampleData:(SInt16*)sampleData andSampleRate:(UInt16)sampleRate
  2. {
  3. NSLog(@"log2n %i n %i,nOver2 %i",log2n,n,nOver2);
  4.  
  5. // n = 1024
  6. // log2n 10
  7. // nOver2 = 512
  8.  
  9. for (int i = 0; i < n; i++) {
  10. originalReal[i] = (float) sampleData[i];
  11. }
  12.  
  13. vDSP_ctoz((COMPLEX *) originalReal,2,&A,1,nOver2);
  14.  
  15. vDSP_fft_zrip(setupReal,stride,FFT_FORWARD);
  16.  
  17. float scale = (float) 1.0 / (2 * n);
  18.  
  19. vDSP_vsmul(A.realp,&scale,A.realp,nOver2);
  20. vDSP_vsmul(A.imagp,A.imagp,nOver2);
  21.  
  22. vDSP_ztoc(&A,(COMPLEX *) obtainedReal,nOver2);
  23.  
  24. FrequencyArry frequencyArray;
  25.  
  26. for (int i = 0; i < nOver2; i++) {
  27. frequencyArray.frequency[i] = log10f(obtainedReal[i]); // Magnitude in db???
  28. }
  29.  
  30. return frequencyArray;
  31. }

输出看起来总是有点奇怪,虽然它有些似乎根据音乐移动.

我很高兴我来到这么远,感谢一些非常好的帖子,像这样:
Using the apple FFT and accelerate Framework

但现在我不知道该怎么办我失踪了什么

解决方法

首先,在FFT之前您不应用 window function,这将导致 spectral leakage发生频谱的拖延.

其次,您正在使用FFT输出槽的实际分量来计算dB幅度 – 您需要使用复数幅度:

  1. magnitude_dB = 10 * log10(re * re + im * im);

猜你在找的iOS相关文章