MATLAB离散傅里叶变换及应用
一、DFT与IDFT、DFS、DTFT的联系
序列的傅里叶变换(DFT)和逆变换(IDFT)
在实际中常常使用有限长序列。如果有限长序列信号为x(n),则该序列的离散傅里叶变换对可以表示为
(12-1)
(12-2)
已知x(n)=[0,1,2,3,4,5,6,7],求x(n)的DFT和IDFT。要求:
(1)画出序列傅里叶变换对应的|X(k)|和arg[X(k)]图形。
(2)画出原信号与傅里叶逆变换IDFT[X(k)]图形进行比较。
程序源代码:
xn=[0,1,2,3,4,5,6,7];
N=length(xn);
n=0:(N-1);k=0:(N-1);
Xk=xn*exp(-j*2*pi/N).^(n'*k);
x=(Xk*exp(j*2*pi/N).^(n'*k))/N;
subplot(2,2,1),stem(n,xn);
title('x(n)');
subplot(2,2,2),stem(n,abs(x));
title('IDFT|X(k)|');
subplot(2,2,3),stem(k,abs(Xk));
title('|X(k)|');
subplot(2,2,4),stem(k,angle(Xk));
title('arg|X(k)|');
运行图如下:
从得到的结果可见,与周期序列不同的是,有限长序列本身是仅有N点的离散序列,相当于周期序列的主值部分。因此,其频谱也对应序列的主值部分,是含N点的离散序列。
序列DFT与周期序列DFS
已知周期序列的主值x(n)=[0,1,2,3,4,5,6,7],求x(n)周期重复次数为4次时的DFS。要求:
(1)画出原主值和信号周期序列信号。
(2)画出序列傅里叶变换对应的和的图形。
程序源代码:
xn=[0,1,2,3,4,5,6,7];
N=length(xn);
n=0:4*N-1;k=0:4*N-1;
xn1=xn(mod(n,N)+1);
Xk=xn1*exp(-j*2*pi/N).^(n'*k);
subplot(2,2,1),stem(xn);
title('原主值信号x(n)');
subplot(2,2,2),stem(n,xn1);
title('周期序列信号');
subplot(2,2,3),stem(k,abs(Xk));
title('|X(k)|');
subplot(2,2,4),stem(k,angle(Xk));
title('arg|X(k)|');
运行结果如下:
由这个周期序列的实验我们可以看出,有限长序列x(n)可以看成是周期序列的一个周期;反之,周期序列可以看成是有限长序列x(n)以N为周期的周期延拓。频域上的情况也是相同的。从这个意义上说,周期序列只有有限个序列值有意义。
序列DFT与离散时间傅里叶变换DTFT的联系
求x(n)=[0,1,2,3,4,5,6,7],0≤n≤7的DTFT,将(-2p,2p)区间分成500份。要求:
(1)画出原信号。
(2)画出由离散时间傅里叶变换求得的幅度谱X(ejw)和相位谱arg[X(ejw)]图形。
程序源代码:
xn=[0,1,2,3,4,5,6,7];
N=length(xn);
n=0:N-1;
w=linspace(-2*pi,2*pi,500);
X=xn*exp(-j*n'*w);
subplot(3,1,1),stem(n,xn,'k');
ylabel('x(n)');
subplot(3,1,2),plot(w,abs(X),'k');
axis([-2*pi,2*pi,1.1*min(abs(X)),1.1*max(abs(X))]);
ylabel('幅度谱');
subplot(3,1,3),plot(w,angle(X),'k');
axis([-2*pi,2*pi,1.1*min(angle(X)),1.1*max(angle(X))]);
ylabel('相位谱');
运行结果如下:
由图12-3可以看出,两者有一定的差别。主要原因在于,该例进行DTFT时,X(ejw)在单位圆上取250个点进行分割;而图12-1进行DFT时,X(k)是在单位圆上N=8的等间距点上取值,X(k)的序列长度与X(ejw)相比不够长。
4仍然用x(n)=[0,1,2,3,4,5,6,7],将x(n)的有限长序列后面补足至N=100,求其DFT,并与例3进行比较。
程序源代码:
N=100;
xn=[0,1,2,3