離散傅立葉變換的衍生,負頻率、fftshift、實訊號、共軛對稱

Binfun發表於2021-05-31

封面是福州的福道,從高處往下看福道上的人在轉圈圈。從傅立葉變換後的頻域角度來看,我們的生活也是一直在轉圈圈,轉圈圈也是好事,說明生活有規律,而我們應該思考的是,如何更有效率地轉圈圈……哦別誤會,我真不是在說內卷(狗頭)。

本文會講到離散傅立葉、實訊號、負頻率、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的功能,但也暗含了額外的資訊。

  1. 為什麼60Hz可以當做是-40Hz,15Hz可以當做是-85Hz?又或者為什麼會有負頻率?
  2. 為什麼頻點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的曲線呢?

如果本文中有哪些沒說清楚的地方,歡迎後臺私信我,一起討論。

參考資料

相關文章