2013-01-02 21 views
0

加速器框架我已經設置設置功能加速,我看了之後:設置爲FFT在iPhone

Using the Apple FFT and Accelerate Framework

iPhone FFT with Accelerate framework vDSP

和蘋果文檔。

我這樣做:

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); 


} 

問題:

  1. 我的應用程序沒有錯誤(BAD ACCESS)這個2線之一總是崩潰:

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

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

我想我沒有爲log2n設置好的值? (10獲得1024窗口?)

  • 我怎麼得到真正的箱子的大小?我的實際fft?我寫在這裏的是一樣的嗎?

  • 我在哪裏輸入我的數據緩存陣列(正是在我的代碼?而不是originalReal?)

非常感謝。

+1

[在音頻緩衝區中使用加速器對FFT進行快速複製](http://stackoverflow.com/questions/14114682/using-the-accelerator-to-fft-on-audio-buffer) –

回答

0

我實際上設法使它工作,當我插入它的某個f的正弦波。

這是代碼:

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]); 
    } 

其實它不是窗口之間44hz,因爲那傢伙在上面的帖子中寫道!但43! 22050/512 = 43。這件事很關鍵!因爲在更高的箱子裏 - 比如箱子[300],你會得到完全不同的44和43的保護! (其300hz漂移)。所以照顧一下。