数字信号处理上机指导.docx

上传人:b****8 文档编号:9392909 上传时间:2023-05-18 格式:DOCX 页数:33 大小:212.76KB
下载 相关 举报
数字信号处理上机指导.docx_第1页
第1页 / 共33页
数字信号处理上机指导.docx_第2页
第2页 / 共33页
数字信号处理上机指导.docx_第3页
第3页 / 共33页
数字信号处理上机指导.docx_第4页
第4页 / 共33页
数字信号处理上机指导.docx_第5页
第5页 / 共33页
数字信号处理上机指导.docx_第6页
第6页 / 共33页
数字信号处理上机指导.docx_第7页
第7页 / 共33页
数字信号处理上机指导.docx_第8页
第8页 / 共33页
数字信号处理上机指导.docx_第9页
第9页 / 共33页
数字信号处理上机指导.docx_第10页
第10页 / 共33页
数字信号处理上机指导.docx_第11页
第11页 / 共33页
数字信号处理上机指导.docx_第12页
第12页 / 共33页
数字信号处理上机指导.docx_第13页
第13页 / 共33页
数字信号处理上机指导.docx_第14页
第14页 / 共33页
数字信号处理上机指导.docx_第15页
第15页 / 共33页
数字信号处理上机指导.docx_第16页
第16页 / 共33页
数字信号处理上机指导.docx_第17页
第17页 / 共33页
数字信号处理上机指导.docx_第18页
第18页 / 共33页
数字信号处理上机指导.docx_第19页
第19页 / 共33页
数字信号处理上机指导.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数字信号处理上机指导.docx

《数字信号处理上机指导.docx》由会员分享,可在线阅读,更多相关《数字信号处理上机指导.docx(33页珍藏版)》请在冰点文库上搜索。

数字信号处理上机指导.docx

数字信号处理上机指导

实验一离散时间信号的MATLAB实现

1.正弦序列

离散正弦序列的MATLAB表示与连续信号类似,只不过是用stem函数而不是用plot函数来画出序列的波形。

下面就是正弦序列

的MATLAB源程序。

程序运行结果如图1.1所示。

%正弦序列实现程序

k=0:

39;

fk=sin(pi/6*k);

stem(k,fk)

图1.1正弦序列波形

2.指数序列

离散指数序列的一般形式为

,可用MATLAB中的数组幂运算(即点幂运算)c*

来实现。

下面为用MATLAB编写绘制离散时间实指数序列波形的函数。

functiondszsu(c,a,k1,k2)

%c:

指数序列的幅度

%a:

指数序列的底数

%k1:

绘制序列的起始序号

%k2:

绘制序列的终止序号

k=k1:

k2;

x=c*(a.^k);

stem(k,x,'filled')

holdon

plot([k1,k2],[0,0])

holdoff

利用上述函数,实现实指数波形MATLAB程序如下(其中

值分别为

)。

%离散时间实指数序列实现程序

subplot221;

dszsu(1,5/4,0,20);

xlabel('k');

title('f1[k]');

subplot222

dszsu(1,3/4,0,20);

xlabel('k');

title('f2[k]');

subplot223;

dszsu(1,-5/4,0,20);

xlabel('k');

title('f3[k]');

subplot224;

dszsu(1,-3/4,0,20);

xlabel('k');

title('f4[k]');

分析程序运行结果,对于离散时间实指数序列

,当

的绝对值大于1时,序列为随时间发散的序列,当

的绝对值小于1时,序列为随时间收敛的序列。

同时可见,当

的值小于零时,其波形在增长或衰减的同时,还交替地改变序列值的符号。

对于离散时间虚指数序列,可用通过调用下列绘制虚指数序列时域波形的MATLAB函数。

function[]=dxzsu(n1,n2,w)

%n1:

绘制波形的虚指数序列的起始时间序号

%n2:

绘制波形的虚指数序列的终止时间序号

%w:

虚指数序列的角频率

k=n1:

n2;

f=exp(i*w*k);

Xr=real(f)

Xi=imag(f)

Xa=abs(f)

Xn=angle(f)

subplot(2,2,1),stem(k,Xr,'filled'),title('实部');

subplot(2,2,3),stem(k,Xi,'filled'),title('虚部');

subplot(2,2,2),stem(k,Xa,'filled'),title('模');

subplot(2,2,4),stem(k,Xn,'filled'),title('相角');

利用上述函数,实现虚指数波形MATLAB程序如下(其中虚指数分别为

%离散时间虚指数实现程序

figure

(1);

dxzsu(0,20,pi/4);

figure

(2);

dxzsu(0,20,2);

程序运行结果如图1.21(a)、(b)所示。

由图可见,只有当虚指数序列的角频率满足

为有理数时,信号的实部和虚部和相角都为周期序列,否则为非周期序列。

(a)

波形(b)

波形

图1.2虚指数序列波形

对于复指数序列,其一般形式为

可以通过调用下面绘制复指数序列时域波形的MATLAB函数。

functiondfzsu(n1,n2,r,w)

%n1:

绘制波形的虚指数序列的起始时间序号

%n2:

绘制波形的虚指数序列的终止时间序号

%w:

虚指数序列的角频率

%r:

指数序列的底数

k=n1:

n2;

f=(r*exp(i*w)).^k;

Xr=real(f);

Xi=imag(f);

Xa=abs(f);

Xn=angle(f);

subplot(2,2,1),stem(k,Xr,'filled'),title('实部');

subplot(2,2,3),stem(k,Xi,'filled'),title('虚部');

subplot(2,2,2),stem(k,Xa,'filled'),title('模');

subplot(2,2,4),stem(k,Xn,'filled'),title('相角');

利用上述函数,实现复指数序列波形MATLAB程序如下。

%复指数序列实现程序(r>1)

figure

(1);

dfzsu(0,20,1.2,pi/4);

%复指数序列实现程序(0

figure

(2);

dfzsu(0,20,0.8,pi/4);

%复指数序列实现程序(r=1)

figure(3);

dfzsu(0,20,1,pi/4);

其运行结果如图1.22(a)、(b)、(c)所示。

如图可见,当r>1时,复指数序列的实部和虚部分别为幅度按指数增长的正弦序列;当0

3.单位抽样序列

可以通过借助MATLAB中的零矩阵函数zeros表示。

全零矩阵zeros(1,N)产生一个由N个零组成的列向量,对于有限区间的

可以通过以下MATLAB程序表示

%单位抽样序列实现程序

k=-30:

30;

delta=[zeros(1,30),1,zeros(1,30)];

stem(k,delta)

4.单位阶跃序列

可以通过借助MATLAB中的单位矩阵函数ones表示。

单位矩阵ones(1,N)产生一个由N个1组成的列向量,对于有限区间的

可以通过以下MATLAB程序表示

%单位阶跃序列实现程序

k=-30:

30;

uk=[zeros(1,30),ones(1,31)];

stem(k,uk)

程序运行结果如图1.24所示。

例1.7编写程序来产生下列基本脉冲序列。

(1)单位抽样序列,起点ns=0,终点nf=10,在n0=3处有一单位脉冲。

(2)单位阶跃序列,起点ns=0,终点nf=10,在n0=3前为0,在ns=3后为1。

(3)复指数序列,σ=-0.2,ω0=0.5。

解:

程序清单如下。

clear,n0=3;ns=0;nf=10;

n1=[ns:

nf];x1=[zeros(1,n0-ns),1,zeros(1,nf-n0)];%单位抽样序列的产生

n2=[ns:

nf];x2=[zeros(1,n0-ns),ones(1,nf-n0+1)];%单位阶跃序列的产生

n3=[ns:

nf];x3=exp((-0.2+0.5j)*n3);%复指数序列的产生

subplot(2,2,1),stem(n1,x1);title('单位脉冲序列δ(n-3)');%画图表示单位抽样序列

subplot(2,2,2),stem(n2,x2);title('单位阶跃序列u(n-3)');%画图表示单位阶跃序列

subplot(2,2,3),stem(n3,real(x3));line([0,10],[0,0])

title('复指数序列');ylabel('实部');%画图表示复指数序列的实部

subplot(2,2,4),stem(n3,imag(x3));line([0,10],[0,0])

title('复指数序列');ylabel('虚部');

实验二利用MATLAB实现频谱分析

例1已知有限长序列

的长度

,且

,用FFT求

,再用IFFT求

解:

利用快速傅里叶变换函数求解的MATLAB实现程序清单如下

clear

xn=[1,2,-1,3];

X=fft(xn)

x=ifft(X)

程序运行结果如下

X=

5.00002.0000+1.0000i-5.00002.0000-1.0000i

x=

12-13

例2设

是由两个正弦信号及白噪声的叠加,试用FFT文件对其作频谱分析。

图2.1运行结果

解:

程序清单如下

图4.14

应用实例

%产生两个正弦加白噪声;

N=256;

f1=.1;f2=.2;fs=1;

a1=5;a2=3;

w=2*pi/fs;

x=a1*sin(w*f1*(0:

N-1))+a2*sin(w*f2*(0:

N-1))+randn(1,N);

%应用FFT求频谱;

subplot(2,2,1);

plot(x(1:

N/4));

title('原始信号');

f=-0.5:

1/N:

0.5-1/N;

X=fft(x);

y=ifft(X);

subplot(2,2,2);

plot(f,fftshift(abs(X)));

title('频域信号');

subplot(2,2,3);

plot(real(x(1:

N/4)));

title('时域信号');

运行结果如图4.14所示,该程序同时完成了傅里叶变换与傅里叶反变换。

例3设

为长度

的矩形序列,用MATLAB程序分析FFT取不同长度时

的频谱变化。

解:

的FFTMATLAB实现程序如下

x=[1,1,1,1,1,1];

N=8;

y1=fft(x,N);

n=0:

N-1;

subplot(3,1,1);stem(n,abs(y1),'.k');axis([0,9,0,6]);

N=32;

y2=fft(x,N);

n=0:

N-1;

subplot(3,1,2);stem(n,abs(y2),'.k');axis([0,40,0,6]);

N=64;

y3=fft(x,N);

n=0:

N-1;

subplot(3,1,3);stem(n,abs(y3),'.k');axis([0,80,0,6]);

运行结果

的频谱如图2.2所示

图2.2不同长度时

的频谱图

例3

,求其傅立叶变换

解:

严格说,在MATLAB中不使用symbolic工具箱是不能分析模拟信号的,但是当采样时间间隔充分小的时候,可产生平滑的图形,当时间足够长,可显示出所有的模型,也就是可以近似的分析。

此例中,

为fh=2000Hz的带限信号,因此取

程序清单如下。

Dt=0.00005;t=-0.005:

Dt:

0.005;%模拟信号

xa=exp(-1000*abs(t));

Wmax=2*pi*2000;K=500;k=0:

1:

K;W=k*Wmax/K;%连续时间傅立叶变换

Xa=xa*exp(-j*t'*W)*Dt;Xa=real(Xa);

W=[-fliplr(W),W(2:

501)];

Xa=[fliplr(Xa),Xa(2:

501)];

figure

(1)

subplot(2,1,1);plot(t*1000,xa,'.');

xlabel('tinmsec');ylabel('xa(t)');gtext('模拟信号');

subplot(2,1,2);plot(W/(2*pi*1000),Xa*1000,'.');

xlabel('FrequenceinKHz');ylabel('Xa(jw)*1000');gtext('连续时间傅立叶变换');

程序运行结果如图2.3所示。

图2.3模拟信号及傅立叶变换曲线

例4以上例中的

说明采样频率对频域特性的影响,分别取采样频率为fs=5000Hz和fs=1000Hz,绘出

曲线。

解:

程序清单如下。

Dt=0.00005;t=-0.005:

Dt:

0.005;%模拟信号

xa=exp(-1000*abs(t));

Ts=0.0002;n=-25:

1:

25;%离散时间信号

x=exp(-1000*abs(n*Ts));

K=500;k=0:

1:

K;w=pi*k/K;%离散时间傅立叶变换

X=x*exp(-j*n'*w);X=real(X);

w=[-fliplr(w),w(2:

501)];

X=[fliplr(X),X(2:

501)];

figure

subplot(2,1,1);plot(t*1000,xa,'.');ylabel('xa1(t)');

gtext('离散信号');holdon

stem(n*Ts*1000,x);holdoff

subplot(2,1,2);plot(w/pi,X,'.');ylabel('X1(jw)');

gtext('离散时间傅立叶变换');gtext('Ts=0.2msec')

程序运行结果如图2.4所示。

图2.4fs=5000Hz时的离散信号及傅立叶变换曲线

对上面的MATLAB程序稍加修改,就可以得到fs=1000Hz时的

,程序运行结果如图2.5所示。

可以看出,当fs=5000Hz时,

的曲线和例1.14中的

曲线完全一致,没有发生混叠现象,而当fs=1000Hz时,

的曲线与例1.14中的

曲线不同,产生了混叠的现象。

图2.5fs=1000Hz时的离散信号及傅立叶变换曲线

例5对上列例产生的离散序列x1(n)和x2(n),采用sinc函数进行内插重构。

解:

程序清单如下

Ts1=0.0002;Fs1=1/Ts1;n1=-25:

1:

25;nTs1=n1*Ts1;%离散时间信号

x1=exp(-1000*abs(nTs1));

Ts2=0.001;Fs2=1/Ts2;n2=-5:

1:

5;nTs2=n2*Ts2;

x2=exp(-1000*abs(nTs2));

Dt=0.00005;t=-0.005:

Dt:

0.005;%模拟信号重构

xa1=x1*sinc(Fs1*(ones(length(nTs1),1)*t-nTs1'*ones(1,length(t))));

xa2=x2*sinc(Fs2*(ones(length(nTs2),1)*t-nTs2'*ones(1,length(t))));

subplot(2,1,1);plot(t*1000,xa1,'.');ylabel('xa1(t)');

title('从x1(n)重构模拟信号xa(t)');holdon

stem(n1*Ts1*1000,x1);holdoff

subplot(2,1,2);plot(t*1000,xa2,'.');ylabel('xa2(t)');

title('从x2(n)重构模拟信号xa(t)');holdon

stem(n2*Ts2*1000,x2);holdoff

程序运行结果如图1.37所示。

将图2.6中的重构后的模拟信号曲线与图1.34中的原始模拟信号曲线进行比较,可以看出用离散信号x1(n)重构出的模拟信号与原始信号误差很小,而用离散信号x2(n)重构出的模拟信号误差较大,这是因为x2(n)的采样频率为fs=1000Hz,不满足采样定理fs>2fh,因此采样信号的频谱发生混叠造成取样信号不能无失真的恢复出原始信号。

图2.6从x1(n)和x2(n)分别重构模拟信号

实验三IIR数字滤波器的设计MATLAB实现

目前,设计IIR数字滤波器的通用方法是先设计相应的低通滤波器,然后再通过双线性变换法和频率变换得到所需要的数字滤波器。

模拟滤波器从功能上分有低通、高通、带通及带阻四种,从类型上分有巴特沃兹(Butterworth)滤波器、切比雪夫(Chebyshev)I型滤波器、切比雪夫II型滤波器、椭圆(Elliptic)滤波器以及贝塞尔(Bessel)滤波器等。

1应用MATLAB设计IIR数字滤波器相关文件

下面给出与IIR数字滤波器设计有关的MATLAB文件。

1.buttord.m

用来确定数字低通或模拟低通滤波器的阶次,其调用格式分别是

(1)[N,Wn]=buttord(Wp,Ws,Rp,Rs)

(2)[N,Wn]=buttord(Wp,Ws,Rp,Rs,‘s’)

格式

(1)对应数字滤波器,式中Wp,Ws分别上通带和阻带的截止频率,实际上它们是归一化频率,其值在0~1之间,1对应抽样频率的一半。

对低通和高通滤波器,Wp,Ws都是标量,对带通和带阻滤波器,Wp,Ws都是

的向量。

Rp,Rs分别是通带和阻带的衰减,单位为dB。

N是求出的相应低通滤波器的阶次,Wn是求出的3dB频率,它和Wp稍有不同。

格式

(2)对应模拟滤波器,式中各个变量的含义与格式

(1)相同,但Wp,Ws及Wn的单位为rad/s,因此,它们实际上是频率。

2.buttap.m

用来设计模拟低通原型滤波器

,其调用格式是

[z,p,k]=buttap(N)

N是欲设计的低通原型滤波器的阶次,z、p和k分别是设计出的

的极点、零点及增益。

3.lp2lp.m

4.lp2hp.m

5.lp2bp.m

6.lp2bs.m

以上4个文件用来将模拟低通原型滤波器

分别转换为低通、高通、带通、及带阻滤波器。

其调用格式分别是

(1)[B,A]=lp2lp(b,a,Wo)或[B,A]=lp2hp(b,a,Wo)

(2)[B,A]=lp2bp(b,a,Wo,Bw)或[B,A]=lp2bs(b,a,Wo,Bw)

式中b,a分别是模拟低通原型滤波器

有分子、分母多项式的系数向量,B,A分别是转换后的

有分子、分母多项式的系数向量;在格式

(1)中,Wo是低通或高通滤波器的截止频率;在格式

(2)中Wo是带通或带阻滤波器的中心频率,Bw是其带宽。

7.bilinear.m

实现双线性变换,即由模拟滤波器

得到数字滤波器

其调用格式是

[Bz,Az]=bilinear(B,A,Fs)

式中B、A分别是

的分子、分母多项式的系数向量;Bz、Az分别是

的分子、分母多项式的系数向量,Fs是抽样频率。

8.butter.m

用来直接设计巴特沃兹数字滤波器,实际上它把buttord.m,buttap.m,lp2lp.m及bilinear.m等文件都包含进去,从而使设计过程更简捷。

其调用格式是

(1)[B,A]=butter(N,Wn)

(2)[B,A]=butter(N,Wn,’high’)

(3)[B,A]=butter(N,Wn,’stop’)

(4)[B,A]=butter(N,Wn,’s’)

格式

(1)~(3)用来设计数字滤波器,B、A分别是

的分子、分母多项式的系数向量,Wn是通带截止频率,范围在0~1之间,1对应抽样频率的一半。

若Wn是标量,则格式

(1)用来设计低通数字滤波器。

若Wn是

的向量,则格式

(1)用来设计数字带通滤波器;格式

(2)用来设计数字高通滤波器;格式(3)用来设计数字带阻滤波器。

格式(4)用来设计模拟滤波器。

9.cheb1ord.m

求切比雪夫I型滤波器的阶次。

10.cheb1ap.m

用来设计原型切比雪夫I型模拟滤波器。

11.cheby1.m

直接设计切比雪夫I型滤波器。

以上3个文件的调用格式与对应的巴特沃兹滤波器的文件类似。

12.cheb2ord.m

13.ellipord.m

14.cheb2ap.m

15.ellipap.m

16.besselap.m

17.cheby2.m

18.ellip.m

19.besself.m

以上分别为切比雪夫II型滤波器、椭圆及贝塞尔滤波器设计函数。

其格式与切比雪夫I型滤波器和巴特沃兹滤波器类同。

此外,与本章内容有关的MATLAB文件还有:

20.impinvar.m

用冲激响应不变法实现

到z的转换。

21.maxflat.m

设计广义巴特沃兹低通滤波器。

22.yulewalk.m

利用最小平方方法设计Yule-Walker滤波器。

例1利用巴特沃斯模拟滤波器设计数字高通滤波器,要求通带截止频率为0.6π,通带内衰减不大于1dB,阻带起始频率为0.4π,阻带内衰减不小于15dB,,采样周期Ts=1s。

%usingbutterworthtodesignhighpassDF

clearall;

Wp=0.6*pi;

Ws=0.4*pi;

Ap=1;

As=15;

[N,wn]=buttord(Wp/pi,Ws/pi,Ap,As);%计算巴特沃斯滤波器阶次和截止频率

[b,a]=butter(N,wn,'high');%频率变换法设计巴特沃斯高通滤波器、

[C,B,A]=sdir2cas(b,a)%把滤波器的系统函数转换为成级联型

[db,mag,pha,w]=freqz_m2(b,a);%数字滤波器的频率响应

subplot(211);

plot(w/pi,mag);grid;

axis([0,1,0,1.2]);

title('数字滤波器的幅频响应');

subplot(212);

plot(w/pi,db);grid;

axis([0,1,10,-200]);

title('数字滤波器的幅频响应dB');

 

function[C,B,A]=sdir2cas(b,a);

%把滤波器的系统函数转换为成级联型

%a---数字滤波器系统函数分母系数

%b---数字滤波器系统函数分子系数

%C---数字滤波器阶联结构的常数因子

%B---数字滤波器阶联结构的分母系数

%A---数字滤波器阶联结构的分子系数

Na=length(a)-1;Nb=length(b)-1;

b0=b

(1);b=b/b0;

a0=a

(1);a=a/a0;

C=b0/a0;

p=cplxpair(roots(a));K=floor(Na/2);

ifK*2==Na

A=zeros(K,3);

forn=1:

2:

Na

Arow=p(n:

1:

n+1,:

);Arow=poly(Arow);

A(fix((n+1)/2),:

)=real(Arow);

end

elseifNa==1

A=[0real(poly(p))];

else

A=zeros(K+1,3);

forn=1:

2:

2*K

Arow=p(n:

1:

n+1,:

);Arow=poly(Arow);

A(fix((n+1)/2),:

)=real(Arow);

end

A(K+1,:

)=[0real(poly(p(Na)))];

end

z=cplxpair(roots(b));K=floor(Nb/2);

ifNb==0

B=[00poly(z)];

elseifK*2==Nb

B=zeros(K,3);

forn=1:

2:

Nb

Brow=z(n:

1:

n+1,:

);Brow=poly(Brow);

B(fix((n+1)/2),:

)=real(Brow);

end

elseifNb==1

B=[0real(poly(z))];

else

B=zeros(K+1,3);

forn=1:

2:

2*K

Brow=z(n:

1:

n+1,:

);Brow=poly(Brow);

B(fix((n+1)/2),:

)=real(Brow);

end

B(K+1,:

)=[0real(poly(z(Nb)))];

end

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2