1.基本原理
步骤如下,根据公式很容易写出代码;
(1)求误差;
(2)求增益;
(3)求互相关矩阵;
(4)求输出;
e
(
n
)
=
d
(
n
)
−
y
(
n
)
g
‾
(
n
)
=
λ
−
1
P
(
n
−
1
)
x
(
n
)
α
(
n
)
=
1
+
g
‾
T
(
n
)
x
(
n
)
g
(
n
)
=
g
‾
(
n
)
α
(
n
)
w
(
n
)
=
w
(
n
−
1
)
+
g
(
n
)
e
(
n
)
P
(
n
)
=
λ
−
1
P
(
n
−
1
)
−
g
(
n
)
g
‾
T
(
n
)
y
(
n
)
=
x
(
n
)
w
T
\begin{aligned} &e(n)=d(n)-y(n)\\ &\pmb{\overline{g}}(n)=\lambda^{-1}\pmb{P}(n-1)\pmb{x}(n) \\ &\alpha (n) = 1 + \pmb{\overline{g}}^T(n)\pmb{x}(n)\\ &\pmb{g}(n) = \frac{\pmb{\overline{g}}(n)}{\alpha (n)}\\ &\pmb{w}(n)=w(n-1)+ \pmb{g}(n)e(n)\\ &\pmb{P}(n)=\lambda^{-1}\pmb{P}(n-1)-\pmb{g}(n)\pmb{\overline{g}}^T(n)\\ &y(n)=\pmb{x}(n)\pmb{w}^T\\ \end{aligned}
e(n)=d(n)−y(n)gg(n)=λ−1PP(n−1)xx(n)α(n)=1+ggT(n)xx(n)gg(n)=α(n)gg(n)ww(n)=w(n−1)+gg(n)e(n)PP(n)=λ−1PP(n−1)−gg(n)ggT(n)y(n)=xx(n)wwT
2.代码实现
clear;close;
% 初始化
N = 1000; % 采样数
Fs = 500; % 采样频率
n = 0 : N-1;
t = n / Fs;
d = (sin(2 * pi * 3 * t))'; % 纯净信号,作为参考信号;
noise = (0.5 * randn(1, length(t)))'; % 噪声;
x = d + noise; % 加如性噪声;
order_n = 10; % 滤波器的阶数;
w = (zeros(1, order_n))'; % 权重系数初始化0
x_len = length(x);
p = 0.1 * eye(order_n, order_n); % 初始化互相关向量单位矩阵
a = 0.1;
y = (zeros(1, x_len))'; % 输出向量
e = (zeros(1, x_len))'; % 误差向量
%RLS自适应迭代
lambda_inverse = 1 / a;
for n = order_n : x_len
x1 = x(n - order_n + 1 : 1 : n);
g_overline_n = lambda_inverse * p * x1; %计算g_overline
g_overline_n_1 = lambda_inverse * x1' * p; %计算g_overline
alpha_n = 1 + g_overline_n' * x1; % 计算alpha
g_n = g_overline_n / alpha_n; % 计算增益
e(n) = d(n) - w' * x1; % 计算误差
w = w + g_n * e(n);
p = lambda_inverse * p - lambda_inverse * g_n * x1' * p;
%p = lambda_inverse * p - g_n * g_overline_n';
y(n) = w' * x1;
end
%画图
figure(1);
subplot(311);plot(t, x);axis([0 1 -5 5]);xlabel('时间');ylabel('s幅度');
hold on
subplot(312);plot(t, d);axis([0 1 -5 5]);xlabel('时间');ylabel('x幅度');
hold on
subplot(313);plot(t, y);axis([0 1 -5 5]);xlabel('时间');ylabel('e幅度');