數位訊號處理第3部分-傅立葉變換

步驟2:背後的演算法

 

複數是傅立葉變換演算法中的一個重要概念。複數可以表示為z = a + bi,其中a & b為實數,i是虛數,為x2= -1 的解(因為該式沒有實數解,所以解被認為是虛數)。

下圖顯示了如何用圖形表示複數。您可以通過Argand 圖對複數進行幾何表示。x軸表示複數的實部,y軸表示複數的虛部。

時域和頻域的每個分量都由包含了N個複數點的訊號來描述。每個點都由用於描述訊號分量的實部和虛部組成。有一個應用于現實生活中的電氣工程領域的實例:使用傅立葉變換可以説明我們分析變化的電壓和電流。

快速傅立葉變換(FFT)的過程是將一個包含N個樣本點的時域訊號分解為N個時域訊號,每個時域訊號表示一個樣本點資訊。第二步是計算這N個時域訊號相對應的N個頻譜。最後,將N個頻譜合為一個頻譜。

點擊此處可以找到有關傅立葉變換的更多資訊。

fourier transform tutorial

圖8:時域分解

使用傅立葉變換時的一些重要規則如下:

  • 時域中的點數等於頻域中的點數。
  • 假設您有一個包含DC值的正弦波 – 頻譜中的第一個點將具有零頻率值(DC值),而下一個點為正弦頻率。
  • 當從時域轉為頻域時,可以使用第n個點的頻率進行繪製:f = (n-1) SR/N,其中N為樣本點數。
  • 頻率為f = 1/T,其中T為週期。

讓我們來看一下下面的代碼,以瞭解在MATLAB中是如何實現傅立葉變換的。


t = 0:1/1000:1-1/1000;
x = sin(2*pi*30*t);
plot(t,x)

向量t中可以觀察到,點採樣是在1/1000範圍內進行的,因此取樣速率為1000 Hz(1000 1s或 s-1)。您還記得之前的文中提到的取樣速率應該是訊號頻率的兩倍嗎?

下麵的正弦波的頻率為30Hz。

fourier transform tutorial

圖9:在MATLAB中生成的正弦波

當我們想要進行傅立葉變換時,使用fft(x)指令。


y = fft(x);
f = (0:length(y)-1)*1000/length(y);
plot(f,abs(y))

當我們在頻域中繪圖時,x軸將除以2。

使用傅立葉變換後,我們只需要一半的取樣速率即可觀察到訊號的頻譜分量。

fourier transform tutorial

圖10:MATLAB中的fft函數圖

當在正弦訊號上應用FFT時,其唯一的屬性是與時域中所描述的頻率點相對應的頻譜分量,在本例中為30 Hz。

如果將長度指令應用于向量t,則返回:

>> length(t)

ans =

1000

圖 11所示,當我們對所有點進行繪製時,可以觀察到一個有趣的現象:970 Hz(1000-30 Hz)處還有一個頻譜分量。這意味著y軸以500 Hz為中心發生了鏡像翻轉,對應了取樣速率除以2的結果。

目前為止,我們的項目已經快要完成了。請繼續閱讀下一篇文章來瞭解如何添加失真濾波器使訊號發生變形。然後,我們將在使用MATLAB創建的GUI上繼續對聲音訊號進行處理。