LMS算法自适应滤波器

目录

1、自适应滤波器简介

2、自适应滤波噪声抵消原理

3、LMS算法原理

4、matlab实现

  4.1、LMSfliter()

  4.2、LMSmain()

5、结果分析

 


 

1、自适应滤波器简介


 

  自适应滤波,就是利用前一时刻以获得的滤波器参数的结果,自动的调节现时刻的滤波器参数,以适应信号和噪声未知的或随时间变化的统计特性,从而实现最优滤波。自适应滤波器实质上就是一种能调节自身传输特性以达到最优的维纳滤波器。自适应滤波器不需要关于输入信号的先验知识,计算量小,特别适用于实时处理。维纳滤波器参数是固定的,适合于平稳随机信号。卡尔曼滤波器参数是时变的,适合于非平稳随机信号。然而,只有在信号和噪声的统计特性先验已知的情况下,这两种滤波技术才能获得最优滤波。在实际应用中,常常无法得到信号和噪声统计特性的先验知识。在这种情况下,自适应滤波技术能够获得极佳的滤波性能,因而具有很好的应用价值。

  常用的自适应滤波技术有:最小均方(LMS)自适应滤波器、递推最小二乘(RLS)滤波器格型滤波器和无限冲激响应(IIR)滤波器等。这些自适应滤波技术的应用又包括:自适应噪声抵消、自适应谱线增强和陷波等。


 

2、自适应滤波噪声抵消原理

  

 

 

  图1给出了用自适应噪声抵消技术来解决噪声背景中的信号提取问题的基本原理。主输入端接收从信号源发来的信号s但是受到噪声源的干扰收到噪声vo。参考输入端的参考信号为vi是一个与有用信号s无关但与vo相关的噪声信号。主输入中含有待抵消的加性噪声,参考输入对准主输入中的噪声vo。利用两输入噪声的相关性和信号与噪声的独立性,使参考输入通过自适应滤波器与主输入中噪声分量逼近并相减,输出误差信号。自适应滤波算法决定滤波器对参考信号 v1的处理,使得滤波器的输出尽可能地逼近主输入中的干扰成分。所以,在最佳准则意义下滤波器的输出v逼近vo等效于系统的输出e逼近s。从而在噪声对消器的输出端大大地提高了信噪比。但若参考通道除检测到噪声v1外,还收到信号分量,则自适应滤波器的输出中将包含信号分量,从而使噪声对消效果变坏。因此,为获得良好的噪声对消性能,应使参考通道检测到的信号尽可能小,在信号不可测的噪声环境拾取参考输入信号。

3、LSM算法原理

http://download.csdn.net/source/432206见其推导

4、matlab函数实现

4.1、LMSfilter(xn,dn,M,mu)

% 输入参数:
%     xn   输入的信号序列      (列向量)
%     dn   所期望的响应序列    (列向量)
%     M    滤波器的阶数        (标量)
%     mu   收敛因子(步长)      (标量)     要求大于0,小于xn的相关矩阵最大特征值的倒数    
% 输出参数:
%     W    滤波器的权值矩阵     (矩阵)
%          大小为M x itr,
%     en   误差序列(itr x 1)    (列向量)  
%     yn   实际输出序列         (列向量)
function [yn,W,en]=LMSfilter(xn,dn,M,mu)
itr = length(xn);
en = zeros(itr,1);             % 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差
W  = zeros(M,itr);             % 每一行代表一个加权参量,每一列代表-次迭代,初始为0
% 迭代计算
for k = M:itr                  % 第k次迭代
    x = xn(k:-1:k-M+1);        % 滤波器M个抽头的输入
    y = W(:,k-1).' * x;        % 滤波器的输出
    en(k) = dn(k) - y ;        % 第k次迭代的误差
    % 滤波器权值计算的迭代式
    W(:,k) = W(:,k-1) + 2*mu*en(k)*x;
end
% 求最优时滤波器的输出序列  r如果没有yn返回参数可以不要下面的
yn = inf * ones(size(xn)); % inf 是无穷大的意思
for k = M:length(xn)
    x = xn(k:-1:k-M+1);
    yn(k) = W(:,end).'* x;%用最后得到的最佳估计得到输出
end

4.2、filtermain()

clc;
clear all;
close all;

%% 产生信号源
[X,Fs,bits] = wavread('C:\Users\mahl\Desktop\现代信号处理\MahlDSP\LMS\wav\XP开机.wav');
s = X(:,1); %取出双通道中其中一个通道作为信号源s
wavwrite(s,Fs,bits,'C:\Users\mahl\Desktop\现代信号处理\MahlDSP\LMS\wav\原始音频'); %创建原始音频.wav
n = length(s);
t=(0:n-1);
figure(1);
subplot(4,1,1);
plot(t,s);grid;
ylabel('幅度');
xlabel('时间');
title('原始音频信号');

%% 产生均值为0方差为0.1的噪声信号
v = sqrt(0.1)*randn(n,1);

%% 产生AR模型的噪声
ar=[1,1/2];   %AR模型
v_ar=filter(1,ar,v);
% subplot(4,1,2);
% plot(t,v_ar);grid;
% ylabel('幅度');
% xlabel('时间');
% title('AR模型噪声信号');

%% 产生MA模型的噪声 是AR模型的相关噪声
ma=[1,-0.8,0.4,-0.2];  %MA模型
v_ma=filter(ma,1,v); 
subplot(4,1,2);
plot(t,v_ma);grid;
ylabel('幅度');
xlabel('时间');
title('相关噪声信号');

%% 产生期望信号
dn = s + v_ar; 
wavwrite(dn,Fs,bits,'C:\Users\mahl\Desktop\现代信号处理\MahlDSP\LMS\wav\含噪音频'); %创建含噪音频
subplot(4,1,3);
plot(t,dn);grid;
ylabel('幅度');
xlabel('时间');
title('含噪音频信号');

%% LMS滤波算法
M = 10;     %滤波器阶数M
mu = 0.0005;  %滤波器的步长
[ylms,W,elms] =LMSfilter(v_ma,dn,M,mu); 

%% 绘制去噪后的语音信号
subplot(4,1,4);
plot(t,elms);grid;
ylabel('幅度');
xlabel('时间');
title('去噪后的音频信号');
wavwrite(elms,Fs,bits,'C:\Users\mahl\Desktop\现代信号处理\MahlDSP\LMS\wav\去噪音频');%保存去除噪声的音频

%%
e = s-elms;%剩余噪声
figure(2);
subplot(2,1,1);
plot(t,e);grid;
ylabel('幅度');
xlabel('时间');
title('剩余噪声');

%% 一小段三个信号比较
subplot(2,1,2);
t=(50000:50500);
plot(t,elms(50000:50500,1 ),'r',t,e(50000:50500,1),'g',t,s(50000:50500,1),'b');
axis([50000,50500,-1,1]);
ylabel('幅度');
xlabel('时间');
legend('去噪后的语音信号','剩余噪声','原始音频');
title('一小段三个信号比较');

5、结果分析

我们从图2可以看到,虽然真实的音频信号中混杂了很强的噪声,甚至噪声淹没了真实的信号,但是通过我们的LMS自适应滤波器后,可以很好的恢复出真实信号。所以自适应滤波器具有良好的去噪性能。从图3,图4,图5分析来看,虽然随着步长u增加,收敛时间t逐渐减少,音频信号在u很小的时候,因为收敛慢,混有噪声;但是当u增加是,音频信号越来越清晰。但是当步长超过某一值时,音频中又开始很有噪声产生,再接着增加步长u,甚至会把音频信号也滤去掉。所以若u值取的过小,收敛速度就会过于缓慢,当取的过大时,又会造成系统收敛的不稳定,导致发散。所以选取最佳的u值是LMS算法中一个重要的问题。

 


 

posted on 2015-01-01 16:36  Marty at HDU  阅读(33938)  评论(3编辑  收藏  举报

导航