LMS算法的原理是通过不断地调整滤波器的权值,使得滤波器的输出与期望输出之间的误差最小化。这种算法可以用于降噪、信号增强、信号预测等应用中。
LMS算法的基本思想是通过不断地调整滤波器的权值,使得滤波器的输出与期望输出之间的误差最小化。这个误差可以用均方误差来表示,即期望输出与滤波器输出之间的平方差的平均值。LMS算法的核心是权值更新公式,该公式根据误差信号和输入信号的乘积来更新滤波器的权值。
LMS自适应算法原理如下图所示:
权值计算公式如下:
其中,w(n)是滤波器的权值向量,μ是步长参数,e(n)是期望d(n)与滤波器输出y(n)之间的误差,x(n)是输入参考信号。
LMS算法需要有2个输入,3个输出,输入参考信号x(n),输入期望信号d(n),输出权重w(n),输出滤波后的信号y(n)以及误差e。对于初学者而言,此处会有个疑问,都知道期望信号了还计算啥?此处,涉及到了实际应用场景,验证了一句话,实践与理论往往差别巨大。需要重点说明的是,在实际应用中,我们反其道而行之,真实语音信号混有噪声,我们不方便也没有良好的方式获取,而噪声比较容易获取,并且噪声存在一定相干性,所以在真实应用场景下,x(n)为混有噪声的语音信号,d(n)反而是噪声信号,将噪声认为是我们想得到的信号,而真实语音信号认为是干扰信号,从我们所需角度,那么此时e(n)反而成为了我们想要的目标语音信号,y(n)则为误差信号了。所以,站在角度不同,含义不同。
LMS计算的步骤如下:
①初始化滤波器的权值向量w(0),可初始化为0;
②输入信号x(n),麦克风采集;
③期望输出d(n),通过麦克风采集或对x(n)滤波等途径获取;
④更新权重w(n);
⑤计算滤波器的输出y(n);
⑥计算误差e(n)
2. Matlab仿真
clc;
clear all;
close all;
[X,Fs,bits] = wavread('k:\your_phone_is_paired_norm_8k.wav');%% 输入的音频文件
% [X,Fs,bits] = wavread('C:\Rumble2.wav');%% 输入的音频文件,测试第二组
s = X(:,1); %取出双通道中其中一个通道作为信号源s
wavwrite(s,Fs,bits,'k:\audio原始音频.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);
%% 产生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,'k:\audio叠加噪声音频'); %创建含噪音频
subplot(4,1,3);
plot(t,dn);grid;
ylabel('幅度');
xlabel('时间');
title('叠加噪声音频信号');
%% LMS滤波算法
M = 10; %滤波器阶数M
mu = 0.001; %滤波器的步长
[ylms,W,elms] =LMSfilter(v_ma,dn,M,mu);
%% 绘制去噪后的语音信号
subplot(4,1,4);
plot(t,elms);grid;
ylabel('幅度');
xlabel('时间');
title('去噪后的音频信号');
wavwrite(elms,Fs,bits,'k:\audio去噪音频');%保存去除噪声的音频
%%
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('LMS滤波后的语音信号','误差值','原始音频');
title('原始信号,含噪信号,去噪信号比较');
运行结果:
结论:
Matlab的LMS仿真结果与实际一致,LMS算法模型正确,为下一步DSP建模做准备。