【问题标题】:Setup the accelerator framework for fft on the iPhone在 iPhone 上设置 fft 的加速器框架
【发布时间】:2012-12-16 17:27:00
【问题描述】:

我已经设置了一个功能来设置加速器,在我阅读之后:

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. 我的应用程序在这 2 行之一上总是崩溃且没有错误(BAD ACCESS):

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

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

我想我没有为 log2n 设置一个好的值? (10 得到 1024 窗口?)

  • 如何获得垃圾箱的真实大小?我的实际fft?我在这里写的一样吗?

  • 我在哪里输入我的数据缓冲区数组(在我的代码中的确切位置?而不是 originalReal?)

非常感谢。

【问题讨论】:

标签: objective-c accelerate-framework


【解决方案1】:

当我在其中插入一个特定 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。这东西很关键!因为在更高的垃圾箱中 - 例如 bin[300] 你会得到完全不同的结果 44 和 43 ! (它的 300hz 漂移)。所以请注意这一点。

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 2011-12-16
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2011-05-29
    • 2011-06-23
    相关资源
    最近更新 更多