2

特定の周波数の振幅を取得するために Goertzel アルゴリズムを使用しています。私は今、そこからフェーズを取得しようとしていますが、方法がわかりません。

誰かが説明して、このコードから特定の f の位相を取得する方法を教えてもらえますか?

また、サンプルレート44.1で16khzまで使用しています。実行できるサンプルの最小の長さはどれくらいですか?

double AlgorithmGoertzel( int16_t *sample,int sampleRate, double Freq, int len )
{
    double realW = 2.0 * cos(2.0 * M_PI * Freq / sampleRate);
    double imagW = 2.0 * sin(2.0 * M_PI * Freq / sampleRate);
    double d1 = 0;
    double d2 = 0;
    double y;
    for (int i = 0; i < len; i++) {
        y=(double)(signed short)sample[i] +realW * d1 - d2;
        d2 = d1;
        d1 = y;
    }
    double rR = 0.5 * realW *d1-d2;
    double rI = 0.5 * imagW *d1-d2;

    return (sqrt(pow(rR, 2)+pow(rI,2)))/len;
}
4

3 に答える 3

3

直交から極への変換を行います。それはあなたに位相と大きさを与えるでしょう。

マグニチュード=sqrt((Vreal * Vreal)+(Vimag * Vimag))

フェーズ=atan2(Vimag、Vreal)

于 2012-11-23T06:03:34.923 に答える
1

Goertzelフィルターに供給する必要のあるサンプルの数は、必要なフィルター帯域幅に反比例します。Goertzelは、メインローブの幅が2 * Fs/Nに比例するSinc型のバンドパスフィルターを提供します。

複雑なGoertzelを使用する場合、結果のフェーズは、フィルターのデータウィンドウのあるポイントを基準にしています。したがって、他の基準時点を基準にして位相を取得するために、オフセットを計算する必要がある場合があります。

于 2012-11-21T15:06:30.277 に答える