--neozng1@hnu.edu.cn
自适应滤波
自适应滤波以前述的wiener filter为基础,这里我们也从统计与优化和控制理论两个角度来介绍它,顺着上一篇介绍维纳滤波器的文章的思路继续进行推导。
-
统计与优化
前述的wiener filter在求取最优解的时候受到的限制很多,不仅要求噪声和目标信号的统计特性已知,还需要采集无限时间的信号序列(从零到正无穷)后以得到最优解,而在实际情况下我们一般利用一段时间内的信号序列对
ω
o
\omega_o
ωo做出无偏估计。不过,这也只是权宜之计。首先倘若要对序列信号进行实时处理,采集一段时间这个要求就无法满足。其次若对信号和噪声的统计特性完全未知甚至它们是非平稳态的,那么问题相当于无解。
不过,我们可以从维纳滤波器的近似求解中看出一些蛛丝马迹:利用一小段时间内的信号对误差的期望进行最小化,如果再对这个结果进行推广,缩小这个“一小段时间”的长度进行估计并保存这次的结果,认为是当前最佳同时在稍后进行迭代,不再追求最优解而是尽量消除噪声并尽可能快速的收敛,不也是一种很好的方法吗?
那要怎么才能知道
ω
\omega
ω要如何更新呢?对于全局最优解,我们要求一个
ω
\omega
ω使得下式为零:
▽
=
∂
L
∂
ω
T
=
E
{
−
2
y
(
n
)
x
(
n
)
+
2
x
(
n
)
T
x
(
n
)
ω
}
\bigtriangledown =\frac{\partial{L}}{\partial{\omega^T}}=E\{-2y(n)x(n)+2x(n)^Tx(n)\omega\}
▽=∂ωT∂L=E{−2y(n)x(n)+2x(n)Tx(n)ω}
并且之前我们已经得到,我们要优化的误差函数拥有很好的性质:它是一个凸函数,其上没一点的梯度都指向最优解!很直觉的想法就是,我们让
ω
\omega
ω每次往最优解迭代若干步,即
ω
t
+
1
=
ω
t
−
k
∂
L
∂
ω
t
\omega_{t+1}=\omega_t-k\frac{\partial{L}}{\partial{\omega_t}}
ωt+1=ωt−k∂ωt∂L,其中k为调制因子(学习率),这不就是梯度下降法吗!如果在每一次采集完成后都进行数据更新,就成为了随机梯度下降法。很多的优化问题如果无法一次性求解,往往会诉诸迭代的解法,逐步逼近最终的解。对于极限情况,我们每采集一次数据就进行一次参数估计,即每一步都更新
ω
\omega
ω 。
不过这里还有一个问题亟待解决,要计算处代价函数上某一点的梯度,还是需要输入信号和原信号的一些统计特性,因此我们让代价函数就等于误差向量,认为当前的样本的损失可以替代总损失。学习过优化或者神经网络的朋友应该对此应该不陌生了,那么求梯度就有:
▽
J
^
=
∂
e
(
n
)
2
∂
ω
(
n
)
=
∂
[
y
(
n
)
−
y
^
(
n
)
]
2
∂
ω
(
n
)
=
−
2
[
y
(
n
)
−
y
^
(
n
)
]
⋅
∂
y
(
n
)
^
∂
ω
(
n
)
=
−
2
e
(
n
)
x
(
n
)
(2)
\hat{\bigtriangledown J}=\frac{\partial{e(n)^2}}{\partial\omega(n)}=\frac{\partial[{y(n)-\hat{y}(n)}]^2}{\partial\omega(n)}=-2[{y(n)-\hat{y}(n)}]\cdot\frac{\partial{\hat{y(n)}}}{\partial\omega(n)}=-2e(n)x(n)\tag{2}
▽J^=∂ω(n)∂e(n)2=∂ω(n)∂[y(n)−y^(n)]2=−2[y(n)−y^(n)]⋅∂ω(n)∂y(n)^=−2e(n)x(n)(2)
其实也就是把式(1)中的后半部分用
y
^
(
n
)
x
(
n
)
\hat{y}(n)x(n)
y^(n)x(n)代替然后用结合律和前半部分相消(当然这种视角不太严谨,比较直觉,因为矩阵乘法没对齐,时间戳也不是对应的)。
所以我们只需要之前的
ω
\omega
ω加上当前梯度乘上一个系数就可以达到参数更新的目的了。对于稳态信号,逐渐迭代就能够收敛到最优解附近(根据推导可以发现每次的误差一定会比上次来的小);而对于非平稳信号,也可在数十步之内逐渐跟上,但不可避免的有相较于稳态信号稍大的误差。
对于k值的选取,经过稳定性计算可以得出以下条件:
0
<
μ
<
1
λ
m
a
x
0<μ<\frac{1}{\lambda_{max}}
0<μ<λmax1
其中λ为输入信号自相关矩阵的最大特征值,感兴趣的同学可以自行查找资料,大概证明过程是保证代价函数会随着
ω
\omega
ω的迭代递降,根据递推公式,保证特征值小于1就会让滤波器的输出值收敛。μ越大收敛得越快,但也容易跑飞或者使得累积误差变得的不可接受。
所以最终权重更新的公式为:
ω
t
+
1
=
ω
t
+
2
μ
e
(
n
)
x
(
n
)
\omega_{t+1}=\omega_t+2μe(n)x(n)
ωt+1=ωt+2μe(n)x(n)
搜索关键词:自适应滤波、泰勒展开、特征分解、学习率。
虽然已经找到了求解的方法,但它肯定还是有不足之处,比如收敛速度慢、震荡比较剧烈等。针对这些缺点人们又提出了NLMS、AP、RLS优化等,有些是针对梯度下降的(可以参考之前神经网络部分的adam和momentum);有些是针对噪声和误差统计特性的;感兴趣的同学可以自己搜索。
几个参考资料:adaptic noise canceling
-
控制理论
待更新。笔者还需要进一步查找相关资料。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)