【精选】MATLAB离散卷积的实现

您所在的位置:网站首页 用matlab求序列卷积 【精选】MATLAB离散卷积的实现

【精选】MATLAB离散卷积的实现

2023-10-27 02:53| 来源: 网络整理| 查看: 265

现有两列数:

x=[4 5 6];

b=[1 2 3];

自己编写代码计算其卷积:x[n]*b[n]

一、实验目的:实现

1.理解离散卷积的计算;

2.使用filter函数将数字信号进行滤波,可以将表示成离散序列的该信号x(n)与数字滤波器的冲激响应h(n)进行卷积,其结果与conv函数进行对比;

3.使用matlab编写程序计算离散函数的卷积

二、实验原理

“离散卷积”是两个离散序列和之间按照一定的规则将它们的有关序列值分别两两相乘再相加的一种特殊的运算。具体可用公式表示为

其中y (n)就是经过卷积运算以后所得到的一个新的序列。根据上式,在运算过程中,要使序列x (n)“不动”,并将自变量改为i ,以表示与卷积结果的自变量n有所区别。而将另外个序列h (n)的自变量改为i以后,再取它的翻转。为求两者的卷积y (n),先将h (-i)在相同的i下与x (i)的每一个值两两相乘再相加,就得到了n = 0时的卷积值y(0)。接下来,将h(-i)向右移动自变量的一个间隔,构成h(1 - i),同样在相同的i下与x (i)的各个值两两相乘再相加,就得到卷积值y(1), .....如此反复,直到所有的序列值都算完为止。其中要注意,对于n≥0的卷积值y(n),要把h(- i)向右移,而对于n < 0的卷积值,要把h(-i)向左移。

三、实验设计及操作

1.使用conv函数计算卷积:

Conv用来计算卷积和多项式乘法,用法:w = conv(u,v),返回向量u和v的卷积。

代码:

a=1;

x=[4 5 6];

b=[1 2 3];

y_conv=conv(x,b)

输出:

y_conv =

     4    13    28    27    18

2. 使用filter函数计算卷积

a=1;%y的系数

x=[4 5 6];%输入

b=[1 2 3];%x[n]的系数

y_filter=filter(x,a,b) %使用filter函数

              结果:y_filter =

                                     4    13    28

       3.编写程序计算卷积:

其中y (n)就是经过卷积运算以后所得到的一个新的序列。根据上式,在运算过程中,要使序列x (n)“不动”,并将自变量改为i ,以表示与卷积结果的自变量n有所区别。而将另外个序列h (n)的自变量改为i以后,再取它的翻转。为求两者的卷积y (n),先将h (-i)在相同的i下与x (i)的每一个值两两相乘再相加,就得到了n = 0时的卷积值y(0)。接下来,将h(-i)向右移动自变量的一个间隔,构成h(1 - i),同样在相同的i下与x (i)的各个值两两相乘再相加,就得到卷积值y(1), .....如此反复,直到所有的序列值都算完为止。其中要注意,对于n≥0的卷积值y(n),要把h(- i)向右移,而对于n < 0的卷积值,要把h(-i)向左移。

代码如下:

a=1;%y的系数

x=[4 5 6];%输入

b=[1 2 3];%x[n]的系数

%y_conv=conv(x,b) %使用matlab自带卷积计算结果

%y_filter=filter(x,a,b) %使用filter函数计算结果

x_input=zeros(1,5);    %输入向量初始化,用0填充

b_input=zeros(1,5);    %系数初始化

for i = 1:1:3           %将x和b前三位设置为正确的数,后两位用0填充,便于相乘

    x_input(i)=x(i);

    b_input(i)=b(i);

end

y_my_conv=zeros(1,5);   %便于位移操作,先将数组定义为长度为5,以0填充的数组

for n = 1:1:5           %因为y[n]=sum(x[m]*b[n-m]),共有5个n,故依次计算

    b_input_temp = fliplr(b_input);   %反转b的数组b_input,并存储

    b_input_temp = circshift(b_input_temp,n);  %平移b数组,右移n位

    y_my_conv(n) = my_conv_n(x_input,b_input_temp);%计算出n时的输出,函数见下面

end

y_my_conv                      %输出结果

function [result]=my_conv_n(param1,param2) %定义卷积函数    

    result=sum(param1.*param2);            %卷积结果为两列数点乘求和

end

结果如下:

四、实验结果

五、实验总结和提升

1.通过本次实验,更加理解了卷积的应用和意义

2.学习使用matlab在数字信号处理中的应用,这能提高对数字信号处理的质量和效率, MATLAB的应用优势和数字信号处理算法理论,对基于MATLAB的数字信号处理平台架构和处理目标详细分析,最后对数字信号处理中MATLAB的应用进行探究。

MATLAB软件的应用在数字信号处理中发挥积极作用,其与高级语言程序相比有着比较突出的优势,能进行快速地数学计算和数值仿真,并且具有相当多的工具箱,如本次使用到的conv函数和filter函数。matlab能够实现各种对于数字信号处理的功能,有效节省编程时间,大大提高编程的效率。通过此次使用MATLAB软件进行的实验,我对于MATLAB的使用积累了经验,收获很多。

六、源代码

a=1;%y的系数 x=[4 5 6];%输入 b=[1 2 3];%x[n]的系数 y_conv=conv(x,b) %使用matlab自带卷积计算结果 y_filter=filter(x,a,b) %使用filter函数计算结果 x_input=zeros(1,5); %输入向量初始化,用0填充 b_input=zeros(1,5); %系数初始化 for i = 1:1:3 %将x和b前三位设置为正确的数,后两位用0填充,便于相乘 x_input(i)=x(i); b_input(i)=b(i); end y_my_conv=zeros(1,5); %便于位移操作,先将数组定义为长度为5,以0填充的数组 for n = 1:1:5 %因为y[n]=sum(x[m]*b[n-m]),共有5个n,故依次计算 b_input_temp = fliplr(b_input); %反转b的数组b_input,并存储 b_input_temp = circshift(b_input_temp,n); %平移b数组,右移n位 y_my_conv(n) = my_conv_n(x_input,b_input_temp);%计算出n时的输出,函数见下面 end y_my_conv %输出结果 function [result]=my_conv_n(param1,param2) %定义卷积函数 result=sum(param1.*param2); %卷积结果为两列数点乘求和 end



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3