发布时间 : 星期五 文章信号与系统实验教程(MATLAB)更新完毕开始阅读73fad718783e0912a3162a4a
0.0000 + 0.0000i 0.0000 - 0.0455i 0.0000 + 0.0000i 0.0000 - 0.0354i Column 21
0.0000 - 0.0000i
将这里的ak之值同前面手工计算得到的ak比较,可见两者是完全相同的。
再次特别提示:程序中,时间变量的变化步长
dt的大小对傅里叶级数系数的计算精度的
影响非常大,dt越小,精度越高,本程序中的dt之所以选择0.00001就是为了提高计算精度。但是,计算机所花的计算时间越长。
在程序Program2_1中添加相应的计算| ak |和绘图语句,就可以绘制出信号的幅度谱和相位谱的谱线图。
4.2 周期信号的合成以及Gibbs现象
从傅里叶级数的合成式(Synthesis equation)
?x(t)?k????aekjk?0t
可以看出,用无穷多个不同频率和不同振幅的周期复指数信号可以合成一个周期信号。然而,我们无法用计算机实现对无穷多个周期复指数信号的合成。但是,用有限项来合成却是可行的,在实际应用中,多半也就是这么做的。然而,这样做的一个必然结果,就是引入了误差。
如果一个周期信号在一个周期有内断点存在,那么,引入的误差将除了产生纹波之外,还将在断点处产生幅度大约为9%的过冲(Overshot),这种现象被称为吉伯斯现象(Gibbs phenomenon)。
为了能够观察到合成信号与原信号的不同以及Gibbs现象,我们可以利用前面已经计算出的傅里叶级数的系数,计算出截短的傅里叶级数:
x(t)?k??N?aekNjk?0t
这个计算可用L = 2N+1次循环来完成:
x2?x2?ak(r)?ej(r?1?N)?0t
其中r作为循环次数,x2在循环之前应先清零。完成这一计算的MATLAB程序为:
x2 = 0; L = 2*N+1; for r = 1:L;
x2 = x2+ak(r)*exp(j*(r-1-N)*w0*t); end;
完成了所有的计算之后,就可以用绘图函数:plot()和stem()将计算结果包括x1, x2, abs(ak)和angle(ak)以图形的形式给出,便于我们观察。
观察吉伯斯现象的最好的周期信号就是图2-1所示的周期方波信号,这种信号在一个周期内有两个断点,用有限项级数合成这个信号时,吉伯斯现象的特征非常明显,便于观察。
例题2-2:修改程序Program2_1,使之能够用有限项级数合成例题2-1所给的周期方波信号,
并绘制出原始周期信号、合成的周期信号、信号的幅度谱和相位谱。
33
为此,只要将前述的for循环程序段和绘图程序段添加到程序Program2_1中即可,范例程序如下:
% Program2_2
% This program is used to compute the Fourier series coefficients ak of a periodic square wave clear,close all
T = 2; dt = 0.00001; t = -2:dt:2; x1 = u(t)-u(t-1-dt); x = 0; for m = -1:1
x = x + u(t-m*T) - u(t-1-m*T-dt); % Periodically extend x1(t) to form a periodic signal end
w0 = 2*pi/T;
N = input('Type in the number of the harmonic components N = :'); L = 2*N+1; for k = -N:1:N;
ak(N+1+k) = (1/T)*x1*exp(-j*k*w0*t')*dt; end
phi = angle(ak); y=0;
for q = 1:L; % Synthesiz the periodic signal y(t) from the finite Fourier series y = y+ak(q)*exp(j*(-(L-1)/2+q-1)*2*pi*t/T); end;
subplot(221),
plot(t,x), title('The original signal x(t)'), axis([-2,2,-0.2,1.2]), subplot(223),
plot(t,y), title('The synthesis signal y(t)'), axis([-2,2,-0.2,1.2]), xlabel('Time t'), subplot(222)
k=-N:N; stem(k,abs(ak),'k.'), title('The amplitude |ak| of x(t)'), axis([-N,N,-0.1,0.6]) subplot(224)
stem(k,phi,'r.'), title('The phase phi(k) of x(t)'), axis([-N,N,-2,2]), xlabel('Index k') 在用这个程序观察吉伯斯现象时,可以反复执行该程序,每次执行时,输入不同之N值,比较所的图形的区别,由此可以观察到吉伯斯现象的特征。
5 用MATLAB实现CTFT及其逆变换的计算 5.1 用MATLAB实现CTFT的计算
MATLAB进行傅里叶变换有两种方法,一种利用符号运算的方法计算,另一种是数值计算,本实验要求采用数值计算的方法来进行傅里叶变换的计算。严格来说,用数值计算的方法计算连续时间信号的傅里叶变换需要有个限定条件,即信号是时限信号(Time limited signal),也就是当时间|t|大于某个给定时间时其值衰减为零或接近于零,这个条件与前面提到的为什么不能用无限多个谐波分量来合成周期信号的道理是一样的。计算机只能处理有限大小和有限数量的数。
采用数值计算算法的理论依据是:
34
? X(j?)????x(t)eN?j?tdt?lim?x(kT)e?jk?TT
T?0k????若信号为时限信号,当时间间隔T取得足够小时,上式可演变为:
X(j?)?Tk??N?x(kT)e?jk?T
?[x(t1),x(t2),?,x(t2N?1)]?[e?j?t1,e?j?t2,?,e?j?t2N?1]T
上式用MATLAB表示为:
X=x*exp(j*t’*w)*T
其中X为信号x(t)的傅里叶变换,w为频率Ω,T为时间步长。 相应的MATLAB程序:
T = 0.01; dw = 0.1; %时间和频率变化的步长 t = -10:T:10;
w = -4*pi:dw:4*pi;
X(j?)可以按照下面的矩阵运算来进行:
X=x*exp(-j*t’*?)*T; %傅里叶变换 X1=abs(X); %计算幅度谱 phai=angle(X); %计算相位谱
为了使计算结果能够直观地表现出来,还需要用绘图函数将时间信号x(t),信号的幅度谱|X(j?)|和相位谱? X(j?)分别以图形的方式表现出来,并对图形加以适当的标注。
5.2 用MATLAB实现傅里叶逆变换
连续时间傅里叶逆变换可用式2.7进行计算。式2.7重写如下:
1x(t)?2??j?tX(j?)ed? ???从定义式可看出,其计算方法与傅里叶变换是一样的,因此可以采用同样的矩阵运算的方
法来计算,即
x(t)=X(j?)*exp(j?’*t)*d? 具体的MATLAB函数如下:
t = -5:0.01;5; % 指定信号的时间范围,此范围应根据信号的持续时间确定。 dw = 0.1; w = -4*pi:d?:4*pi;
X = input(‘Type in the expression of X(jw)’); x = X* exp(jw’*t)*dw;
然后用绘图函数就可以绘制出逆变换得到的时域信号波形图。
三、实验内容和要求
实验前,必须首先阅读本实验原理,读懂所给出的全部范例程序。实验开始时,先在计算机上运行这些范例程序,观察所得到的信号的波形图。并结合范例程序应该完成的工作,进一步分析程序中各个语句的作用,从而真正理解这些程序。
35
实验前,一定要针对下面的实验项目做好相应的实验准备工作,包括事先编写好相应的实验程序等事项。
Q2-1 编写程序Q2_1,绘制下面的信号的波形图:
?111n?(0t)?cos3(?0t)?cos5(?0t)????sin()cosn( x(t)?cos??0t)
352n?1n其中,?0 = 0.5π,要求将一个图形窗口分割成四个子图,分别绘制cos(?0t)、cos(3?0t)、cos(5?0t)
和x(t) 的波形图,给图形加title,网格线和x坐标标签,并且程序能够接受从键盘输入的和式中的项数。
抄写程序Q2_1如下:
执行程序Q2_1所得到的图形如下:
Q2-2 给程序Program2_1增加适当的语句,并以Q2_2存盘,使之能够计算例题2-1中的周期
方波信号的傅里叶级数的系数,并绘制出信号的幅度谱和相位谱的谱线图。
通过增加适当的语句修改Program2_1而成的程序Q2_2抄写如下:
36