【 MATLAB 】离散傅里叶变换(DFT)以及逆变换(IDFT)的MATLAB实现

举报
李锐博恩 发表于 2021/07/15 06:38:17 2021/07/15
7.2k+ 0 0
【摘要】 刚刚写过一篇用MATLAB实现离散傅里叶级数的博文,如下: 【 MATLAB 】离散傅里叶级数(DFS)及 IDFS 的 MATLAB 实现 离散傅里叶变换不是一种神奇的东西,它和离散傅里叶级数关系很紧密,紧密到使用MATLAB编写离散傅里叶变换以及逆变换的函数一模一样,只需改个名字即可。 因为离散傅里叶级数是一个周期的信号,我们编写DFS以及IDFS函数时候,也通常只...

刚刚写过一篇用MATLAB实现离散傅里叶级数的博文,如下:

【 MATLAB 】离散傅里叶级数(DFS)及 IDFS 的 MATLAB 实现

离散傅里叶变换不是一种神奇的东西,它和离散傅里叶级数关系很紧密,紧密到使用MATLAB编写离散傅里叶变换以及逆变换的函数一模一样,只需改个名字即可。

因为离散傅里叶级数是一个周期的信号,我们编写DFS以及IDFS函数时候,也通常只能考虑一个周期的时域信号以及频域信号,尽管我们心里都明白它是一个周期的信号。

那离散傅里叶变换DFT就是对一个时域非周期的信号x(n)作变换,这个非周期的信号x(n)经过周期延拓就可以得到一个周期信号xtilde(n),同样,离散傅里叶级数系数是一个频域的周期信号,离散傅里叶变换只是取其一个主值周期而已。

下面详细阐述。


定义一个周期信号,它的主值区间就是一个有限长信号,然后对这个周期信号应用DFS。实际上可以定义一个新的变换称为离散傅里叶变换(DFT),它就是这个DFS的主值周期。这个DFT就是任意有限长序列的最终数值可计算的傅里叶变换。

首先定义一个有限长序列x(n),它在0leq 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},0leq k leq N-1

其中:W_N= e^{-j frac{2pi}{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实现

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/83474569

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。