Как настроить буфер при выполнении FFT с использованием инфраструктуры ускорения? - PullRequest
5 голосов
/ 26 января 2011

Я использую инфраструктуру Accelerate для выполнения быстрого преобразования Фурье (FFT) и пытаюсь найти способ создать буфер для использования с ним длиной 1024. У меня есть доступ к среднему пику и пик сигнала, по которому я хочу сделать БПФ.

Может ли кто-нибудь мне помочь или дать несколько советов для этого?

1 Ответ

11 голосов
/ 26 января 2011

У Apple есть несколько примеров того, как настроить FFT в их vDSP Руководство по программированию .Вам также следует проверить пример приложения vDSP .В то время как для Mac этот код также должен быть переведен непосредственно на iOS.

Недавно мне нужно было сделать простое БПФ из 64-разрядного входного сигнала, для которого я использовал следующий код:

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

Как видите, я использовал реальные значения в этом БПФ только для настройки входных буферов, выполнил БПФ, а затем считал величины.

...