1. 程式人生 > >【 MATLAB 】離散傅立葉變換(DFT)以及逆變換(IDFT)的MATLAB實現

【 MATLAB 】離散傅立葉變換(DFT)以及逆變換(IDFT)的MATLAB實現

剛剛寫過一篇用MATLAB實現離散傅立葉級數的博文,如下:

離散傅立葉變換不是一種神奇的東西,它和離散傅立葉級數關係很緊密,緊密到使用MATLAB編寫離散傅立葉變換以及逆變換的函式一模一樣,只需改個名字即可。

因為離散傅立葉級數是一個週期的訊號,我們編寫DFS以及IDFS函式時候,也通常只能考慮一個週期的時域訊號以及頻域訊號,儘管我們心裡都明白它是一個週期的訊號。

那離散傅立葉變換DFT就是對一個時域非週期的訊號x(n)作變換,這個非週期的訊號x(n)經過週期延拓就可以得到一個週期訊號xtilde(n),同樣,離散傅立葉級數係數是一個頻域的週期訊號,離散傅立葉變換隻是取其一個主值週期而已。

下面詳細闡述。

定義一個週期訊號,它的主值區間就是一個有限長訊號,然後對這個週期訊號應用DFS。實際上可以定義一個新的變換稱為離散傅立葉變換(DFT),它就是這個DFS的主值週期。這個DFT就是任意有限長序列的最終數值可計算的傅立葉變換。

首先定義一個有限長序列x(n),它在0\leq n \leq N-1上有N個樣本,作為一個N點序列。令\tilde x(n)是用這個n點序列x(n)建立的一個週期為N的週期訊號,即:

\tilde x(n) = \sum_{r = - \infty}^{\infty}x(n - rN)

令離散傅立葉級數係數:

\tilde X(k)=DFS \left \{ \tilde x (n) \right \}

它是一個週期序列(因此也是無限長序列),那麼它的主值區間就是離散傅立葉變換,它是有限長的。這些概念清楚表明在下面的定義中:

X(k)=DFT[x(n)]=\begin{cases} \tilde X(k), & \text{ } 0 \leq k \leq N-1 \\0, & \text{ } else \end{cases} = \tilde X(k)R_N(k)

這樣的話:

X(k)=\sum_{n = 0}^{N-1}x(n)W_N^{nk},0\leq k \leq N-1

其中:W_N= e^{-j \frac{2\pi}{N}}

一個N點的DFT X(k) 的逆離散傅立葉變換給出為:

x(n)=IDFT[X(k)]=\tilde x(n) R_N(n)

或者:

x(n)=\frac{1}{N}\sum_{k = 0}^{N-1}X(k)W_N^{-kn},0 \leq n \leq N-1

理論知識說明完了,現在就用MATLAB語言來實現DFT以及IDFT。

同樣使用向量化程式設計,具體的推導見一開始推薦的那篇博文,裡面由我的推導,這裡將DFS以及IDFS函式直接改個名字給出DFT以及IDFT的函式:

dft.m

function [Xk] = dft(xn,N)
% Computes Discrete Fourier Transform
%______________________________________________
% [Xk] = dft(xn,N)
% Xk = DFT coefficients array over 0 <= k <= N - 1
% xn = N-point finite - duration sequence 0 <= n <= N - 1
% N = Length of DFT

n = [0:1:N-1]; % row vector for n
k = [0:1:N-1]; % row vector for k
WN = exp(-j*2*pi/N);
nk = n'*k;
WNnk = WN .^ nk;   %DFT matrix
Xk = xn * WNnk;

idft.m

function [xn] = idft(Xk,N)
% Computes Inverse Discrete Fourier Transform
%______________________________________________
% [xn] = idft(Xk,N)
% Xk = DFT coefficients array over 0 <= k <= N - 1
% xn =  N-point sequence over 0 <= n <= N - 1
% N = Length of DFT

n = [0:1:N-1]; % row vector for n
k = [0:1:N-1]; % row vector for k
WN = exp(-j*2*pi/N);
nk = k' * n;
WNnk = WN .^(- nk);   %IDFT matrix
xn = (Xk*WNnk)/N;

具體的案例分析見下篇博文。

歡迎檢視我的數字訊號處理的MATLAB實現專欄:數字訊號處理的MATLAB實現