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