转 matlab卷积函数介绍 conv filter conv2

最近在做控制算法实现的时候,对于其中参杂的各种差分、卷积很头疼,就在网上搜集了些资料,汇总于此,以做备忘。
在MATLAB中,可以用函数y=filter(p,d,x)实现差分方程的仿真,也可以用函数 y=conv(x,h)计算卷积。
(1)即y=filter(p,d,x)用来实现差分方程,d表示差分方程输出y的系数,p表示输入x的系数,而x表示输入序列。输出结果长度数等于x的长度。

实现差分方程,先从简单的说起:
filter([1,2],1,[1,2,3,4,5]),实现y[k]=x[k]+2*x[k-1]
y[1]=x[1]+2*0=1 (x[1]之前状态都用0)
y[2]=x[2]+2*x[1]=2+2*1=4

(2)y=conv(x,h)是用来实现卷级的,对x序列和h序列进行卷积,输出的结果个数等于x的长度与h的长度之和减去1。

卷积公式:z(n)=x(n)*y(n)= ∫x(m)y(n-m)dm.

程序一:以下两个程序的结果一样

(1)

 h = [3 2 1 -2 1 0 -4 0 3]; % impulse response

 x = [1 -2 3 -4 3 2 1]; % input sequence

y = conv(h,x);

n = 0:14;

subplot(2,1,1);

stem(n,y);

xlabel('Time index n'); ylabel('Amplitude');

title('Output Obtained by Convolution'); grid;

(2)

x1 = [x zeros(1,8)];

y1 = filter(h,1,x1);

subplot(2,1,2);

stem(n,y1);

xlabel('Time index n'); ylabel('Amplitude');
title('Output Generated by Filtering'); grid;

程序二:filter和conv的不同

               x=[1,2,3,4,5];
               h=[1,1,1];

               y1=conv(h,x)
               y2=filter(h,1,x)
               y3=filter(x,1,h)

 结果:y1 = 1     3     6     9    12     9     5

       y2 = 1     3     6     9    12

‍              y3  = 1     3     6  

可见:filter函数y(n)是从n=1开始,认为所有n<1都为0;而conv是从卷积公式计算,包括n<1部分。

            因此filter 和conv 的结果长短不同

程序三:滤波后信号幅度的变化

                num=100; %总共1000个数 
                x=rand(1,num); %生成0~1随机数序列 
                x(x>0.5)=1; 
                x(x<=0.5)=-1;
                h1=[0.2,0.5,1,0.5,0.2]; 
                h2=[0,0,1,0,0];
                y1=filter(h1,1,x);
                y2=filter(h2,1,x);
                n=0:99;
                subplot(2,1,1);
                stem(n,y1);
                subplot(2,1,2); 
                stem(n,y2);

MATLAB中提供了卷积运算的函数命令conv2,其语法格式为:
C = conv2(A,B)
C = conv2(A,B)返回矩阵A和B的二维卷积C。若A为ma×na的矩阵,B为mb×nb的矩阵,则C的大小为(ma+mb-1)×(na+nb-1)。

例:

A=magic(5) 
A = 
17 24 1 8 15 
23 5 7 14 16 
4 6 13 20 22 
10 12 19 21 3 
11 18 25 2 9 
>> B=[1 2 1 ;0 2 0;3 1 3] 
B = 
1 2 1 
0 2 0 
3 1 3 
>> C=conv2(A,B) 
C = 
17 58 66 34 32 38 15 
23 85 88 35 67 76 16 
55 149 117 163 159 135 67 
79 78 160 161 187 129 51 
23 82 153 199 205 108 75 
30 68 135 168 91 84 9 
33 65 126 85 104 15 27 

MATLAB图像处理工具箱提供了基于卷积的图象滤波函数filter2,filter2的语法格式为:
Y = filter2(h,X)
其中Y = filter2(h,X)返回图像X经算子h滤波后的结果,默认返回图像Y与输入图像X大小相同。例如:
其实filter2和conv2是等价的。MATLAB在计算filter2时先将卷积核旋转180度,再调用conv2函数进行计算。
Fspecial函数用于创建预定义的滤波算子,其语法格式为:

h = fspecial(type) 
h = fspecial(type,parameters) 

参数type制定算子类型,parameters指定相应的参数,具体格式为:
type=’average’,为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]。
type= ‘gaussian’,为高斯低通滤波器,参数有两个,n表示模版尺寸,默认值为[3,3],sigma表示滤波器的标准差,单位为像素,默认值为0.5

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab有两个常用的卷积函数,分别是conv2filter2。这两个函数都可以实现两个信号的卷积操作。 对于conv2函数,它的用法是C=conv2(A,B,shape),其A是输入图像,B是卷积核。shape参数用来指定输出的大小和形状。当shape=full时,返回全部二维卷积结果;当shape=same时,返回与A同样大小的卷积心部分;当shape=valid时,不考虑边界补零,只返回有效的卷积结果。 conv2函数的实现步骤如下: 1. 将输入图像A进行边界补零,补零的行数为卷积核的行数减1,补零的列数为卷积核的列数减1。 2. 对卷积核进行旋,使其心位置对齐。 3. 滑动卷积核,将卷积核的心位于图像矩阵的每一个元素。 4. 将旋后的卷积核乘以对应的矩阵元素再求和,得到卷积结果。 另外一个卷积函数filter2,它的实现步骤与conv2类似: 1. 对输入图像进行边界补零,补零的行数为卷积核的行数减1,补零的列数为卷积核的列数减1。 2. 滑动相关核,将相关核的心位于图像矩阵的每一个元素。 3. 将相关核乘以对应的矩阵元素再求和,得到相关结果。 综上所述,Matlab卷积函数conv2filter2都可以实现信号的卷积操作,它们的使用方法类似,但内部实现的细节有些许差异。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [matlab卷积函数](https://download.csdn.net/download/ohouchuang/5470181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【matlab函数conv2filter2、imfilter的区别](https://blog.csdn.net/horseinch/article/details/50545362)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值