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

版权声明:本博客内容来自于个人学习过程中的总结,参考了互联网、数据手册、帮助文档、书本以及论文等上的内容,仅供学习交流使用,如有侵权,请联系,我会重写!转载请注明地址! https://blog.csdn.net/Reborn_Lee/article/details/83449896

有关离散傅里叶级数(DFS)我之前也写过一些博文,例如:离散周期信号的傅里叶级数(DFS)

这里我再次给出标准公式。

分析式:

\tilde X(k) = DFS[\tilde x(n)] = \sum_{n = 0}^{N-1}\tilde x(n)W_N ^{nk}

其中:

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

综合式:

\tilde x(n) = IDFS[\tilde X(n)] = \frac{1}{N}\sum_{k = 0}^{N-1}\tilde X(k)W_N^{-nk}

这里我必须先声明,关于分析式和综合式前面那个系数1/N,到底在分析式的前面还是综合式的前面,不同的书籍定义还不一样,这个我们无所谓了。这里先以这里为准!

先看看分析式,使用MATLAB进行编程时,我们可以使用循环嵌套的方式编程,但是这样做不高效并且很麻烦,这不是我们提倡的做法,我们提倡使用向量化编程,我顺手推到了一下向量化编程的形式:

这里声明,n,k都是行向量,x以及X都是列向量的前提下推导的。

给出手稿版,写的不太详细,但是我想看我这篇博文的人肯定都是本专业的人,所以应该是能看懂的,只需点播而已:

根据这个最后的形式,我们给出dfs的函数程序,为了编程方便,我们同时约定X以及x也为行向量吧。

function [Xk] = dfs(xn,N)
% Computes Discrete Fourier Series Coefficients
%______________________________________________
% [Xk] = dfs(xn,N)
% Xk = DFS coefficients array over 0 <= k <= N - 1
% xn = One period of periodic signal over 0 <= n <= N - 1
% N = Fundamental period of xn

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;   %DFS matrix
Xk = xn * WNnk;


下面研究IDFS,同样给出手稿版推导向量化编程方案:

上面少了一个负号,在所有的n*k的值前面加一个负号即可。

直接给出MATLAB函数:

function [xn] = idfs(Xk,N)
% Computes Discrete Fourier Series Coefficients
%______________________________________________
% [xn] = idfs(Xk,N)
% Xk = DFS coefficients array over 0 <= k <= N - 1
% xn = One period of periodic signal over 0 <= n <= N - 1
% N = Fundamental period of xn

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);   %IDFS matrix
xn = (Xk*WNnk)/N;

上面的推导可谓是一目了然,那么下面给出一个小例子,来体会下这两个函数的应用。

clc;clear;close all;

xn = [0,1,2,3];
N = 4;
Xk = dfs(xn,N)

xn = idfs(Xk,N)

Xk =

   6.0000 + 0.0000i  -2.0000 + 2.0000i  -2.0000 - 0.0000i  -2.0000 - 2.0000i


xn =

   0.0000 - 0.0000i   1.0000 - 0.0000i   2.0000 - 0.0000i   3.0000 + 0.0000i

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/83449896