2012-02-29 109 views
1

我正在尋找一種從WAV文件中提取數據的方法,這對於我試圖實現的FFT算法很有用。到目前爲止,我所擁有的是左右音頻通道的一組十六進制值,但我在如何將其轉換爲FFT的時間和頻率域方面有些遺憾。如何從FFT文件中提取數據以用於FFT

這就是我需要的,例如:

3.6 2.6 
2.9 6.3 
5.6 4.0 
4.8 9.1 
3.3 0.4 
5.9 4.8 
5.0 2.6 
4.3 4.1 

這是考慮到數據的FFT函數的原型:

void fft(int N, double (*x)[2], double (*y)[2]) 

其中N是點的數量爲FFT,x是指向時域樣本的指針,y是指向頻域樣本的指針。

謝謝!

+0

您是否已經使用以下指定的WAVE格式確定了數據的頻率:https://ccrma.stanford.edu/courses/422/projects/WaveFormat/?此鏈接從這個SO問題就來了:http://stackoverflow.com/questions/9499270/reading-wav-file-in-matlab-coder – macduff 2012-02-29 19:33:02

+0

除非你寫你自己的FFT學術原因,檢查出的http:// www.fftw.org/。對於閱讀波形文件:http://www.mega-nerd.com/libsndfile/ – 2012-02-29 19:42:02

+0

@oexcz - 要清楚,時域採樣是您的輸入(解碼wav文件)和頻域採樣你的輸出。這就是FFT所做的 - 從時域轉換到頻域 - 對嗎? – hooleyhoop 2012-02-29 20:12:25

回答

3

出於測試目的,您不需要從WAV文件中提取波形數據。你可以在內存中產生一些信號(例如0,非零常數,正弦曲線,2個疊加正弦曲線,白噪聲),然後測試你的FFT函數,看看你是否得到你應該的(0 0,對於非零恆定信號爲零頻率處的峯值,對於每個正弦曲線均爲2個峯值,對於白噪聲在所有頻率上均勻非零值)。

如果您確實想分析WAV文件,請參閱格式上的Wikipedia(請點擊鏈接)。使用原始PCM編碼或A /μ律PCM編碼(AKA G.711)。

FFT通常使用就地算法實現,這意味着輸出會替換輸入。如果你這樣做,你並不需要第二個指針。

0

最常發現WAVE/RIFF文件格式具有44字節的標題,隨後的16比特或2字節的小端符號整數樣本,交織用於立體聲。因此,如果您知道如何跳過字節,並將短整數讀入雙精度,則應該很好。

只需將您需要的時域數據長度作爲真實分量向量輸入到FFT; FFT的結果將是複頻域矢量。