1. 程式人生 > >維納濾波LMS matlab

維納濾波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, :))