Goertzel算法 - 幅度下降,以及其他问题

时间:2012-12-24 13:17:40

标签: objective-c c math

我正在使用Goerzel来识别某个频率。 我所看到的是,它工作得很好 - 但是以一种奇怪的方式 - 当我输入样本(±500/1024)时,我得到正确的值 - 但它们变得越来越低,直到零 - 而频率仍在那里。所以我得到的是:700,而不是慢慢下来.. 此外,我想使它更具指数性 - 因此噪音和频率之间的差异会更高。

什么可能导致此问题,以及如何改进我的代码? 感谢。

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

1 个答案:

答案 0 :(得分:-1)

经过对Goerzel的大量研究,我发现问题不在于他。 当我向mac输入一个纯正的sin波,并打印出缓冲区时:

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

它的值变高,但5秒后 - 信号越来越低,越来越低! 移动信号源会使其再次变高,然后再次下降。

对于我所读到的内容,chanel可能会进入饱和状态,这可能会导致问题。

这种Goerzel算法非常好。