t=0:0.001:1; y1=exp(-6*t); y2=exp(-3*t); y=conv(y1,y2); l1=length(y1); l2=length(y2); l=length(y);
subplot(3,1,1);plot(t,y1); subplot(3,1,2);plot(t,y2); t1=0:0.001:2;
subplot(3,1,3);plot(t1,y);
10.5010.5010050000.10.20.30.40.50.60.70.80.9100.10.20.30.40.50.60.70.80.9100.20.40.60.811.21.41.61.82
三、实验内容
1. 自选二个简单的信号,进行加、乘、卷积运算. 加乘:
y1=[2,4,2,1,4,0,0]; y2=[2,2,1,1,3,2,0]; n=1:length(y1);
subplot(2,2,1);stem(n,y1); subplot(2,2,2);stem(n,y2); subplot(2,2,3);stem(n,y1+y2); subplot(2,2,4);stem(n,y1.*y2);
4321013202468002468864201510502468002468
卷积:
y1=[2,4,2,1,4,0,0];
y2=[2,2,1,1,3,2,0]; y=conv(y1,y2); n1=1:length(y1); n2=1:length(y2); L=length(y);
subplot(3,1,1);plot(n1,y1);axis([1,L,0,5]); subplot(3,1,2);plot(n2,y2);axis([1,L,0,5]); n=1:L;
subplot(3,1,3);plot(n,y);axis([1,L,0,40]);
42024681012420246810124020024681012
2. 自选一个简单的信号进行反褶、平移、尺度变换运算.
syms t;
f=sym('cos(t)/t'); f1=subs(f,t,t+3); f2=subs(f1,t,2*t); f3=subs(f2,t,-t);
subplot(2,2,1);ezplot(f,[-8,8]);grid on; subplot(2,2,2);ezplot(f1,[-8,8]);grid on; subplot(2,2,3);ezplot(f2,[-8,8]);grid on; subplot(2,2,4);ezplot(f3,[-8,8]);grid on;
四、实验要求 1.预习实验原理;
2.对实验内容编写程序(M文件),上机运行; 3.绘出运算或变换后信号的波形.
cos(t)/t0.50-0.5-505tcos(2 t+3)/(2 t+3)0.40.20-0.2-0.4-505tcos(t+3)/(t+3)0.50-0.5-505tcos(2 t-3)/(-2 t+3)0.40.20-0.2-0.4-505t
五、思考题
1. Matlab的仿真特点 在离散传利叶转换中,由於处理的对象是一些序列,因此非常这合使用电脑来担任计算的工作,而 MathWorks, Inc. 所发展的 MATLAB 数学运算软体,即是这方面非常强而有力的电脑软体,在 MATLAB 上面执行一些数列或矩阵的运算非常方便,而它的程式结构有点类似 BASIC或 C 程式,写起来十分平易近人,而其函式的呼叫又很间单,再加以目前各种视窗上的版本都已推出,编辑程式,执行、观看结果和列印,都可轻鬆的透过视窗的切换及下拉式功能来完成,更值得特别一提是MATLAB 的工具箱 (TOOLBOX) 有 SIGNAL 及 IMAGE 两项法宝,对於我们学习、数位信号处理的过理中,能够提供完备的的辅助。唯一较遗憾的是目前 MATLAB 上面建立的程式仍然较难直接与一些界面卡(如影像处理卡)相互钩通,因此如果我们想利用它来从事实际上的影像处理,必须先在其他工作环境下,将影像抓取进来,存成图档后再进入MATLAB 中,将图档呼叫出来作深入的分析。另一点美中不足的地方是,虽然 MATLAB 在从事一些本身的内建函式运算时速度很快,但是如果是执行我们所建立的一些外部函式运算时速度却相当慢,因此,如果从事语音及影像分析时,大量的计算工作将使得电脑花费不少处理的时间,这一点也使得它变得较為不切实际,而无法直接运用於线上的数位信号处理。
查看conv卷积的函数实现过程、原理,试用C语言编写调试。 function a=myconv(b,c) bs=size(b); cs=size(c); i=any(bs-cs); if i
error('error') end
i=any(~(bs-1)); if ~i
error('error') end ko=0;
if bs(1)>bs(2) b=b'; c=c'; ko=1; end
bs=size(b);
cs=size(c); ss=2*bs(2)-1; a=zeros(1,ss); for i=1:cs(2) q=zeros(1,i-1);
p=zeros(1,ss-cs(2)+1-i); ba=[q,c,p]; ma=b(i)*ba; a=a+ma; end if ko
a=a'; end end
实验二 离散时间信号与系统
一、实验目的
1.掌握用 matlab 软件产生离散时间信号的方法; 2.进一步理解离散时间信号常见运算的方法; 3. 掌握求离散时间系统冲激响应的方法.
二、实验原理
(一)离散时间信号的产生与运算 1.离散时间信号的产生 (1)单位抽样序列 delta.m函数:
function[x,n]=delta(n0,n1,n2) n=[n1:n2];
x=[(n-n0)==0];
[x,n]=delta(3,-1,10); stem(n,x);
(2)单位阶跃序列 step_seq 函数
function[x,n]=step_seq(n0,n1,n2) n=[n1:n2];
x=[(n-n0)>=0];
执行:[x,n]=step-seq (3,-1,10); stem(n,x);
(3)矩形序列
先定义 aaa 函数
function[x,n]=aaa(N,n1,n2) n=[n1:n2];
x=[(N>n)&(n>=0)]; 执行:
[x,n]=aaa (3,-1,10); stem(n,x);
(4)单位斜坡序列 先定义 ramp 函数:
function[x,n]=ramp(n1,n2) n=[n1:n2]; x=n; 执行:
[x,n]=ramp (0,10); Stem(n,x);
10.90.80.70.60.50.40.30.20.10-2024681010.90.80.70.60.50.40.30.20.10-20246810109876543210012345678910