实验11 离散傅里叶级数(DFS)
(完美格式版,本人自己完成,所有语句正确,不排除极个别错误,特别适用于山大,勿用
冰点等工具下载,否则下载之后的word格式会让很多部分格式错误,谢谢)
XXXX学号姓名处XXXX
一、实验目的
1、加深对离散周期序列傅里叶级数(DFS)基本概念的理解。
2、掌握用MATLAB语言求解周期序列傅里叶级数变换和逆变换的方法。 3、观察离散周期序列的重复周期数对频谱特性的影响。
4、了解离散序列的周期卷积及其线性卷积的区别。
二、实验内容
1、周期序列的离散傅里叶级数。
2、周期序列的傅里叶级数变换和逆变换。 3、离散傅里叶变换和逆变换的通用子程序。 4、周期重复次数对序列频谱的影响。 5、周期序列的卷积和。
三、实验环境
MATLAB7.0
四、实验原理
用matlab进行程序设计,利用matlab绘图十分方便,它既可以绘制各种图形,包括二维图形和三位图形,还可以对图像进行装饰和控制。
1、周期序列的离散傅里叶级数
(1)连续性周期信号的傅里叶级数对应的第k次谐波分量的系数为无穷多。而周期为N的周期序列,其离散傅里叶级数谐波分量的系数只有N个是独立的。
(2)周期序列的频谱 也是一个以N为周期的周期序列。
2、周期序列的傅里叶级数变换和逆变换
例11-1 已知一个周期性矩形序列的脉冲宽度占整个周期的1/4,一个周期的采样点数为16点,显示3个周期的信号序列波形。要求: (1)用傅里叶级数求信号的幅度频谱和相位频谱。
(2)求傅里叶级数逆变换的图形,与原信号图形进行比较。
解 MATLAB程序如下:
N=16;
xn=[ones(1,N/4),zeros(1,3*N/4)]; xn=[xn,xn,xn]; n=0:3*N-1;
k=0:3*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)');axis([-1,3*N,1.1*min(xn),1.1*max(xn)]); subplot(2,2,2),stem(n,abs(x)); %显示逆变换结果 title('IDFS|X(k)|');
axis([-1,3*N,1.1*min(x),1.1*max(x)]); subplot(2,2,3),stem(k,abs(Xk)); %显示序列的幅度谱 title('|X(k)|');
axis([-1,3*N,1.1*min(abs(Xk)),1.1*max(abs(Xk))]); subplot(2,2,4),stem(k,angle(Xk)); %显示序列的相位谱 title('arg|X(k)|');
IDFS|X(k)|x(n)axis([-1,3*N,1.1*min(angle(Xk)), 1.1*max(angle(Xk))]); 1运行结果如图11-1所示。 8 0.86 0.6 40.4
20.2
0 010203040010203040
|X(k)|arg|X(k)|
12 210
18
60
4 -12
010203040010203040
图11-1
由离散傅里叶级数逆变换图形可见,与原信号相比,幅度扩大了32倍。 这是因为周期序列为原主值序列周期的3倍,做逆变换时未做处理。可以将逆变换程序改为 x=Xk*exp(j*2*pi/N).^(n¢*k)/(3*3*N);
3、离散傅里叶级数变换和逆变换的通用子程序
由例11-1可见,周期序列进行傅里叶级数变换和逆变换,是依据变换公式进行程序编写的,无论信号序列如何变化,求解的公式总是一样的。因此,可以将其编写成通用子程序。
(1)离散傅里叶级数变换通用子程序dfs.m:
function[Xk]=dfs(xn,N); n=0:N-1; k=0:N-1;
WN=exp(-j*2*pi/N); nk=n'*k;
Xk=xn*WN.^nk;
(2)离散傅里叶级数逆变换通用子程序idfs.m:
Function[xn]=idfs(Xk,N) n=0:N-1; k=0:N-1;
WN=exp(j*2*pi/N); nk=n'*k;
xn=(Xk*WN.^nk)/N;
例11-2 利用上述两个子程序,再做一遍例11-1。
解 由于需要调用子程序,其中通用子程序仅适用于对主值区间进行傅里叶级数变换和逆变换,周期次数无法传递给通用子程序,因此程序执行的结果仅显示图11-1中一个周期的情况。
N=16;
xn=[ones(1,N/4),zeros(1,3*N/4)]; n=0:N-1;
Xk=dfs(xn,N); %离散傅里叶级数变换 xn1=idfs(Xk,N); %离散傅里叶级数 逆变换 subplot(2,2,1),stem(n,xn); axis([0,N-1,0,1.1*max(xn)]); title('x(n)');
subplot(2,2,2),stem(n,abs(xn1)); %显示逆变换结果 axis([0,N-1,0,1.1*max(abs(xn1))]); title('idfs|X(k)|');
subplot(2,2,3),stem(n,abs(Xk)); %显示序列的幅度谱 title('|X(k)|');
subplot(2,2,4),stem(n,angle(Xk)); %显示序列的相位谱
idfs|X(k)|title('arg|X(k)|'); x(n)11运行结果如图11-2所示。 0.80.8 0.60.6 0.40.4 0.20.2 0005101551015 0 |X(k)|arg|X(k)|44 3 2 2 01
0-2 051015051015
图11-2
4、周期重复次数对序列频谱的影响
理论上讲,周期序列不满足绝对可积条件,因此不能用傅里叶级数变换来表示。要对周期序列进行分析,可以先取K个周期进行处理,然后再让K无限增大,研究其极限情况。由这一分析思路,可以观察信号序列由非周期到周期变化时,频谱由连续谱逐渐向离散谱过渡的过程。
下面举例说明信号采用不同的重复周期次数对序列频谱的影响。
例11-3 已知一个矩形序列的脉冲宽度占整个周期的1/2,一个周期的采样点数为10点,用傅里叶级数变换求信号的重复周期数分别为1、4、7、10时的幅度频谱。
解 MATLAB程序如下:
xn=[ones(1,5),zeros(1,5)]; %建立一个周期的时域信号 Nx=length(xn);
Nw=1000;dw=2*pi/Nw; %把2p分为Nw份,频率分辨率为dw k=floor((-Nw/2-0.5):(Nw/2+0.5)); %建立关于0轴对称的频率向量 for r=0:3 K=3*r+1;
nx=0:(K*Nx-1); %周期延拓后的时间向量 x=xn(mod(nx,Nx)+1); %周期延拓后的时间信号x Xk=x*(exp(-j*dw*nx'*k))/K; %进行傅里叶级数变换 subplot(4,2,2*r+1),stem(nx,x);
axis([0,K*Nx-1,0,1.1]);ylabel('x(n)'); subplot(4,2,2*r+2),plot(k*dw,abs(Xk)); axis([-4,4,0,1.1*max(abs(Xk))]); ylabel('X(k)'); 15end X(k)x(n)0.5程序运行结果如图11-3所示。 002468
1
0.5
0 0102030 1
0.5
0
0204060 1
0.5 0020406080
0-45X(k)-2024x(n)0-45X(k)-2024x(n)0-45X(k)-2024x(n)0-4-2024图11-3
注意mod函数的用法,由于MATLAB中变量的下标由1开始,而mod函数的结果却从零开始,因此语句中加1。
由图11-3可以看出,信号序列的周期数越多,则频谱越是向几个频点集中。当信号序列的周期数趋于无穷大时,频谱转化为离散谱。
~ 5、周期序列的卷积和x(n?m) x(m)~12时域周期序列的卷积和与频域周期序列的积相互对应。
注意:周期序列的卷积和与非周期序列的卷积和有所区别。
(1) 和 均为变量为m,周期为N的周期序列,故它们的乘积也是周期序列。
~~x1(2) (2)卷积求和是在一个周期内进行的,即从m=0到m=xN2-1。
(3)如果x1(n)和x2(n)的周期长度不同,则卷积和的长度取N=max[N1,N2]。 下面举例说明。
例11-4 已知两个周期序列分别为 =[1,1,1,0,0,0], =[0,1,2,3,0,0],用图形表示它们的周期卷积和。
解 为了讨论问题的方便,例题选择两个序列均以N=6为周期,以动态图形演示其卷积和的过程。程序如下:
clf; %图形窗清屏 n=0:5; %建立时间向量n xn1=[0,1,2,3,0,0]; %建立xn1序列主值 xn2=[1,1,1,0,0,0];N=length(xn1); %建立xn2序列主值 nx=(-N:3*N-1);
hxn2=xn2(mod(nx,N)+1); %将xn2序列周期延拓
u=[zeros(1,N),xn2,zeros(1,2*N)]; %按xn2周期延拓后的长度重建主值信号
xn12=fliplr(xn1); %将xn1作左右反折
hxn1=xn1(mod(nx,N)+1); %将xn1反折后的序列周期延拓 N1=length(hxn1);
y=zeros(1,4*N); %将y存储单元初始化 for k=0:N-1 %动态演示绘图开始
p=[zeros(1,k+1),hxn1(1:N1-k-1)]; %使 hxn1向右循环移位 y1=u.*p; %使输入和翻转移位的脉冲过渡函数逐项相乘
yk=sum(y1); %相加
y([k+1,k+N+1,k+2*N+1,k+3*N+1])=yk; %将结果放入数组y subplot(4,1,1);stem(nx,hxn2);
axis([-1,3*N,0,1.1]);ylabel('x2(n)'); subplot(4,1,2);stem(nx,p);
axis([-1,3*N,0,3.3]);ylabel('x1(n)');
subplot(4,1,3);stem(k,yk); %作图表示主值区每一次卷积的结果 axis([-1,3*N,0,6.6]);hold on%在图形窗上保留每一次运行的图形结果
ylabel('主值区');
subplot(4,1,4);stem(nx,y);