LMS算法去噪


LMS在語音增強中具備廣泛的應用,是最為常見的算法之一,該算法也是很多更為復雜算法的理論基礎或 組成部分,例如陣列語音增強中的重要方法--GSC(廣義旁瓣抵消)。LMS算法由最初的版本延伸出來許多變種結構,例如歸一化LMS,變步長LMS等等。這些都是對LMS的迭代部分進行了一定的優化所得。

最近又看起了GSC的實現,以前寫的程序又重新看了一遍,差不多又鞏固了一遍,希望以后自己能夠不要忘記了····我這個破記性,有時候真是很無奈!

首先是理論部分推導,在此不詳述,簡要給出流程:

                                自適應線性組合器及LMS原理圖

MATLAB實現程序如下(變步長LMS):

clear;%清除工作空間
close all%...
sysorder=5;%抽頭數...
samples_per_period=50; %周期采樣頻率
N=10*samples_per_period-1;%總采樣次數
signal=cos(pi*0.02*[0:N-1])+sin(2*pi*0.02*[0:N-1])+cos(3*pi*0.02*[0:N-1])+sin(4*pi*0.02*[0:N-1])+cos(5*pi*0.02*[0:N-1])...
     +sin(6*pi*0.02*[0:N-1])+cos(7*pi*0.02*[0:N-1])+sin(8*pi*0.02*[0:N-1])+cos(9*pi*0.02*[0:N-1]);%初始輸入信號/期望信號
figure()    %作圖1 的第一子圖
subplot(2,1,1);
 plot(signal);
 grid;
 title('自適應濾波器的理想輸入');
nvar=0.5;%噪聲方差
noise=nvar*randn(1,N );%噪聲信號
X=signal+noise;%帶加性噪聲的輸入信號
delayX=[0 X];% 輸入信號延時
subplot(2,1,2);%作圖1的第二子圖
plot(delayX);
 grid;
 title('自適應濾波器的噪聲輸入');
SIGNAL=[signal 0];
 %M=32;%濾波器長度
M=length(signal);%M為接收數據長度
mu=0.002;%迭代步長
totallength=size(X,1);%步長
N=size(signal,2);%60結點作為訓練序列
%算法的開始
w=zeros(sysorder,1);%初始化
for n=sysorder:N
    y(1:sysorder)=X(1:sysorder);  % 前五個值賦為原始值
    y(n)=X(n-sysorder+1:1:n)*w;  %系統輸出
    e(n)=y(n)-signal(n);  %系統誤差
    if n<200
         mu=0.0032;
     else
         mu=0.0015;
    end
     step=mu./(1+abs(e(n)).^2);
     w=w+step*X(n:-1:n-sysorder+1)'*e(n);%迭代方程
end
Y=-y;
 %initial_status=initlms(zeros(1,M),mu);%濾波器設初值
%[Y,e,initial_status]=adaptlms(X,SIGNAL,initial_status);%LMS自適應濾波器輸出
figure()    %作圖2的第一子圖
subplot(2,1,1);
 plot(0:N-1,Y,'r',1:N ,signal,'b');
 grid;
 title('預測信號與實際信號的比較');
legend('預測信號', '實際信號');
error=signal-Y;%輸出誤差信號
subplot(2,1,2);%作圖2的第二子圖
plot(error);
 grid;
 title('自適應濾波器的預測誤差');

 

所得仿真跟蹤濾波圖形結果示意圖如下所示,可見預測信號在LMS收斂之后能夠較好的跟蹤實際信號的變換,且去除了其中的噪聲信號(含噪信號在此未貼圖)。其中預測誤差由信號未對齊所引起,程序中引入了一個延時所致:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM