Matlab 几种卷积的实现与比较(conv与filter,conv2与filter2)

   
最近在做控制算法实现的时候,对于其中参杂的各种差分、卷积很头疼,就在网上搜集了些资料,汇总于此,以做备忘。

在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

Matlab 几种卷积的实现与比较(conv与filter,conv2与filter2)的更多相关文章

  1. matlab中的卷积——filter,conv之间的区别

    %Matlab提供了计算线性卷积和两个多项式相乘的函数conv,语法格式w=conv(u,v),其中u和v分别是有限长度序列向量,w是u和v的卷积结果序列向量. %如果向量u和v的长度分别为N和M,则 ...

  2. MATLAB中conv2的详细用法 (以及【matlab知识补充】conv2、filter2、imfilter函数原理)

    转载: 1.https://blog.csdn.net/jinv5/article/details/52874880 2.https://blog.csdn.net/majinlei121/artic ...

  3. matlab两种不同模式的并行运算

    1.distributed job      distributed job是一种比較简单的并行任务.假定用户须要完毕一组作业.各个计算作业之间是独立的.并且相互之间不须要进行数据通信.这意味着各个作 ...

  4. MATLAB GUI设计(线性卷积和循环卷积的比较--笔记)

    原创循环卷积代码,转载需注明出处 线性卷积与循环卷积的比较 实验目的和要求 掌握循环卷积和线性卷积的原理,与理论分析结果比较,加深理解循环卷积与线性卷积之间的关系. 实验内容和步骤 1) 已知两序列X ...

  5. MATLAB卷积运算(conv、conv2、convn)解释

    1 conv(向量卷积运算) 所谓两个向量卷积,说白了就是多项式乘法.比如:p=[1 2 3],q=[1 1]是两个向量,p和q的卷积如下:把p的元素作为一个多项式的系数,多项式按升幂(或降幂)排列, ...

  6. matlab学习笔记之五种常见的图形绘制功能

    分类: 离散数据图形绘制 函数图形绘制 网格图形绘制 曲面图形绘制 特殊图形绘制 本文重点介绍matlab五种图形绘制方法的后三种. 一.网格图形绘制 以绘制函数z=f(x,y)三维网格图为例,下面为 ...

  7. 卷积(convolution)与相关(correlation)(matlab 实现)

    1. 卷积(convolution) 输出 y(n) 是作为在 x(k) 和 h(n−k)(反转和移位)重叠之下的样本和求出的. 考虑下面两个序列: x(n)=[3,11,7,0,−1,4,2],−3 ...

  8. Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现(转)

    Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些论文, ...

  9. 卷积神经网络CNN介绍:结构框架,源码理解【转】

    1. 卷积神经网络结构 卷积神经网络是一个多层的神经网络,每层都是一个变换(映射),常用卷积convention变换和pooling池化变换,每种变换都是对输入数据的一种处理,是输入特征的另一种特征表 ...

随机推荐

  1. 使用MyEclipse/Eclipse修改项目名称报Can't convert argument: null!

    报错: java.lang.IllegalArgumentException: Can't convert argument: null! 方法/步骤    报错原因:使用MyEclipse修改项目名 ...

  2. 控制器方法重复命名导致nginx 504的问题

    由于控制器方法重复命名重启swoole后运行代码导致 504 Gateway Time-out ,查看laravel日志和nginx日志才找原因所在,以后还是要多看错误日志.

  3. C语言数组篇(四)二维数组

      二维数组声明: ][] ={{,,},{,,}; //两行 三列         二维数组在声明的时候可以不写行,但一定要写列 ] = {{,},{,,},{}}; //未声明的地方自动补零 二维 ...

  4. 笔记-scrapy-cookie

    笔记-scrapy-cookie传递 1.      scrapy cookie传递 1.1.    开始 与cookie相关的设置参数有两个: COOKIES_ENABLED 决定是否使用cooki ...

  5. TouTiao开源项目 分析笔记5

    1.深入理解RxJava 1.1.基本上现在的APP都会有请求网络,然后处理回调的业务吧. 如果请求的数据很多,业务越来越复杂,怎么处理呢? 这里我用到了RxJava来帮我处理业务. RxJava主要 ...

  6. 关于requestMapping 进行url映射实现小小知识点 以及如何获取请求的url中的参数

    requstMapping 用来处理url映射  可以作用在controller类上  也可以作用在方法上 经常使用的方式  通过接收一种映射关系 @RequestMapping("/del ...

  7. CFileDialog OFN_NOCHANGEDIR

    问题:CFileDialog 调用后变成了当前工作路径,变成了CFileDialog所选择的路径. 解决:在CFileDialog的dwFlags 设置标志OFN_NOCHANGEDIR就可以了,不会 ...

  8. printf("%d \n", -1 < sizeof(int) ) Implicit conversion

    ; printf( < sizeof(int) ); 结果输出: 0 在写程序时,经常对于比较很随意,特别是类型不同时,然而这带来的错误也是意想不到,却理所当然. 剖析: sizeof(int) ...

  9. Xcode 代码提示功能失效

    前言: 以前好像很少碰到Xcode中代码提示出问题的情况,最近经常遇到这个问题.没有了Xcode的智能提示,发现我已完全不会写代码了. 本来想吐槽下万恶的baidu,鉴于百度前端时间的各种(贴吧.竞价 ...

  10. USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】

    holstein解题报告 --------------------------------------------------------------------------------------- ...