Setup the accelerator framework for fft on the iPhone

匿名 (未验证) 提交于 2019-12-03 10:24:21

问题:

I have set a function to setup the accelerator, after i have read :

Using the Apple FFT and Accelerate Framework

iPhone FFT with Accelerate framework vDSP

and apple docs.

i did this :

void fftSetup() {      COMPLEX_SPLIT   A;     FFTSetup        setupReal;     uint32_t        log2n;     uint32_t        n, nOver2;     int32_t         stride;     uint32_t        i;     float          *originalReal, *obtainedReal;     float           scale;     uint32_t L = 1024;     float *mag = new float[L/2];        log2n = 10 ;      n = 1 << log2n;      stride = 1;      nOver2 = n / 2;      printf("1D real FFT of length log2 ( %d ) = %d\n\n", n, log2n);      for (i = 0; i < n; i++)         originalReal[i] = (float) (i + 1);       vDSP_ctoz((COMPLEX *) originalReal,2,&A,1,nOver2);      A.realp = (float *) malloc(nOver2 * sizeof(float));     A.imagp = (float *) malloc(nOver2 * sizeof(float));      setupReal = vDSP_create_fftsetup(log2n, FFT_RADIX2);      vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_FORWARD);     vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_INVERSE);         //get magnitude;     for(i = 1; i < L/2; i++){         mag[i] = sqrtf(A.realp[i]*A.realp[i] + A.imagp[i] * A.imagp[i]);     }          scale = (float) 1.0 / (2 * n);     vDSP_vsmul(A.realp, 1, &scale, A.realp, 1, nOver2);     vDSP_vsmul(A.imagp, 1, &scale, A.imagp, 1, nOver2);   } 

questions :

  1. my app is always crash with no error(BAD ACCESS) on one of this 2 lines :

originalReal[i] = (float) (i + 1); // or

vDSP_ctoz((COMPLEX *) originalReal,2,&A,1,nOver2);

i guess i did not set a good value for log2n ? (10 to get 1024 window ? )

  • how do i get the real magnitude of the bins? my actual fft? the same i wrote here ?

  • where do i input MY data buffer array (exactly where in my code ? instead originalReal?)

thanks a lot.

回答1:

I actually manage to make it work ,when i insert into it a sin wave of a certain f.

This is the code :

   COMPLEX_SPLIT   A;     FFTSetup        setupReal;     uint32_t        log2n;     uint32_t        n, nOver2;     int32_t         stride;     uint32_t        i;     float          *originalReal, *obtainedReal;     float           scale;     uint32_t L = 1024;     float *mag = new float[L/2];        log2n = 10 ;      n = 1 << log2n;      stride = 1;      nOver2 = n / 2;      //printf("1D real FFT of length log2 ( %d ) = %d\n\n", n, log2n);      A.realp = (float *) malloc(nOver2 * sizeof(float));     A.imagp = (float *) malloc(nOver2 * sizeof(float));     originalReal = (float *) malloc(n * sizeof(float));     obtainedReal = (float *) malloc(n * sizeof(float));       for (i = 0; i < n; i++)          originalReal[i] = cos(2*3.141592*11000*i/44100);//(float) (i + 1);       vDSP_ctoz((COMPLEX *) originalReal,2,&A,1,nOver2);        setupReal = vDSP_create_fftsetup(log2n, FFT_RADIX2);      vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_FORWARD);     //vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_INVERSE);      scale = (float) 1.0 / (2 * n);     vDSP_vsmul(A.realp, 1, &scale, A.realp, 1, nOver2);     vDSP_vsmul(A.imagp, 1, &scale, A.imagp, 1, nOver2);       //get magnitude;     for(i = 1; i < L/2; i++)     {         mag[i] = sqrtf(A.realp[i]*A.realp[i] + A.imagp[i] * A.imagp[i]);            NSLog(@"%d:%f",i,mag[i]);     } 

Actually its not 44hz between bins,as the guy wrote in the post above! but 43 ! 22050/512=43 . this thing is critical ! because in the higher bins- such as bin[300] you get a completely different resault for 44 and 43 ! (its 300hz drift). so take care of that .



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!