Реализация алгоритма Герцеля на C

Я реализую систему связи со скачкообразной перестройкой частоты BFSK на процессоре DSP. Некоторые участники форума предложили использовать алгоритм Герцеля для демодуляции скачкообразной перестройки частоты на определенных частотах. Я попытался реализовать алгоритм Герцеля на C. Код выглядит следующим образом:

float goertzel(int numSamples,int TARGET_FREQUENCY,int SAMPLING_RATE, float* data)
{
    int     k,i;
    float   floatnumSamples;
    float   omega,sine,cosine,coeff,q0,q1,q2,result,real,imag;

    floatnumSamples = (float) numSamples;
    k = (int) (0.5 + ((floatnumSamples * TARGET_FREQUENCY) / SAMPLING_RATE));
    omega = (2.0 * M_PI * k) / floatnumSamples;
    sine = sin(omega);
    cosine = cos(omega);
    coeff = 2.0 * cosine;
    q0=0;
    q1=0;
    q2=0;

    for(i=0; i<numSamples; i++)
    {
        q0 = coeff * q1 - q2 + data[i];
        q2 = q1;
        q1 = q0;
    }
    real = (q1 - q2 * cosine);
    imag = (q2 * sine);
    result = sqrtf(real*real + imag*imag);
    return result;
}

Когда я использую функцию для вычисления результата на определенных частотах для данного набора данных, я не получаю правильных результатов. Однако, если я использую тот же набор данных и вычисляю результат Goertzel с помощью функции MATLAB goertzel (), я получаю отличные результаты. Я реализовал алгоритм, используя C, с помощью некоторых онлайн-учебников, которые я нашел в Интернете. Я просто хочу узнать ваше мнение, ребята, правильно ли функция реализует алгоритм Герцеля.

13
задан Shahbaz 20 July 2012 в 12:55
поделиться