3

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

1 に答える 1

-1

Goerzel について非常に多くの調査を行った結果、問題は彼ではないことがわかりました。Macに純粋な正弦波を入力し、バッファを出力すると:

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

その値は高くなりますが、5 秒後、信号はどんどん下がってゼロになります! 信号源を移動すると、再び高くなり、また低くなります。

私が読んだことについては、シャネルは飽和状態になる可能性があり、これが問題を引き起こす可能性があります.

この Goerzel アルゴリズムは非常に優れています。

于 2012-12-26T14:29:21.080 に答える