维纳滤波LMS matlab

LMS算法的前提是:参考输入端进入的信号与需要的信号具有相关关系;同时与纯净的有用信号相互独立。

常用在干扰相消的情况下,比如心电图信号常常会混有50Hz的噪声,需要虑除这个噪声,我就可以在参考输入的输入一个50hz的信号。即这个信号与噪声是相关的(频率一致),故可以消除噪声。而心电图信号是个宽带宽的信号,并不是集中在50hz。

% LMS算法 现代数字信号处理及其应用 4.4.4
close all 
clc

% 期望信号d(n)
d = zeros(1,N);
% 2抽头维纳滤波器,迭代次数为N
W = zeros(2, N);
% 2抽头维纳滤波器输入信号
u = zeros(1, N);
% 2抽头维纳滤波器输出信号,即期望信号的估计
y = zeros(1, N);
% 2抽头维纳滤波器输出误差,即y(n) - d(n)
e = zeros(1, N);
J=zeros(1,N);
% 步长
q = 0.025;
N = 1000;
% 噪音信号
v1 = sqrt(0.27)*randn(1,N);
v2 = sqrt(0.1)*randn(1,N);

b1 = -0.8458;
b2 = 0.9458;
% H1:d(n) = b1 * d(n-1) + v1(n);
% H2:x(n) = b2 * x(n-1) + d(n);
% u(n) = x(n) + v2(n)
% 初始化
d(1) = b1 * 0 + v1(1);
x(1) = b2 * 0 + d(1);
u(1) = x(1) + v2(1);
% 二抽头维纳滤波输入信号u(n)
for n = 1:N-1
    d(n+1) = b1 * d(n) + v1(n+1);
    x(n+1) = b2 * x(n) + d(n+1);
    u(n+1) = x(n+1) + v2(n+1);
end

W(:, 1) = [0; 0];
% 期望信号的估计,u(n)经过二抽头维纳滤波的输出
y(1) = ((W(:, 1))') * ([u(1); 0]);
% 输入误差
e(1) = d(1) - y(1);

% 权向量的更新 w(n+1) = w(n) + q * ([u(n); u(n-1)]) * e(n);
% 期望信号的估计 y(n+1) = w(n+1)' * ([u(n + 1); u(n)])
% 估计误差 e(n+1) = d(n+1) - y(n+1)
W(:, 2) = W(:, 1) + q * ([u(1); 0]) * e(1);
y(2) = ((W(:, 2))') * ([u(2); u(1)]);
e(2) = d(2) -y(2);

for n = 2:N-1
    W(:, n+1) = W(:, n) + q * ([u(n); u(n-1)]) * e(n);
    y(n+1) = (W(:, n+1))' * ([u(n + 1); u(n)]);
    e(n+1) = d(n+1) - y(n+1);
end
figure
n=1:N;  
plot(n,W(1, :),n,W(2, :))




猜你喜欢

转载自blog.csdn.net/Sousky/article/details/75253330