封面是福州的福道,從高處往下看福道上的人在轉圈圈。從傅立葉變換後的頻域角度來看,我們的生活也是一直在轉圈圈,轉圈圈也是好事,說明生活有規律,而我們應該思考的是,如何更有效率地轉圈圈……哦別誤會,我真不是在說內卷(狗頭)。
本文會講到離散傅立葉、實訊號、負頻率、fftshift、實訊號、共軛等概念。
離散傅立葉變換
上一篇文章裡面寫到了離散傅立葉變換。
公式如上,我發現,只要掌握初中的數學——加減乘除以及三角函式,就可以掌握離散傅立葉變換的運算。
上文中說過:
如果有時域資料如: [1, 2, 3] 的話,
那麼代入公式算得頻域資料的結果為:
[6 + 0i, -1.5 + 0.86603i, -1.5 - 0.86603i]
頻域資料,就是時域資料依次代入到離散傅立葉變換公式的結果。
下面是對頻域資料第二個複數:-1.5 + 0.86603i的推算過程。如下:
此時N = 3,k = 1,n = [0, 1, 2]代入到上述公式得:
只要懂得計算:
即可得出整個式子的結果。以上式子表達的即為,一個長度為3的線段,一端在座標原點上,且線段和X軸(實部)的正半軸重疊。然後線段以座標原點為圓心,順時針旋轉4π/3。該線段在X軸上的投影即為實部,在Y軸上的投影即為虛部。如下(手殘字醜預警):
這裡多說一句,如果時域訊號也是複數且虛部有值的話,例如[3, 1],那麼上圖中,起始位置的[3, 0]改成[3, 1]即可,再做同樣的4π/3旋轉。
實部:-3 * cos(π/3) = -1.5
虛部:3 * sin(π/3) = 2.59808
即為:
同理可得:
以上相加:
1 + (-1 - i*1.732050) + (-1.5 + i*2.59808) = -1.5 + 0.86603i
至此,我們大約已經掌握了DFT(離散傅立葉變換)。DFT即計算三角函式和資料累加的過程,甚至我們也可以自己實現一個DFT函式。
fftshift
FFT即快速傅立葉變換,一種非常高效的DFT函式實現。
通常做完FFT之後,很多場景下會做fftshift。
fftshift是針對頻域的,將FFT直流分量移到頻譜中心。fftshift就是對換資料的左右兩邊置換如:
x=[1 2 3 4]
fftshift(x) -> [3 4 1 2]
用matlab或者octave執行以下程式碼:
clf;
fs=100;N=256; %取樣頻率和資料點數
n=0:N-1;t=n/fs; %時間序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %訊號
y1=fft(x,N); %對訊號進行快速Fourier變換
y2=fftshift(y1);
mag1=abs(y1); %求得Fourier變換後的振幅
mag2=abs(y2);
f1=n*fs/N; %頻率序列
f2=n*fs/N-fs/2;
subplot(2,1,1),plot(f1,mag1,'r'); %繪出隨頻率變化的振幅
xlabel('Freq Hz');
ylabel('Amp');title('plot 1 usual FFT','color','r');grid on;
subplot(2,1,2),plot(f2,mag2,'m'); %繪出隨頻率變化的振幅
xlabel('Freq Hz');
ylabel('Amp');title('plot 2 FFT after fftshift','color','m');grid on;
可以看到fftshift完成了shift的功能,但也暗含了額外的資訊。
- 為什麼60Hz可以當做是-40Hz,15Hz可以當做是-85Hz?又或者為什麼會有負頻率?
- 為什麼頻點40和-40有相同的振幅?
接下來就這兩點展開討論。
負頻率
我們還是以時域資料[1, 2, 3] fft後 --> [6 + 0i, -1.5 + 0.86603i, -1.5 - 0.86603i],作為例子。
[6 + 0i, -1.5 + 0.86603i, -1.5 - 0.86603i] 中的三個數字分別代表0Hz, 1Hz, 2Hz的頻點資訊。對它做fftshift則會變成:
[-1.5 - 0.86603i, 6 + 0i, -1.5 + 0.86603i]這分別代表-1Hz,0Hz,1Hz的頻點資訊。原本的2Hz的也就是-1Hz。
為什麼?還是要從離散傅立葉變換的公式說起:
還記得我們求頻域資料[6 + 0i, -1.5 + 0.86603i, -1.5 - 0.86603i] 中1Hz的-1.5 + 0.86603i的式子嗎?
如果求2Hz的式子是這樣的:
即為:
也即為:
以上求2Hz的式子和以下求1Hz的式子再對比一下:
1Hz是順時針旋轉,2Hz是逆時針旋轉,旋轉的度數是一樣的,只是旋轉的方向不一樣。
所以當N為3時,2Hz即為-1Hz,就是相對1Hz反著旋轉。
以上現象公式是可以推匯出來的,如下:
實訊號的頻域,共軛對稱
為什麼頻點40和-40有相同的振幅?因為時域訊號是實訊號,所謂實訊號,即為訊號中資料的虛部為0。
所謂共軛,就是實部相同,虛部的符號相反的一對複數。
實訊號經過DFT之後,頻域訊號是共軛對稱的,兩個數如果共軛,則代表這兩個值的幅值相同,相位不同。頻點40和-40頻點的值是共軛的,所以有相同的振幅。
我們還是以[1, 2, 3]為例子,實訊號[1, 2, 3]的頻譜是[6 + 0i, -1.5 + 0.86603i, -1.5 - 0.86603i]。
1Hz的-1.5 + 0.86603i和-1Hz的-1.5 - 0.86603i就是共軛對稱的。這不是巧合。
這也是暗含在離散傅立葉變換公式中的一個資訊。可以推匯出來,這還是牽扯到1Hz和-1Hz的頻點資訊的關係,如下:
如果x(n)是實訊號,那麼X(k)與X(N - k)則互為共軛,怎麼理解?
其中 $$ e^{-i\times \frac{2\pi nk}{N}} $$ 和 $$ e^{i\times \frac{2\pi nk}{N}} $$ 已經是互為共軛了,就看x(n)的值中的虛部是否為零了。
示意圖如下(手殘字醜預警):
以上簡化了生成1Hz的多個向量,僅為示意,但是1Hz和-1Hz頻點的關係一目瞭然,也解釋了為什麼僅在實訊號時,正負頻率是共軛的。
思考另一個角度
頻域訊號中所有頻點代表的曲線,他們的累加即為時域訊號。
想象一下(其實是我不會畫圖 - -),在一個複平面上如何構建一個,在實部投影是40Hz的cos訊號,但虛部投影是0的曲線?
我們是否需要兩個複平面曲線,一個如下圖,假設它的相位和幅值是a + bi,並且以40Hz的頻率逆時針旋轉。
另一個自行腦補,假設它的相位和幅值是a - bi,並且以40Hz的頻率順時針旋轉。
以上兩個曲線相加,是否能在一個複平面上如何構建一個,在實部投影是40Hz的cos,但虛部投影是0的曲線呢?
如果本文中有哪些沒說清楚的地方,歡迎後臺私信我,一起討論。