赞
踩
我们知道滤波的本质就是卷积,但是为什么用filter函数输出的数据长度和用conv函数输出的长度不一致呢?
可以理解x(n)是待滤波的数据,h(n)是滤波器系数。待滤波的数据个数有M个,滤波器长度为N,卷积得到的结果长度应该为M+N-1。
例如:
x = [1 2 3 4 5]
h = [1 2 3]
y1=conv(h,x)
h(n) 1 2 3 x(n) 5 4 3 2 1 输出1, h(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
运行结果
y1 =
1 4 10 16 22 22 15
y1长度为3+5-1=7
如果是用filter函数,输入数据x,滤波器系数为h
y2 = filter(h,1 x)
filter的输出结果是y2,y2 长度和待滤波数据的个数一样是5个。计算过程如下
h(n) 1 2 3
x(n) 5 4 3 2 1
输出1,
h(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
运行结果
y2 =
1 4 10 16 22
到这里可以发现两者的区别了。
二者处理方法的区别:
filter函数平移停滞在x的最后一个输入x(5)与滤波器的第一个系数h(1)对齐时。而conv函数平移停留在x的最后一个输入x(5)与滤波器系数的最后一个系数h(3)对齐。
如何得到使用filter函数得到和卷积结果长度一样呢?我们先试试以下命令,通过补零的方法
y3 = filter([h,zeros(1,4)],1,x)
平移计算过程如下
h(n) 1 2 3 0 0 0 0
x(n) 5 4 3 2 1
输出1,
h(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
运行结果
y3 =
1 4 10 16 22
y4 = filter(h,1,[x,zeros(1,2)])
运行结果
y4 =
1 4 10 16 22 22 15
输出结果与卷积一致
还有另一种写法
y5 = filter(x,1,[h,zeros(1,4)])
平移计算过程
h(n) 1 2 3 0 0 0 0 x(n) 5 4 3 2 1 输出1, h(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
运行结果
y5 =
1 4 10 16 22 22 15
通过补零,观察计算过程,与卷积是相同的,结果与卷积一致。
补多少个零呢?设置补零的个数:补零后的长度为卷积结果的长度即可。
filter函数y(n)是从n=1开始,认为所有n<1都为0;而conv是从卷积公式计算,包括n<1部分。因此filter 和conv 的结果长短不同。
但本质是一样的,翻转,平移,乘积和。
因此,要想使用filter函数得到与卷积结果一致长度的结果,要补零。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。