資源簡介
一個實現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
評論
共有 條評論