MATLAB离散卷积的实现_代码编写_实现两列数的卷积

现有两列数:

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

  • 19
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋时的雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值