当前位置:   article > 正文

matlab中filter函数和conv函数的区别_conv函数进行滤波

conv函数进行滤波

问题:

我们知道滤波的本质就是卷积,但是为什么用filter函数输出的数据长度和用conv函数输出的长度不一致呢?

  • y=filter(p,d,x)用来实现差分方程,另一句话说是实现滤波,d表示差分方程输出y的系数,p表示输入x的系数,而x表示输入序列。输出结果长度数等于x的长度。
  • y=conv(x,h)是用来实现卷积的,对x序列和h序列进行卷积,输出的结果个数等于x的长度与h的长度之和减去1。
  • 二者是相通的,只不过处理的方法不同。

卷积定义式

在这里插入图片描述
可以理解x(n)是待滤波的数据,h(n)是滤波器系数。待滤波的数据个数有M个,滤波器长度为N,卷积得到的结果长度应该为M+N-1。

conv

例如:

x = [1 2 3 4 5]
h = [1 2 3]
y1=conv(h,x)
  • 1
  • 2
  • 3
h(n)					1	2	3
x(n)	5	4	3	2	1
输出1h(n)					1	2	3
x(n)		5	4	3	2	1
输出4
h(n)					1	2	3
x(n)			5	4	3	2	1
输出10
h(n)					1	2	3
x(n)				5	4	3	2	1
输出16
h(n)					1	2	3
x(n)					5	4	3	2	1
输出22
h(n)					1	2	3
x(n)						5	4	3	2	1
输出22
h(n)					1	2	3
x(n)							5	4	3	2	1
输出15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

运行结果

y1 = 
		1 4 10 16 22 22 15
		
  • 1
  • 2
  • 3

y1长度为3+5-1=7

filter本质

如果是用filter函数,输入数据x,滤波器系数为h

y2 = filter(h,1 x)
  • 1

filter的输出结果是y2,y2 长度和待滤波数据的个数一样是5个。计算过程如下

h(n)					1	2	3
x(n)	5	4	3	2	1
输出1h(n)					1	2	3
x(n)		5	4	3	2	1
输出4
h(n)					1	2	3
x(n)			5	4	3	2	1
输出10
h(n)					1	2	3
x(n)				5	4	3	2	1
输出16
h(n)					1	2	3
x(n)					5	4	3	2	1
输出22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行结果

y2  = 
		1 4 10 16 22
  • 1
  • 2

到这里可以发现两者的区别了。
二者处理方法的区别:
filter函数平移停滞在x的最后一个输入x(5)与滤波器的第一个系数h(1)对齐时。而conv函数平移停留在x的最后一个输入x(5)与滤波器系数的最后一个系数h(3)对齐。

如何得到使用filter函数得到和卷积结果长度一样呢?我们先试试以下命令,通过补零的方法


y3 = filter([h,zeros(1,4)]1,x) 

  • 1
  • 2
  • 3

平移计算过程如下

h(n)					1	2	3	0	0	0	0
x(n)	5	4	3	2	1
输出1h(n)				1	2	3	0	0	0	0
x(n)	5	4	3	2	1
输出4
。
。
直到
h(n)				1	2	3	0	0	0	0
x(n)				5	4	3	2	1
输出22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果

y3 = 
		1 4 10 16 22
  • 1
  • 2
  • filter输出结果与输入数据长度一致(5个)
  • 得到的结果不是卷积的结果长度
  • 下面试试另一种写法
y4 = filter(h,1,[x,zeros(1,2)])
  • 1

运行结果

y4 = 
		1 4 10 16 22 22 15
  • 1
  • 2

输出结果与卷积一致
还有另一种写法


y5 = filter(x,1,[h,zeros(1,4)]) 
  • 1
  • 2

平移计算过程

h(n)					1	2	3	0	0	0	0
x(n)	5	4	3	2	1

输出1h(n)				1	2	3	0	0	0	0
x(n)	5	4	3	2	1
输出4
h(n)				1	2	3	0	0	0	0
x(n)		5	4	3	2	1
输出10
h(n)				1	2	3	0	0	0	0
x(n)			5	4	3	2	1
输出16
h(n)				1	2	3	0	0	0	0
x(n)				5	4	3	2	1
输出22
h(n)				1	2	3	0	0	0	0
x(n)					5	4	3	2	1
输出22
h(n)				1	2	3	0	0	0	0
x(n)						5	4	3	2	1
输出15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

运行结果

y5 = 
		1 4 10 16 22 22 15
  • 1
  • 2

通过补零,观察计算过程,与卷积是相同的,结果与卷积一致。
补多少个零呢?设置补零的个数:补零后的长度为卷积结果的长度即可。

总结

filter函数y(n)是从n=1开始,认为所有n<1都为0;而conv是从卷积公式计算,包括n<1部分。因此filter 和conv 的结果长短不同。
但本质是一样的,翻转,平移,乘积和。
因此,要想使用filter函数得到与卷积结果一致长度的结果,要补零。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/552138
推荐阅读
相关标签
  

闽ICP备14008679号