资源描述
大连理工大学实验报告
学院(系): 电信 专业: 生物医学工程 班级: **1101
姓 名: **** 学号: 201181*** 组: ___
实验时间: 实验室: 实验台:
指导教师签字: 成绩:
实验一 线性卷积和圆周卷积
一、实验程序
1.给出序列x=[3,11,7,0,-1,4,2],h=[2,3,0,-5,2,1];用两种方法求两者的线性卷积y,对比结果。
a) 直接调用matlab内部函数conv来计算。
b) 根据线性卷积的步骤计算。
clear;
clc;
x=[3 11 7 0 -1 4 2];n1=0:1:length(x)-1;
h=[2 3 0 -5 2 1];n2=0:1:length(h)-1;
y=conv(x,h);n3=0:1:length(x)+length(h)-2;
figure(1);
subplot(121);stem(n1,x,'.');axis([0 6 -15 15]);title('x(n)序列');grid;
subplot(122);stem(n2,h,'.');axis([0 5 -10 10]);title('h(n)序列');grid;
figure(2);
subplot(121);stem(n3,y,'.');axis([0 12 -60 60]);title('调用conv函数的线性卷积后序列');grid;
N=length(x);M=length(h);L=N+M-1;
for(n=1:L)
y1(n)=0;
for(m=1:M)
k=n-m+1;
if(k>=1&k<=N)
y1(n)=y1(n)+h(m)*x(k);
end;
end;
end;
subplot(122);stem(n3,y1,'*');axis([0 12 -60 60]);title('按步骤计算的线性卷积后序列');grid;
结果
2.卷积后结果y=[ 6 , 31 , 47 , 6 , -51 , -5 , 41 , 18 , -22 , -3 , 8 , 2]。
将函数conv稍加扩展为函数conv_m,它可以对任意基底的序列求卷积。格式如下:
function [y,ny]=conv_m(x,nx,h,nh)
% 信号处理的改进卷积程序
% [y,ny]=conv_m(x,nx,h,nh)
% [y,ny]=卷积结果
% [x,nx]=第一个信号
% [h,nh]=第二个信号
程序如下:
function [y,ny]=conv_m(x,nx,h,nh)
ny=nx+nh-1;
for(n=1:ny)
y(n)=0;
for(m=1:nh)
k=n-m+1;
if(k>=1&k<=nx)
y(n)=y(n)+h(m)*x(k);
end;
end;
end;
通过如下程序调用函数conv_m
clear;
clc;
x=[3,11,7,0,-1,4,2];
h=[2 3 0 -5 2 1];
nx=length(x);
nh=length(h);
[y,ny]=conv_m(x,nx,h,nh);
n=0:1:ny-1;
subplot(121);stem(n,y,'.');axis([0 12 -60 60]);title('调用conv_m函数的线性卷积后序列');grid;
结果如下
与题1中所得结果相同。
3.创建函数circonv,来实现序列的圆周卷积,格式如下:
function y=circonv(x1,x2,N)
程序如下
function y=circonv(x1,x2,N)
x_1=[x1 zeros(1,N-length(x1))];
h_1=[x2 zeros(1,N-length(x2))];
y1=conv(x_1,h_1);
z_1=[zeros(1,N) y1(1:(N-1))];
z_2=[y1((N+1):(2*N-1)) zeros(1,N)];
z=z_1(1:(2*N-1))+z_2(1:(2*N-1))+y1(1:(2*N-1));
y=z(1:N);
通过如下函数调用circonv
clear;
clc;
x1=[1 0 1 2 1];
x2=[1 1 0 1 2];
y=circonv(x1,x2,5);
subplot(121);stem((0:4),y,'.');axis([0 5 0 8]);
title('圆周卷积');grid;
得到结果如下
4.求序列和,()的线性卷积
a) N个点的圆周卷积
b) 3N/2个点的圆周卷积
c) 2N-1个点的圆周卷积
d) 用FFT变换实现其圆周卷积
本次试验中调用了前面编写的circonv函数。
clear;
clc;
close all;
n=-5:50;
N=56;
x=heaviside(n)-heaviside(n-10);
h=0.9.^n.*heaviside(n);
N1=N;
x1=[x zeros(1,N-length(x))];
h1=[h zeros(1,N-length(h))];
X1=fft(x1);
H1=fft(h1);
Y1=X1.*H1;
y1=ifft(Y1);
figure
subplot(131);stem((0:N-1),y1,'.');axis([0 120 0 8]);
title('FFT的N点圆周卷积');grid;
N2=(3*N)/2;
x2=[x zeros(1,N2-length(x))];
h2=[h zeros(1,N2-length(h))];
X2=fft(x2);
H2=fft(h2);
Y2=X2.*H2;
y2=ifft(Y2);
subplot(132);stem((0:N2-1),y2,'.');axis([0 120 0 8]);
title('FFT的3*N/2点圆周卷积');grid;
N3=2*N-1;
x3=[x zeros(1,N3-length(x))];
h3=[h zeros(1,N3-length(h))];
X3=fft(x3);
H3=fft(h3);
Y3=X3.*H3;
y3=ifft(Y3);
subplot(133);stem((0:N3-1),y3,'.');axis([0 120 0 8]);
title('FFT的2*N-1点圆周卷积');grid;
y=circonv(x,h,N);
figure
subplot(131);stem((0:N-1),y,'.');axis([0 120 0 8]);
title('N点圆周卷积');grid;
y=circonv(x,h,3*N/2);
subplot(132);stem((0:(3*N)/2-1),y,'.');axis([0 120 0 8]);
title('3/2*N点圆周卷积');grid;
y=circonv(x,h,2*N-1);
subplot(133);stem((0:2*N-1-1),y,'.');axis([0 120 0 8]);
title('2N-1点圆周卷积');grid;
二、实验总结
对于有限长序列,存在两种形式的卷积:线性卷积与圆周卷积。由于圆周卷积可以采用DFT的快速算法——快速傅里叶变换进行运算,运算速度上有很大的优越性。 其中,设计线性卷积有4个步骤,反折、移位 、相乘、求和,而循环卷积则是通过循环移位后得到的矩阵与序列相乘。根据上DSP课上老师讲的求法,画出了思路的流程图,然后根据流程图写出程序,事半功倍。 将结果与直接调用matlab自带的函数比较,结果显示,自己设计的程序是正确的。 通过这次实训,我对线性卷积和循环的定义、原理、以及实现方法都有了深入的认识。同时也对MATLAB软件产生了更加浓厚的兴趣。在做完本次实训要求的线性卷积之后,我运用了同样的思路,设计出了循环卷积,算是对本次实训的一个扩展,同时也提高了自己的编程水平和对matlab的运用。
展开阅读全文