Как настроить буфер при выполнении БПФ с использованием платформы Accelerate?

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

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


person Community    schedule 26.01.2011    source источник
comment
Об этом говорили на одной из сессий WWDC2010 по Accelerate.Framework. Я могу ошибаться, но вероятно об этом есть пример. В любом случае, вы должны посмотреть справочник Accelerate.Framework, там есть очень полезные функции для выполнения того, что вы хотите;)   -  person nacho4d    schedule 26.01.2011
comment
Вы можете посмотреть ответы на этот Вопрос о StackOverflow. Приводится ряд хороших примеров использования платформы Apple Accelerate для создания БПФ звука.   -  person rcw3    schedule 26.01.2011


Ответы (1)


У Apple есть несколько примеров настройки БПФ в их Руководство по программированию 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);
}

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

person Brad Larson    schedule 26.01.2011
comment
Спасибо - это гораздо более простой пример, чем другие, которые я видел (где они в основном сразу после этого выполняют обратное БПФ). Очень полезно, так как я мог видеть, какие минимальные биты мне нужны для моей проблемы! - person Oliver Mason; 01.05.2012
comment
Вы ставите просто показатели амплитуды волн к реальным значениям. Должен ли imagp быть нулевым? Мне непонятно. Почему вы не используете функцию CTOZ? Спасибо - person Sergey Kopanev; 25.12.2012
comment
@SergeyKopanev Он использует сложное преобразование в сложное (а не реальное в сложное). В этом случае вам не нужно упорядочивать реальные данные, так как все они будут храниться в массиве realp файла DSPDoubleSplitComplex. Мнимый массив будет пустым, так как нет мнимых значений. - person DEADBEEF; 30.03.2017