matlab conv实现,MATLAB卷积运算(conv)以及通用的卷积函数my_conv的实现

conv(向量卷积运算)

两个向量卷积,简单理解其实就是多项式乘法。

比如:p=[1 2 3],q=[1 1]是两个向量,p和q的卷积计算方法如下:

把p的元素作为一个多项式的系数,多项式按升幂(或降幂)排列,比如就按升幂吧,写出对应的多项式:1+2x+3x^2;同样的,把q的元素也作为多项式的系数按升幂排列,写出对应的多项式:1+x。

卷积就是“两个多项式相乘取系数”。

(1+2x+3x^2)×(1+x)=1+3x+5x^2+3x^3

所以p和q卷积的结果就是[1 3 5 3]

注意:当确定是前一个序列用升幂或是降幂排列后,后一个序列也都要按这个方式排列,否则结果是不对的。

p = [1 2 3];q=[1 1];

conv(p,q)

ans =

1 3 5 3

当然MATLAB的卷积函数还有conv2(二维矩阵卷积运算)和convn(n维卷积运算),可以去参考文档了解

那么这里的问题是,当两个序列不是从0开始时,必须对conv函数稍加扩展:

function [ y,ny ] = convu( h,nh,x,nx )

%CONVU 通用卷积函数

% function [ y,ny ] = convu( h,nh,x,nx )

% y为卷积结果向量,ny是y的位置向量,h和x是有限长序列

nys = nh(1)+nx(1);

nyf = nh(end)+nx(end);

y = conv(h,x);

ny = nys:nyf;

end

知道了conv的这些用法之后,我便好奇想conv的实现过程:接下来是不使用conv的卷积函数,解释了

conv内部的计算过程:

function y = my_conv( x,h )

%MY_CONV 重写MATLAB内置卷积函数conv()

% function y = my_conv( x,h )用来计算y(n) = h(n)*x(n)的卷积

nx = length(x);

nh = length(h);

y = zeros(1,nx+nh-1);

for index = 1:nx

indexSum = x(index)*h;

y(1,index:index+nh-1) = y(1,index:index+nh-1)+indexSum;

end

end

function [ y,ny ] = my_convu( x,nx,h,nh )

%MY_CONVU 通用的卷积函数(不使用conv()实现)

% function [ y,ny ] = my_convu( x,nx,h,nh )

% 用来计算y(n) = h(n)*x(n)的卷积

% % y为卷积结果向量,ny是y的位置向量,h和x是有限长序列

nys = nx(1)+nh(1);

nyf = nx(end)+nh(end);

y = my_conv(h,x);

ny = nys:nyf;

end

测试my_conv函数:

%% 2.计算两个有限长序列的卷积

xn = [1 1 1 1 ];

hn = [1 1 1 1 ];

yn = my_conv(xn,hn);

%% 3.编写通用卷积函数function [ y,ny ] = convu( h,nh,x,nx )

%如果h(n)=x(n)=R5(N+2),则计算y(n)=h(n)*x(n)的程序如下:

h = ones(1,5);nh = -2:2;

x = h;nx = nh;

[y,ny] = my_convu(h,nh,x,nx);

yn =

1 2 3 4 3 2 1

y =

1 2 3 4 5 4 3 2 1

编写一个自己的matlabconv函数主要分为以下几个步骤: 1. 定义函数:开始时需要声明函数名和输入参数。例如:function output = myconv(input1, kernel)。函数名称可以根据个人喜好来命名。 2. 输入参数检查:在函数体内,首先需要对输入参数进行检查。例如,可以使用条件判断语句if来检查输入参数是否符合要求,比如输入是否为数字或矩阵等。 3. 矩阵维度获取:根据输入的矩阵和卷积核,获取其维度信息。可以使用size函数获得矩阵的行数和列数,以便后续计算使用。 4. 卷积计算:使用双重循环来对输入矩阵进行卷积计算。外层循环遍历输入矩阵的每一行,内层循环遍历每一列。同时,使用卷积核对对应位置的元素进行计算,最后将结果保存到输出矩阵。 5. 输出结果:返回卷积计算结果。可以使用return或赋值给函数的输出参数进行输出。 以下是一个简单的matlabconv函数编写示例: ```matlab function output = myconv(input1, kernel) % 检查输入参数 if ~isnumeric(input1) || ~isnumeric(kernel) error('输入参数类型错误!') end % 获取输入矩阵和卷积核的维度信息 [input_rows, input_cols] = size(input1); [kernel_rows, kernel_cols] = size(kernel); % 初始化输出矩阵 output = zeros(input_rows + kernel_rows - 1, input_cols + kernel_cols - 1); % 进行卷积计算 for i = 1:input_rows for j = 1:input_cols for m = 1:kernel_rows for n = 1:kernel_cols output(i+m-1, j+n-1) = output(i+m-1, j+n-1) + input1(i, j) * kernel(m, n); end end end end end ``` 这只是一个简单的示例,实际的matlabconv函数可能需要更多的功能和参数验证,具体根据实际需求进行设计和编写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值