使用Accelerate框架进行FFT时如何设置缓冲区?

时间:2011-01-26 11:37:40

标签: iphone cocoa fft accelerate-framework

我正在使用Accelerate框架执行快速傅立叶变换(FFT),并且我正在尝试找到一种方法来创建一个缓冲区,以便与长度为1024的缓冲区一起使用。我可以访问平均峰值和我想要进行FFT的信号的峰值。

有人可以帮助我或给我一些提示吗?

1 个答案:

答案 0 :(得分:11)

Apple提供了一些如何在vDSP Programming Guide中设置FFT的示例。您还应该查看vDSP Examples示例应用程序。对于Mac,此代码也应直接转换为iOS。

我最近需要对64整数输入波形进行简单的FFT,为此我使用了以下代码:

static FFTSetupD fft_weights;
static DSPDoubleSplitComplex input;
static double *magnitudes;

+ (void)initialize
{
    /* Setup weights (twiddle factors) */
    fft_weights = vDSP_create_fftsetupD(6, kFFTRadix2);

    /* Allocate memory to store split-complex input and output data */
    input.realp = (double *)malloc(64 * sizeof(double));
    input.imagp = (double *)malloc(64 * sizeof(double));
    magnitudes = (double *)malloc(64 * sizeof(double));
}

- (CGFloat)performAcceleratedFastFourierTransformAndReturnMaximumAmplitudeForArray:(NSUInteger *)waveformArray;
{   
    for (NSUInteger currentInputSampleIndex = 0; currentInputSampleIndex < 64; currentInputSampleIndex++)
    {
        input.realp[currentInputSampleIndex] = (double)waveformArray[currentInputSampleIndex];
        input.imagp[currentInputSampleIndex] = 0.0f;
    }

    /* 1D in-place complex FFT */
    vDSP_fft_zipD(fft_weights, &input, 1, 6, FFT_FORWARD);  

    input.realp[0] = 0.0;
    input.imagp[0] = 0.0;

    // Get magnitudes
    vDSP_zvmagsD(&input, 1, magnitudes, 1, 64);

    // Extract the maximum value and its index
    double fftMax = 0.0;
    vDSP_maxmgvD(magnitudes, 1, &fftMax, 64);

    return sqrt(fftMax);
}

如您所见,我只使用此FFT中的实数值来设置输入缓冲区,执行FFT,然后读出幅度。