2013-01-02 6 views
0

에 FFT에 대한 가속기 프레임 워크 :설정 내가 읽은 후 나는, 설치에 기능을 가속기를 설정 한 아이폰

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)와 충돌이 내 응용 프로그램 :

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

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

나는 log2n에 대해 좋은 값을 설정하지 않았을까? (1024를 얻으려면 10을 얻으시겠습니까?)

  • 어떻게하면 저장소의 실제 크기를 얻을 수 있습니까? 내 실제 fft? 내가 썼던 것과 똑같은가? 내가 입력 내 데이터 버퍼 배열을

  • (정확히 내 코드에서? 대신 originalReal?)

고마워요.

+1

가능한 [오디오 버퍼에서 가속기 사용] (http://stackoverflow.com/questions/14114682/using-the-accelerator-to-fft-on-audio-buffer) –

답변

0

나는 실제로 그것을 작동 시키려고한다. 내가 그것에 특정 f의 sin 파를 삽입 할 때 나는 그것을 실제로 만든다.

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. 이 일은 중요합니다! 왜냐하면 빈 (bin) [300]과 같은 높은 빈들에서는 44와 43에 대해 완전히 다른 리셋을하기 때문입니다! (그 300 hz 표류). 그러니 그걸 돌봐.