自适应滤波之最小均方(LMS)算法以及matlab实现

使用LMS算法对进行信号分离

clear
close all
clc
a1=-1.6;   
a2=0.8; 
[x,fs1]=audioread('handel.wav');
[dn,fs2]=audioread('handel_echo.wav');
figure;
subplot(2,1,1);
plot(x);
title('spk参考信号');
subplot(2,1,2);
plot(dn);
title('MICin-期望信号');

n=max(size(x));  % 信号中的时间点个数   
P=5;   % LMS算法重复运算5次,用于评估五次运算产生的误差的平均水平
e=zeros(1,n);   % 用于存放误差
ep=zeros(1,n);  % 用于存放五次运算累积的误差
ee=zeros(1,n);  % 用于存放平方差
%算法
h=waitbar(0,'计算进度');
steps = P;
for p=1:P 
L=100;     % 滤波器阶数,考虑到两个信号之间没有延时,且这里只是用来分离出输入的x信号,而且误差不做要求,因此不需要设置太高的阶数 
u=0.0022;   % 增益常数 
wL=zeros(L,n);  % 产生一个权向量矩阵
% 计算的时候需要注意两个音频序列的长度是否匹配,否则会出现index越界,矩阵大小不匹配等问题。
for i=(L+1):n   % 计算权向量矩阵中第三组权向量到最后一组权向量相关的变量,根据x和e=x-y求下一个y,没有d(n)
    X=x(i-L:1:(i-1));   % 更新滤波器的参考矢量X(n)
    y(i)=X'*wL(:,i);    % 根据x计算i时刻输出信号 
    e(i)=dn(i)-y(i);     % 计算i时刻误差信号 
    wL(:,(i+1))=wL(:,i)+2*u*e(i)*X;     % 更新i时刻滤波器的权向量 
    ee(i)=e(i)^2;   % 更新平方差
end 
ep=ep+ee;  % 平方差累积
waitbar(p/steps);
end
close(h);
eq=ep/P;    % 五十次重复计算平方差求均值
a1L=-wL(2,1:n);   % a1在LMS算法下值的变化,wL矩阵中第一行的1到n个数,权向量矩阵第一行 
a2L=-wL(1,1:n);   % a2在LMS算法下值的变化 ,wL矩阵中第二行的1到n个数,权向量矩阵第二行 

%画图
figure;
subplot(3,2,1);
plot(x); 
title('需要采集的声音Voice');    % 根据w产生的随机信号x

subplot(3,2,2);
plot(dn);
title('被回声污染的了Voice,就是MICin');   % 五十次运算误差求均值

subplot(3,2,3);
plot(y); 
title('合成回声信号');    % 根据w产生的随机信号x

subplot(3,2,4);
plot(e);
title('误差');   % 五十次运算误差求均值


subplot(3,2,5); 
plot(a1L,'r-'); % 权向量矩阵第一行
hold on;
plot(a2L,'k-'); % 权向量矩阵第二行
title('权向量参数的学习过程');  
legend('a1L','a2L');

运行后效果

  • 26
    点赞
  • 304
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值