My Personal Time

Desire is the starting point of all achievement

0%

LMS算法

自适应滤波就是利用前一时刻获得的滤波器参数来自动调节现时刻的滤波器参数,以适应信号和噪声随时间变化的统计特性,从而实现最优滤波。

jpg

主输入端接收带噪信号,参考端为噪声信号,其中参考信号vi是与主输入端中信号s无关但与vo相关的噪声信号,利用量输入信号的相关性和有用信号与噪声的独立性,使参考信号尽可能逼近主输入端中的vo并相减从而抵消掉主输入端中的噪声干扰,最终得到有用信号。

算法代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
function [yn,w,en,itr]=LMSALG(xn,dn,M,mu,itr)
% LMS(Least Mean Squre)算法
% 输入参数:
% xn 输入的信号序列 (列向量)
% dn 所期望的响应序列 (列向量)
% M 滤波器的阶数 (标量)
% mu 收敛因子(步长) (标量) 要求大于0,小于xn的相关矩阵最大特征值的倒数
% itr 迭代次数 (标量) 默认为xn的长度,M < itr <= length(xn)
% 输出参数:
% w 滤波器的权值矩阵 (矩阵)
% 大小为M*itr,
% en 误差序列(itr*1) (列向量)
% yn 实际输出序列 (列向量)

% 确定迭代次数,若输入迭代次数itr,则设置为itr;若没有该参数,则设置为输入信号长度
% 参数个数必须为4个或5个
if nargin == 4 % 4个时递归迭代的次数为xn的长度
itr = length(xn);
elseif nargin == 5 % 5个时需满足 M < itr < length(xn)
if itr > length(xn) || itr < M
error('迭代次数过大或过小!');
end
else
error('请检查输入参数的个数!');
end % 初始化参数

en = zeros(itr,1); % 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差
w = zeros(itr,M); % 每一行代表一个加权参量,每一列代表-次迭代,初始为0
% w权系数取为矩阵主要是为了判断该算法的收敛性
xn_r=xn'; %%%%参考行向量
dn_r=dn'; %%%%nmr行向量
% 迭代计算
for kitr = M:itr % 第k次迭代
x = xn(kitr:-1:kitr-M+1); % 滤波器M个抽头的输入
y = w(kitr-1,:)*x; % 滤波器的输出
en(kitr) = dn(kitr) - y; % 第k次迭代的误差
% 滤波器权值计算的迭代式
w(kitr,:) = w(kitr-1,:) + 2*mu*en(kitr)*x';%%xn(kitr-M+1:kitr)';
end

%%%方法一、直接使用filter函数来进行滤波处理
CancellationData = filter(w(end,:),1,xn_r); % 直接使用filter函数来进行滤波处理
yn = dn_r-CancellationData;
yn = yn(M+1:end);% 去掉与滤波系数长度对应的前N个点
yn=yn'; %%输出行向量

% % 求最优时滤波器的输出序列
% yn = zeros(size(xn));
% for kitr = M:length(xn)
% x = xn(kitr:-1:kitr-M+1);
% yn(kitr) = dn(kitr) - w(end,:)*x; % w(:,end)为最后一次迭代生成的滤波器系数
% end
% yn = yn(M:end); % 前面M个数据没有经过滤波处理,所以设置成inf,绘图时不显示