• 大小: 3KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-06-13
  • 语言: Matlab
  • 标签: nlms  

资源简介

一个实现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

评论

共有 条评论