FFT通過傅立葉級數圖解頻域補零時域內插

Binfun發表於2022-02-03

在時域頻域的訊號分析的過程中,一個常見的說法叫:頻域資料補零會讓時域資料內插。

意思是在頻域資料中多補幾個零,再做ifft(逆傅立葉變換)後的時域資料,會變得更加“細膩”,解析度會更高。

關於頻域補零讓時域內插,我有一點樸素的理解:

  1. 頻域資料已經包含了所有正弦波的資訊,IFFT解出的時域資料是否細膩,只能看時域資料的點數是否夠多。
  2. 做FFT/IFFT運算前後時域和頻域的資料的點數是一樣多的。

哦,是兩點,基於這兩點,我們只能把頻域資料中原本不存在的高頻資訊中加上0,再轉成時域訊號,這樣點數就夠多呀。頻域補零會讓時域取樣點增加。

基於這樣樸素的認知,看看下面兩張傅立葉級數的圖:

補兩個零:

以上,整個正弦波的週期時間沒變,但是取樣點多了,也就更"細膩"了。

這個網頁的的原始碼在https://gist.github.com/kazad/8bb682da198db597558c

對於學習頻域時域的直觀感受有很強的幫助。但是因為眾所周知的原因,裡面的個別js指令碼訪問不了。我已經將其下載好,放在github地址: https://github.com/Binfun/fourier_transform

如果補的零再增加的話,那麼這些點數就慢慢趨近於一個正常的正弦波了:

通過以上示例,僅僅是直觀地理解頻域補零->時域插值是沒有問題的。

但是上面的例子還是有點兒“問題”

在FFT的世界中,上圖的描述不準確,而是下圖:

在實踐過程中,對FFT後的頻域結果,如果要補零則是補在中間(高頻補零),再進行IFFT(逆傅立葉變換)轉成時域。 知道這句話則足夠了,以下內容,則是我對於這個現象的樸素的解釋。

這個時候我們又不得不拿出那個之前聊過的概念:負頻率

在上兩圖中,四個點的頻域資料,2HZ和-2Hz是一回事,3Hz和-1Hz也是一回事。就像觀察一座山,3Hz是順時針,分別從東南西北去觀察,-1Hz是逆時針,分別從東北西南方向去看而已。

在DFT/FFT計算3Hz時,根據DFT的公式,會計算相位點(數字都會乘以2pi,為方便顯示,以下省略2pi):
[0,-3/4, -6/4, -9/4]。該序列可以看作是,順時針依次遞增3/4個2pi。所以它可以看做是3Hz。

將序列[0,-3/4, -6/4, -9/4]中的整數去掉,一個整數就代表一個2pi,一個2pi就代表轉動了一圈回到原點。

會得到[0,-3/4, -2/4, -1/4]。這樣看序列的話,逆時針依次增加1/4個2pi,所以它可以看做是 -1Hz 。

如果頻域資料的點數是N,假設任意一個點的正頻率表示為A,那麼其負頻率表示就是A-N。

那麼為什麼FFT之後的頻域資料,前半部分是以正頻率表示,後半部分以負頻率表示呢?

我們對1Hz的頻點取個30度的初始相位(以1:30表示),然後在後面補零,此刻它是1Hz的正弦波:

我們對序列[0 1:30]中間插18個0,即數字1在序列的最後一位,此時序列有20個頻點,最後一個頻點正頻率的角度是19Hz,負頻率的角度是-1Hz。我們現在觀察下圖黃點連成的線,此刻它是一個 -1Hz的正弦波,並且也是30度的初始相位,而並非是19Hz。

可以把上面兩張圖結合起來看:

最後基於以上的實驗,我樸素地再理解一下,在FFT的世界中,無法支撐起大於等於總點數一半的正頻率,所以前半部分是正頻率,後半部分是負頻率。而高頻的判斷標準是其絕對值,所以高頻在中間。

相關文章