数字信号处理上机实验报告
实验一 熟悉MATLAB环境
一、实验目的
1、 熟悉MATLAB的主要操作命令。 2、 学会简单的矩阵输入和数据读写。 3、 掌握简单的绘图命令。
4、 用MATLAB编程并学会创建函数。 5、 观察离散系统的频率响应。
二、实验内容
认真阅读本章附录,在MATLAB环境下重新做一遍附录中的例子,体会各条命令的含义。在熟悉MATLAB基本命令的基础上,完成以下实验。
上机实验内容:
1、 数组的加减乘除和乘方运算,输入A??求C?A?B,1 2 3 4?,B??3 4 5 6?,
D?A?B,E?A.?B,F?A./B,G?A.^B,并用stem语句画出A、B、C、D、E、
F、G。
程序:
>> A=[1 2 3 4];B=[3 4 5 6];
C=A+B; D=A-B; E=A.*B; F=A./B; G=A.^B;
subplot(2,4,1);stem(A,'.'); subplot(2,4,2);stem(B,'.'); subplot(2,4,3);stem(C,'.'); subplot(2,4,4);stem(D,'.'); subplot(2,4,5);stem(E,'.'); subplot(2,4,6);stem(F,'.');
subplot(2,4,7);stem(G,'.')
2、 用MATLAB实现下列序列。 a) x(n)?0.8n 0?n?15 b) x(n)?e(0.2?3j)n 0?n?15
?n?0.2?)?2sin(0.25?n?0.1?) 0?n?15 c) x(n)?3cos(0.125程序: A) clear;clc; n=[0:15]; x1=0.8.^n;
subplot(3,1,1),stem(x1) title('x1=0.8^n')
xlabel('n'); ylabel('x1');
2
B) clear;clc; n=[0:15];
x2=exp((0.2+3j)*n); subplot(3,1,1),stem(x2) title('x2=exp((0.2+3j)*n)') xlabel('n'); ylabel('x2');
C) clear;clc; n=[0:15];
x3=3*cos(0.125*pi*n+0.2*pi)+2*sin(0.25*pi*n+0.1*pi); subplot(3,1,1),stem(x3)
title('x3=3*cos(0.125*pi*n+0.2*pi)+2*sin(0.25*pi*n+0.1*pi)') xlabel('n'); ylabel('x3');
3
3、 绘出下列时间常数的图形,对x轴,y轴以及图形上方均须加上适当的标注:
0?t?10s a) x(t)?sin(2?t) 100?t)sin(?t) 0?t?4s b) x(t)?cos(>> m=0:0.01:10; n=0:0.01:4; x1t=sin(2*pi*m);
x2t=cos(100*pi*n).*sin(pi*n); subplot(2,1,1);plot(m,x1t); subplot(2,1,2);plot(n,x2t);
4、 给定一因果系统H(z)=(1+2z?z)/(1-0.67z的幅频响应与相频响应。
>> b=[1,sqrt(2),1];a=[1,-0.67,0.9]; [h,w]=freqz(b,a);
am=20*log10(abs(h));% am=20*log10(abs(h))为幅频响应取dB subplot(2,1,1);
-1-2?1?z?2),求出并绘制H(z)
4
plot(w,abs(h));xlabel('w');ylabel('幅频响应');title('系统响应') ph=angle(h); subplot(2,1,2);
plot(w,ph);xlabel('w');ylabel('相频响应');
5、 计算序列?8 -2 -1 2 3?和序列?2 3 -1 -3?的离散卷积,并作图表示卷积结果。
>> a=[8 -2 -1 2 3];
b=[2 3 -1 -3]; c=conv(a,b); M=length(c)-1; n=0:1:M; stem(n,c);
xlabel('n');ylabel('幅度');
5
6、 求以下差分方程所描述系统的单位脉冲响应h(n),0?n?50:
y(n)?0.1y(n?1)?0.06y(n?2)?x(n)?2x(n?1)
程序: >> N=50;
a=[1 -2]; b=[1 0.1 -0.06]; x=[1 zeros(1,N-1)]; k=0:1:N-1; y=filter(a,b,x); stem(k,y);
xlabel('n');ylabel('幅度 ');
6
实验二 快速傅里叶变换(FFT)及其应用
一、实验目的
1、 在理论学习的基础上,通过本实验,加深对FFT的理解,熟悉MATLAB中的有关函数。
2、 应用FFT对典型信号进行频谱分析。
3、 了解应用FFT进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用FFT。
4、 应用FFT实现序列的线性卷积和相关。
二、实验内容 实验中用到的信号序列
a) 高斯序列
???n?p?q? 0?n?15 xa(n)??e?0 其他?2b) 衰减正弦序列
7
?e??nsin(2?fn) 0?n?15 xb(n)??0 其他?c) 三角波序列
0?n?3?n ?xc(n)??8?n 4?n?7
?0 其他?d) 反三角波序列
0?n?3?4?n ?xd(n)??n?4 4?n?7
?0 其他?上机实验内容:
(1)观察三角波和反三角波序列的时域和幅频特性,用N?8点FFT分析信号序列xc(n)和xd(n)的幅频特性,观察两者的序列形状和频谱曲线有什么异同?绘出两序列及其幅频特性曲线。 程序:
n=[0:3];k=[1:8];
Xc(n+1) = n;Xc(n+5) =4-n; Xd(n+1) = 4-n;Xd(n+5) =n;
三角波特性
subplot(2,2,1);plot(k-1,Xc);
xlabel('n');ylabel('时域特性');text(1,3,'三角波'); subplot(2,2,2);plot(k-1,abs(fft(Xc)));
xlabel('k');ylabel('幅频特性');text(4,10,'三角波'); 反三角波特性
subplot(2,2,3);plot(k-1,Xd);
xlabel('n');ylabel('时域特性');text(3,3,'反三角波'); subplot(2,2,4);plot(k-1,abs(fft(Xd)));
xlabel('k');ylabel('幅频特性');text(4,10,'反三角波');
8
在xc(n)和xd(n)末尾补零,用N?32点FFT分析这两个信号的幅频特性,观察幅频特性发生了什么变化?两种情况下的FFT频谱还有相同之处吗?这些变化说明了什么?
程序:
>> n=[0:3];k=[1:32]; Xc(n+1) = n;Xc(n+5) =4-n; Xd(n+1) = 4-n;Xd(n+5) =n;
Xc(9:32)=0;Xd(9:32)=0;k=1:32;figure;
subplot(2,2,1);plot(k-1,Xc);
xlabel('n');ylabel('时域特性');text(1,3,'三角波'); subplot(2,2,2);plot(k-1,abs(fft(Xc)));
9
xlabel('k');ylabel('幅频特性');text(4,10,'三角波');
subplot(2,2,3);plot(k-1,Xd);
xlabel('n');ylabel('时域特性');text(3,3,'反三角波'); subplot(2,2,4);plot(k-1,abs(fft(Xd)));
xlabel('k');ylabel('幅频特性');text(4,10,'反三角波');
?的16(2)用FFT分别计算xa(n)?p?8,q?2?和xb(n)???0.1,f?0.0625点循环卷积和线性卷积。 程序: >> n1=0:1:15;
p1=8; q1=2;
10
x=exp(-(n1-p1).^2/q1); n2=0:1:15; a=0.1; f2=0.0625;
y=(exp(-a*n2)).*sin(2*pi*f2*n2); N=length(x); n=0:N-1; n3=0:30; X=fft(x); Y=fft(y);
x32=[x zeros(1,16)]; y32=[y zeros(1,16)]; X32=fft(x32); Y32=fft(y32); z16=ifft(X.*Y); z32=ifft(X32.*Y32); subplot(2,2,1); plot(n,z16,'-*'); xlabel('n'); ylabel('z(n)'); title('循环卷积结果'); subplot(2,2,2);
plot(n3,z32(1:2*N-1),'-o'); xlabel('n'); ylabel('z(n)'); title('线性卷积结果'); rm16=real(ifft(conj(X).*Y)); rm32_0=real(ifft(conj(X32).*Y32)); rm32=[rm32_0(N+2:2*N) rm32_0(1:N)]; m=n;
11
subplot(2,2,3); plot(m,rm16,'--'); xlabel('m'); ylabel('rm');
title('循环相关结果'); m=-(N-1):N-1; subplot(2,2,4); plot(m,rm32,'--o'); xlabel('m');
ylabel('rm');title('线性相关结果');
(3)产生一512点随机序列x,并用x和x作线性卷积,观察卷(((en)en)cn)积前后x频谱变化。要求将x分成8段,分别采用重叠相加法和重叠保留((en)en)法。 程序:
12
>> n=0:7; m=1:512 xc(1:4)=n(1:4); xc(5:8)=8-n(5:8); xe=rand(1,512); Xek=fft(xe); hk=fft(xc,128); subplot(3,1,1) ; stem(m,Xek); xlabel('n'); ylabel('Xek'); title('卷积前序列'); for j=1:8;
x(j,:)=xe(64*(j-1)+1:64*j);
xk(j,:)=fft(x(j,:),128);
end;
y=zeros(1,576); for i=1:8 y=y+f(i,:); end
subplot(3,1,2) ; m=0:518;
plot(m,abs(fft(y(1:519)))); axis([0,518,0,250]); xlabel('k'); ylabel('频域');
title('重叠相加法幅频特性') x2(1,1:71)=[zeros(1,7) xe(1:64)];
for j=2:8
f(j,(64*(j-1)+1):(64*(j-1)+128))=ifft(xk(j,:).*hk);
13
x2(j,:)=xe((64*(j-1)-6):(64*j)); end
x2(9,:)=[xe(506:512),zeros(1,64)]; for j=1:9
xk2(j,:)=fft(x2(j,:),128); f2(j,:)=ifft(xk2(j,:).*hk); end;
y2=zeros(1,576); for i=1:9
y2(1,64*(i-1)+1:64*i)=f2(i,8:71); end
subplot(3,1,3); m=0:518;
plot(m,abs(fft(y2(1:519)))); axis([0,518,0,250]); xlabel('k'); ylabel('频域');
title('重叠保留法幅频特性')
14
(4)用FFT分别计算xa(n)?p?8,q?2?和xb(n)???0.1,f?0.0625?的自相关函数。 程序: >> N=16; n=0:N-1; p=8;q=2;
Xa(n+1)=exp(-(n-p).^2./q); a=0.1;f=0.0625;
Xb(n+1)=exp(-a.*n).*sin(2*pi*f.*n); N=length(Xa);
Fa=fft(Xa,2*N); Fb=fft(Xb,2*N); F1=conj(Fa).*Fa; X81=real(ifft(F1));
X81=[X81(N+2:2*N) X81(1:N)]; n=(-N+1):(N-1);
subplot(2,1,1);stem(n,X81); xlabel('n'); ylabel('幅度');
Fb=fft(Xb,2*N); F2=conj(Fb).*Fb; X82=real(ifft(F2));
X82=[X82(N+2:2*N) X82(1:N)]; % n=(-N+1):(N-1);
subplot(2,1,2);stem(n,X82);
xlabel('n'); ylabel('幅度');
15
小结:
1.熟悉了MATLAB的主要操作命令,学会了简单的绘图命令,会用MATLAB编程并学会创建函数,能通过图像观察离散系统的频率响应。
2.在理论学习的基础上,通过本实验,加深了对FFT的理解,熟悉MATLAB中的有关函数。能够应用FFT对典型信号进行频谱分析,从而了解应用FFT进行信号频谱分析过程中可出现的问题,学会了应用FFT实现序列的线性卷积和相关。
16