0

Goertzel アルゴリズムを使用して、iPhone のマイクに入る特定の周波数を検出しています (バッファー サンプルを使用しています)。

それは機能しますが、値が変更されると、多くの奇妙な安定性の問題があります。(同じデバイスのスペクトル アプリでは一定ですが、Goertzel アルゴリズムでは一定ではありません)

C特定の周波数、または周波数範囲内のエネルギーを検出するために、別の方法を使用したいと思います( FFTが適切で正確かどうかはわかりません。そうであれば、適切なアルゴリズムが必要です)。サンプルと長さのみを取得し、周波数のスペクトルまたは特定の既知の周波数でエネルギーを返す関数がある場合、それが役立ちます。本格的なもの、おそらく二次フィルターが必要です。

これは私のゲルツェルです:

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

2 に答える 2

2

Apple は Accelerate Framework を提供しています。
Accelerate フレームワークはこちら
FFT はこちら

vDSP と次のカテゴリを含むいくつかの FFT ルーチンが含まれています。
1D 高速フーリエ変換 (固定長)
1D 高速フーリエ変換 (インプレース
複素
) )
1D 高速フーリエ変換 (アウトオブプレース実数)
1D 高速フーリエ変換 (サポート関数)
2D 高速フーリエ変換 (インプレース複素数)
2D 高速フーリエ変換 (インプレース実数)
2D 高速フーリエ変換 (アウトオブプレース実数)複素数を配置)
2D 高速フーリエ変換 (場外実数)
離散フーリエ変換

Accelerate Framework は見過ごされがちです。

于 2013-01-01T16:46:13.880 に答える
2

これは、周波数検出へのさまざまなアプローチの適切な説明です

MacOSX または iOS で開発している場合は、[iOS および MacOSX 内で] ポータブルで最適化された DFT の実装を提供するAccelerate Frameworkを確認してください。

作品を AppStore でアプリとしてリリースする場合は、ライセンスに特に注意する必要があります。FFTWのライセンスはあなたの使い方に合っていますか?

于 2013-01-01T16:29:51.910 に答える