DFS IDFS 离散傅里叶级数
要将信号进行时域到频域的变换,那么就离不开dfs 要变回去又离不来 Idfs 下面就是 matlab 实现的两个函数
很简单 用公式 下面是代码:
function [Xk] = dfs(xn,N )
n = [0: 1: N-1];
k = n;
WN = exp(-j*2*pi/N);
nk = n'*k ;
WNnk = WN.^nk;
Xk = xn*WNnk;
end
下面是idfs代码:
function[xn] = idfs(Xk, N)
n = [0 :1: N-1] ;
k = n;
WN = exp(-j*2*pi/N);
nk = n'*k;
WNnk = WN.^(-nk);
xn = Xk* WNnk/N;
end
其应用 给出周期方波 x(n) = 1 mN <= n <= mN + L -1 0 mN + L <= n <= (m+1)N -1 m 为0 -1 +1 。。。。。 L/N为占空比 给出X (k) 的曲线 这里要注意的是要进行fftshift 搬移之后才会形成对称的图形 才能形成 k = [-N / 2 : N /2] ; 且没有那么长那就用0 补 代码中一共实现了四种长不同L值的变换 代码实现:
clf ;
L = 5 ;
N = 20 ;
xn =[ones(1,L) zeros(1,N-L)];
k = [-N/2:N/2];
Xk = dfs(xn, N);
magXk = abs([Xk(N/2 + 1:N ), Xk(1:N/2+1)]);
subplot(221);
stem(k, magXk);
xlabel('k');
ylabel('Xk');
title('L = 5 , N = 20 wave ');
L = 5 ;
N = 40 ;
xn =[ones(1,L) zeros(1,N-L)];
k = [-N/2:N/2];
Xk = dfs(xn, N);
magXk = abs([Xk(N/2 + 1:N ), Xk(1:N/2+1)]); % 这个的目的就有点类似于fftshift
subplot(222);
stem(k, magXk);
xlabel('k');
ylabel('Xk');
title('L = 5 , N = 40 wave ');
L = 6 ;
N = 40 ;
xn =[ones(1,L) zeros(1,N-L)];
k = [-N/2:N/2];
Xk = dfs(xn, N);
magXk = abs([Xk(N/2 + 1:N ), Xk(1:N/2+1)]);
subplot(223);
stem(k, magXk);
xlabel('k');
ylabel('Xk');
title('L = 6 , N = 40 wave ');
L = 7;
N = 20 ;
xn =[ones(1,L) zeros(1,N-L)];
k = [-N/2:N/2];
Xk = dfs(xn, N);
magXk = abs([Xk(N/2 + 1:N ), Xk(1:N/2+1)]);
subplot(224);
stem(k, magXk);
xlabel('k');
ylabel('Xk');
title('L = 7 , N = 20 wave ');