【 MATLAB 】離散傅立葉變換(DFT)以及逆變換(IDFT)的MATLAB實現
剛剛寫過一篇用MATLAB實現離散傅立葉級數的博文,如下:
離散傅立葉變換不是一種神奇的東西,它和離散傅立葉級數關係很緊密,緊密到使用MATLAB編寫離散傅立葉變換以及逆變換的函式一模一樣,只需改個名字即可。
因為離散傅立葉級數是一個週期的訊號,我們編寫DFS以及IDFS函式時候,也通常只能考慮一個週期的時域訊號以及頻域訊號,儘管我們心裡都明白它是一個週期的訊號。
那離散傅立葉變換DFT就是對一個時域非週期的訊號x(n)作變換,這個非週期的訊號x(n)經過週期延拓就可以得到一個週期訊號xtilde(n),同樣,離散傅立葉級數係數是一個頻域的週期訊號,離散傅立葉變換隻是取其一個主值週期而已。
下面詳細闡述。
定義一個週期訊號,它的主值區間就是一個有限長訊號,然後對這個週期訊號應用DFS。實際上可以定義一個新的變換稱為離散傅立葉變換(DFT),它就是這個DFS的主值週期。這個DFT就是任意有限長序列的最終數值可計算的傅立葉變換。
首先定義一個有限長序列x(n),它在上有N個樣本,作為一個N點序列。令是用這個n點序列x(n)建立的一個週期為N的週期訊號,即:
令離散傅立葉級數係數:
它是一個週期序列(因此也是無限長序列),那麼它的主值區間就是離散傅立葉變換,它是有限長的。這些概念清楚表明在下面的定義中:
這樣的話:
其中:
一個N點的DFT X(k) 的逆離散傅立葉變換給出為:
或者:
理論知識說明完了,現在就用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實現