资源简介
一个实现nlms算法的matlab程序,可以作为声音信号,回声消除方面的扩展应用
代码片段和文件信息
%NLMS算法
%读取声音文件
[sourceUufsubits]=wavread(‘sourceU.wav‘); %远端传来的语音
[sourceDdfsdbits]=wavread(‘sourceD.wav‘); %近端麦克风采集的语音
[unumn]=size(sourceU); %sourceU.wav有unum个采样点
[dnumn]=size(sourceD); %sourceD.wav有dnum个采样点
tic
M = 100;%每块M个采样点 %滤波器的长度
k=1; %当前是第几个采样点
r=0.999;
delaynum = 0;
W=zeros(M1); %抽头系数M*1矩阵
W2=zeros(M1);
U=zeros(M1); %存储远端信号的M*1矩阵
D=zeros(M1); %存储麦克风信号的M*1矩阵
E=zeros(M1);
ef=zeros(dnum1);
powerD = 0; %用来表示M个麦克风声音采样点的总能量
powerU = 0; %用来表示M个远端声音采样点的总能量
powerE = 0;
EpowerD=0;
EpowerU=0; %归一化后的能量均值
EpowerE=M*M;
u_max = 0.5; %表示出现的最大的u值
d_max = 0.5; %表示出现的最大的u值
double=0;
T0 = 0.3; % 判断是否双端对话的相关性,小于说明是双端对话中
T1 = 0.0001;% 判断有没有远端语音的门限值,大于说明有远端语音
T2 = 0.0001;
T3=0.0001;%发散阈值
%循环处理,直到完成
while 1
if k >unum
break;
end
if k >dnum
break;
end
u=sourceU(k); %读入第k个sourceU的采样点
pu =u*u;
if pu > u_max
u_max=pu; %更新最大的u值
end
%更新U向量
ut=U(1:M-1);
u_front=U(M); %保存将要移去的值
U(2:M)=ut;
U(1)=u;
d=sourceD(k);%读入第k个sourceD的采样点
pd=d*d;
if pd > d_max
d_max=pd;
end
%更新D向量
dt=D(1:M-1);
d_front=D(M); %保存将要移去的值
D(2:M)=dt;
D(1)=d;
e = d - W‘*U;
%更新E向量
et=E(1:M-1);
e_front = abs(E(M)); %保存将要移去的值
E(2:M)=et;
E(1)=e;
ef(k)=e;
pe=e*e;
%计算E、D、U向量的能量
powerD = powerD-(d_front*d_front)+pd;
powerU = p
评论
共有 条评论