使用Goertzel算法我正在檢測進入iphone麥克風的某個頻率(我使用緩衝區採樣)。檢測某個頻率的算法?
它的工作,但值改變時,它有許多奇怪的穩定性問題。 (它們在同一設備上的頻譜應用中是恆定的,但不與Goertzel算法一致)
我想用另一種方式在C
中檢測某個頻率或某個頻率範圍內的能量(I不知道如果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;
}
你在這裏有什麼具體問題? –
FFT很好;準確度取決於您的要求,對算法的理解以及您的問題的物理。 – duffymo
我的問題是,得到一個函數,一個函數,獲取樣本,併產生FFT。不僅僅是爲了向我推薦FFT,而是我在這裏展示的同樣類型函數的代碼示例。我找不到那樣的人。 – Curnelious