2011-07-08 58 views

回答

1

我記得FFT算法不是那麼複雜,我以前寫的FFT計算的類我的論文。那時輸入是從* .WAV文件中讀取的一維數組值。但在FFT之前,執行了一些過濾和標準化。

+0

感謝您的幫助。你可以告訴我什麼是輸出,它是一個值還是一個數組?你可以分享我的FFT源代碼嗎?非常感謝你 ! – thongcaoloi

+0

是的,結果也是一維數組。 – 2011-07-12 03:05:29

+0

我必須看看我的備份硬盤,如果我仍然有代碼,很久以前。請給我發電子郵件提醒。 – 2011-07-12 03:06:22

3

在理論意義上,FFT映射complex [N] => complex [N]。但是,如果你的數據只是一個音頻文件,那麼你的輸入將只是複數而沒有虛部。因此,您將映射real [N] => complex [N]。但是,有一點數學,你會發現輸出的格式總是輸出[i] == complex_conjugate(輸出[N-i])。因此你只需要看第一個N/2 + 1樣本。此外,FFT的複雜輸出爲您提供了關於相位和幅度的信息。如果所有你關心的是如何多少一定的頻率是在你的音頻,你只需要看看大小,它可以作爲square_root計算(虛^ 2 +真正^ 2),爲輸出的每個元素。

當然,您需要查看您使用的任何庫的文檔,以瞭解哪個數組元素對應於第N個複合輸出的實數部分,並且同樣可以找到第N個複數輸出的虛數部分。

22

@thongcaoloi,

關於輸入數據的維簡單的回答是:你需要一維數據。現在我將解釋這意味着什麼。

因爲您想要分析音頻數據,所以您對離散傅里葉變換(DFT或FFT)的輸入是實數的一維序列,它表示音頻信號隨時間變化的電壓,並且您的音頻文件是隨時間變化的電壓的數字表示。

你的音頻文件是由以固定的採樣率(也被稱爲採樣頻率)採樣的連續音頻信號的電壓,通常44.1千赫爲CD質量的音頻產生的。

但你的數據文件可能以低得多的頻率被採樣,所以要儘量找出你的數據的採樣頻率,你對這些數據做一個FFT之前。

所以,現在你必須從你的音頻文件中提取單個樣本。如果您的文件是立體聲,它將有兩個獨立的採樣序列,一個用於右聲道,另一個用於左聲道。如果文件是單聲道的,它將只有一個採樣序列。

如果文件是立體聲的,或任何其它的多聲道音頻格式,例如5.1或7.1,則可以分別FFT每個信道,或者也可以組合任何數量的通道一起使用電壓加法。這取決於你自己,取決於你想要用FFT結果做什麼。

的DFT或FFT的輸出是複數的序列。每個複數都是由一個實部和一個虛部組成的一對,通常顯示爲一對(re,im)。

如果你想繪製你的音頻文件的功率譜密度,這是大多數人想要從FFT中得到的,你將使用圖20 * log10(sqrt(re^2 + im^2)) FFT輸出的前N/2個複數,其中N是FFT的輸入採樣數。

您可以嘗試構建自己的頻譜分析儀軟件程序,但我建議使用已經構建和測試的東西。

這兩款FFT頻譜分析儀可立即給出結果,並具有內置IFFT合成功能,這意味着您可以對頻域頻譜數據進行傅立葉逆變換,以重建時域中的原始信號。

http://www.mathworks.com/help/techdoc/ref/fft.html

http://www.sooeet.com/math/fft.php

還有更多的這個話題很多,而且數字信號處理的一般主體,但這種簡單的介紹,應該讓你開始。