2012-08-31 71 views
0

我是初學者到音頻信號處理 現在,我試圖實現音調檢測算法 我發現倒頻譜的一些步驟,該步驟是kissfft基音檢測麥克風

result1 = IFFT(log(abs(FFT(Audio Input)))) 
peak = max(result); 
out_frequency = 1/peak; // last step 

因此,我通過使用kissfft和portaudio作爲FFT和IFFT 的問題是後我得到的IFFT結果,並做最後一步提取頻率的圖書館裏用C實現這些算法,結果是不是我期待。 (注由音符唱(440Hz的)我測試)

我不知道我失蹤倒譜的最後一步或做錯了。

麥克風測試我的筆記本電腦的麥克風,這我知道,這是一個電容式麥克風。 我應該改變MIC爲動態麥克風或它的確定使用正常的labtop麥克風

聽到的是我一直在代碼實現

kiss_fft_cpx cin[FFT_SIZE]; 
kiss_fft_cpx cout[FFT_SIZE]; 
kiss_fft_cpx fftBins[FFT_SIZE]; 
for (i = 0; i <FFT_SIZE; i++){ 
    cin[i].r = zero; 
    cin[i].i = zero; 
    cout[i].r = zero; 
    cout[i].i = zero; 
    fftBins[i].r = zero; 
    fftBins[i].i = zero; 
} 
for(j=0;j < FFT_SIZE;j++){ 
    cin[j].r = *in++ ; 
} 
kiss_fftr_cfg fftConfiguration = kiss_fftr_alloc(FFT_SIZE, 0, NULL, NULL); 
kiss_fftr_cfg ifftConfiguration = kiss_fftr_alloc(FFT_SIZE, 1, NULL, NULL); 

// FFT... 
kiss_fftr(fftConfiguration, (kiss_fft_scalar*)cin, fftBins); 
for(i = 0; i<FFT_SIZE;i++){ 
    fftBins[i].i = log(fabs(fftBins[i].r)); 
    fftBins[i].r = zero; 
} 
// iFFT... 
kiss_fftri(ifftConfiguration, fftBins, (kiss_fft_scalar*)cout); 
double maxi = 0; 
double maxr = 0; 
for(i = 0; i<FFT_SIZE;i++){ 
    if(maxi<cout[j].i){ 
     maxi = cout[j].i; 
    } 
    if(maxr<cout[j].r){ 
     maxr = cout[j].r; 
    } 
} 
printf("%f\t%f\n",maxi,maxr); 
double result; 
result = 1./maxr; 
printf("result = %f\n",result); 
free(fftConfiguration); 
free(ifftConfiguration); 

方面

回答

1

您正在創建一個複雜的陣列( kiss_fft_cpx),然後將其用作真實數組(kiss_fft_scalar)。您需要使用kiss_fft_scalar將您的麥克風樣本發送至kiss_fftr。

真正FFT返回N/2 + 1的複雜分。

當你計算幅度不要忽視虛部。您可以使用sqrt(re^2 + im^2)或者在不影響倒譜峯的情況下跳過sqrt。需要

感興趣的頻率進行調整的FFT大小和採樣頻率。

+0

大感謝您的建議,但我仍然混淆由smapling率調整結果的最後一部分,fftsize 我的採樣率是44100和fftsize爲4096 我應該怎麼辦白衣這個結果= 1./maxr部分 方面 – bariyard

+0

然後你的FFT的頻率分辨率是44100/4096赫茲。第零個倉代表DC(0Hz),第一個倉是〜10Hz,第二個〜20Hz ...另外,我只注意到你正在獨立搜索最大實部和虛部 - 這是沒有意義的。你應該尋找最大幅度的元素。 –

+0

嗨馬克,現在我檢查所有的輸出數字一步一步,並繪製使用Qt的圖形。這個問題發生在我用一個大小爲4096/2的fftBin記錄(abs(fftBins))真實和img部分後,然後我把它放到ifft中,但它給了我1.#QNAN0 img和real,I想想這可能是我的錯誤設置kiss_fft lib中逆FFT或者它可能是另一種解決方案,請建議方面 – bariyard