Curnelious
Curnelious

Reputation: 1

Goerzel algorithm- amplitude goes down,and other issues

I am using Goerzel to id a certain frequency . What i see is that it works great-but in a strange way- when i input to it samples(±500/1024) i get the right values-but they becomes lower and lower till zero -while the frequency is STILL there . so i get for ex: 700, than it goes slowly down .. Also, i would like to make it more exponential -so differences between noise and frequency will be higher .

What can cause this problem ,and how can i improve my code ? thanks.

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

    float   scalingFactor = numSamples / 2.0; // -2

    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) / scalingFactor;
    imag = (q2 * sine) / scalingFactor;

    //double theta = atan2 ( imag, real); //PHASE
    magnitude = sqrtf(real*real + imag*imag);
    return magnitude;
}

Upvotes: 3

Views: 208

Answers (1)

Curnelious
Curnelious

Reputation: 1

After SO much researches about Goerzel , i found out that the problem is not him . When i input a pure sin wave to the mac , and print out the buffer :

int16_t *q = (int16_t *)(&bufferList)->mBuffers[0].mData;

Its values are becomes high, but after 5 seconds- the signal is going lower and lower to zero! Moving the signal source, will make it again becomes higher, and goes down again.

For what i have read , the chanel can go into saturation , and maybe this can cause the problem.

This Goerzel algorithm is very good .

Upvotes: -1

Related Questions