基于DSP的LMS算法实现与实物测试(一)

  1. LMS自适应算法

        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建模做准备。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸡血键盘手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值