刚刚写过一篇用MATLAB实现离散傅里叶级数的博文,如下:
【 MATLAB 】离散傅里叶级数(DFS)及 IDFS 的 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 DFTn = [0:1:N-1]; % row vector for nk = [0:1:N-1]; % row vector for kWN = exp(-j*2*pi/N);nk = n'*k;WNnk = WN .^ nk; %DFT matrixXk = 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 DFTn = [0:1:N-1]; % row vector for nk = [0:1:N-1]; % row vector for kWN = exp(-j*2*pi/N);nk = k' * n;WNnk = WN .^(- nk); %IDFT matrixxn = (Xk*WNnk)/N;
具体的案例分析见下篇博文。
欢迎查看我的数字信号处理的MATLAB实现专栏:数字信号处理的MATLAB实现