2017-05-06 32 views
0

如何從KissFFT設置頻帶到我的陣列?採樣頻率是44100,我需要將它設置爲我的陣列realPartFFT。我不知道,它是如何工作的。我需要繪製我的光譜圖,看看它是否正確。當我現在繪製它時,x軸上仍然只有513個數字,沒有指定的頻率。如何在fft之後設置陣列的頻帶

int windowCount = 1024; 
    float floatArray[windowCount], realPartFFT[(windowCount/2) + 1]; 

    kiss_fftr_cfg cfg = kiss_fftr_alloc(windowCount, 0, NULL, NULL); 

    kiss_fft_cpx cpx[(windowCount/2) + 1]; 

    kiss_fftr(cfg, floatArray, cpx); 

    for (int i = 0; i < (windowCount/2) + 1; ++) 
     realPartFFT[i] = sqrtf(powf(cpx[i].r, 2.0) + powf(cpx[i].i, 2.0)); 

回答

0

首先:KissFFT不知道任何有關數據來源的信息。您將它傳遞給定大小爲N的實數的數組,並返回一個大小爲N/2+1的複數值的數組。輸入數組可以是預測過去N天的太陽黑子數量的下N小時。 KissFFT不在乎。

映射回現實世界需要由您完成,因此您必須解釋數據。截至你的代碼片段,你傳遞了1024個浮動數據(我假設floatArray包含輸入數據)。然後你返回一個513(= 1024/2 + 1)對浮點數組。

如果以44.1 KHz採樣並通過1024(您的窗口大小)樣本的KissFFT塊,您將獲得最高頻率22.05 KHz和最低頻率43 Hz(44,100/1024)。通過將更大的塊傳遞給KissFFT,您可以獲得更低的分辨率,但請記住,處理時間將會增加(N,IIRC的四次方)!

順便說一句:你可以考慮讓你的windowSize變量const,以允許編譯器做一些優化。數字運算時優化非常有價值。在這種情況下,效果可能可以忽略不計,但這是一個很好的起點。

+0

因此,如果我運行此代碼,我可以告訴realPartFFT陣列有43 Hz - 22.05 KHz的頻率,或者我必須將它設置在某個位置? –

+0

是的,43 Hz - 22.05 KHz是正確的解釋。我不知道你想在哪裏設置,除了繪製數據時在x軸的標籤處。 – craesh

+0

那麼,所以我只用頻率來繪製數據..在這種情況下,我還有另一個問題。我想使用libmfcc庫來計算這些係數。 (int i = 0; i <26; i ++) getCoefficient(realPartFFT,44100,48,1024,i); 和我的光譜數組有問題,因爲這個函數想要雙精度數組,我給她的浮點數組。我嘗試覆蓋參數來漂浮,但它仍然不起作用 –