问题:
我们知道滤波的本质就是卷积,但是为什么用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)
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本质
如果是用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
- filter输出结果与输入数据长度一致(5个)
- 得到的结果不是卷积的结果长度
- 下面试试另一种写法
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函数得到与卷积结果一致长度的结果,要补零。