2013-01-01 30 views
0

使用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; 
} 
+0

你在這裏有什麼具體問題? –

+1

FFT很好;準確度取決於您的要求,對算法的理解以及您的問題的物理。 – duffymo

+0

我的問題是,得到一個函數,一個函數,獲取樣本,併產生FFT。不僅僅是爲了向我推薦FFT,而是我在這裏展示的同樣類型函數的代碼示例。我找不到那樣的人。 – Curnelious

回答

2

Apple提供Accelerate Framework。
Accelerate Framework here
FFT here

它包括VDSP和幾個FFT例程包括兩類:
1D快速傅立葉變換(固定長度)
1D快速傅立葉變換(就地複合體)
1D快速傅立葉變換( In-Place Real)
1D快速傅里葉變換(外部位置複合)
1D快速傅立葉變換(位置外實數)
1D快速傅立葉變換(Su- pport功能)
2D快速傅立葉變換(就地復)
2D快速傅立葉變換(就地真實)
2D快速傅立葉變換(外的地方情結)
2D快速傅立葉變換(室外of-Real Real)
離散傅立葉變換

加速框架經常被忽視。

+0

峯值功率計算頻率的最佳方法是什麼? –

+0

我真的無法幫上忙。 – zaph

+0

好吧,你可能知道AVAudioRecorder需要傳遞什麼參數來計算頻率的FFT嗎? –