信号与系统实验教程(MATLAB)(7)

2018-12-16 22:31

x1 = input(‘Type in the periodic signal x(t) over one period x1(t)=’); N = input(‘Type in the number N=’); k = -N:N; L = 2*N+1; ak = x1*exp(-j*k*w0*t’)*dt/T;

需要强调的是,时间变量的变化步长dt的大小对傅里叶级数系数的计算精度的影响非常

大,dt越小,精度越高,但是,计算机计算所花的时间越长。

例题2-1:给定一个周期为T1 = 2s的连续时间周期方波信号,如图所示,其一个周期内的数

学表达式为:

x1(t)???1,?0,0?t?1

1?t?2-2 -1 1 x(t) 0 1 2 t 解:首先,我们根据前面所给出的公式,计算该信号的傅里叶级数的系数。

T1/21图2.1 周期方波信号

10?jk?t1e1?jk?t1100?jk?t?jk?t?ed(?jk?t)?edt?ak?x(t)edt01?j2k?0?2??j2k?0T1?T?/200001?e?1?e?j2k?0?jk?0k?j?02ek?j?02?e?j2k?0kj?02ksin(?0)?jk?02?e2 k?0sin(因为:?0 = 2π/T1 = π,代入上式得到:ak?(?j)kk?k?)2

在MATLAB命令窗口,依次键入:

>> k = -10:10;

>> ak = ((-j).^k).* (sin((k+eps)*pi/2)./((k+eps)*pi)) % The expression of ak ak =

Columns 1 through 4

-0.0000 0 + 0.0354i -0.0000 0 + 0.0455i Columns 5 through 8

-0.0000 0 + 0.0637i -0.0000 0 + 0.1061i Columns 9 through 12

-0.0000 0 + 0.3183i 0.5000 0 - 0.3183i Columns 13 through 16

-0.0000 0 - 0.1061i -0.0000 0 - 0.0637i Columns 17 through 20

-0.0000 0 - 0.0455i -0.0000 0 - 0.0354i Column 21

-0.0000

31

从MATLAB命令窗口,我们得到了该周期信号从a?10到a10共21个系数。 紧接着再键入以下命令:

>> subplot(221)

>> stem(k,abs(ak),'k.')

>> title('The Fourier series coefficients') >> xlabel('Frequency index k')

就得到一幅如右图所示的描述ak与k之间的关系的

图形。

以上是我们通过手工计算得到的这个周期信号的傅里叶级数表达式及其频谱图,下面给出完成傅里叶级数系数计算的相应MATLAB范例程序。

% Program2_1

% This program is used to evaluate 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 % Periodically extend x1(t) to form a periodic signal x = x + u(t-m*T) - u(t-1-m*T-dt); end

w0 = 2*pi/T;

N = 10; % The number of the harmonic components L = 2*N+1;

for k = -N: N; % Evaluate the Fourier series coefficients ak ak(N+1+k) = (1/T)*x1*exp(-j*k*w0*t')*dt; end

phi = anglel(ak); % Evaluate the phase of ak

执行程序Program2_1后,就完成了信号的傅里叶级数的系数的计算,在命令窗口键入

>> ak

命令窗口就可以显示傅里叶级数的21个系数:

ak =

Columns 1 through 4

0.0000 + 0.0000i 0.0000 + 0.0354i 0.0000 - 0.0000i 0.0000 + 0.0455i Columns 5 through 8

0.0000 - 0.0000i 0.0000 + 0.0637i 0.0000 - 0.0000i 0.0000 + 0.1061i Columns 9 through 12

0.0000 - 0.0000i 0.0000 + 0.3183i 0.5000 0.0000 - 0.3183i Columns 13 through 16

0.0000 + 0.0000i 0.0000 - 0.1061i 0.0000 + 0.0000i 0.0000 - 0.0637i Columns 17 through 20

32

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


信号与系统实验教程(MATLAB)(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2011年期货市场教程(第七版)第十章

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: