❶ 急求:自適應濾波器LMS演算法代碼
自適應過程一般採用典型LMS自適應演算法,但當濾波器的輸入信號為有色隨機過程時,特別是當輸入信號為高度相關時,這種演算法收斂速度要下降許多,這主要是因為輸入信號的自相關矩陣特徵值的分散程度加劇將導致演算法收斂性能的惡化和穩態誤差的增大。此時若採用變換域演算法可以增加演算法收斂速度。變換域演算法的基本思想是:先對輸入信號進行一次正交變換以去除或衰減其相關性,然後將變換後的信號加到自適應濾波器以實現濾波處理,從而改善相關矩陣的條件數。因為離散傅立葉變換�DFT本身具有近似正交性,加之有FFT快速演算法,故頻域分塊LMS�FBLMS演算法被廣泛應用。
FBLMS演算法本質上是以頻域來實現時域分塊LMS演算法的,即將時域數據分組構成N個點的數據塊,且在每塊上濾波權系數保持不變。其原理框圖如圖2所示。FBLMS演算法在頻域內可以用數字信號處理中的重疊保留法來實現,其計算量比時域法大為減少,也可以用重疊相加法來計算,但這種演算法比重疊保留法需要較大的計算量。塊數據的任何重疊比例都是可行的,但以50%的重疊計算效率為最高。對FBLMS演算法和典型LMS演算法的運算量做了比較,並從理論上討論了兩個演算法中乘法部分的運算量。本文從實際工程出發,詳細分析了兩個演算法中乘法和加法的總運算量,其結果為:
復雜度之比=FBLMS實數乘加次數/LMS實數乘加次數=(25Nlog2N+2N-4)/[2N(2N-1)]�
採用ADSP的C語言來實現FBLMS演算法的程序如下:
for(i=0;i<=30;i++)
{for(j=0;j<=n-1;j++)
{in[j]=input[i×N+j;]
rfft(in,tin,nf,wfft,wst,n);
rfft(w,tw,wf,wfft,wst,n);
cvecvmlt(inf,wf,inw,n);
ifft(inw,t,O,wfft,wst,n);
for(j=0,j<=N-1;j++)
{y[i×N+j]=O[N+j].re;
e[i×N+j]=refere[i×N+j]-y[i×N+j];
temp[N+j]=e[i×N+j;}
rfft(temp,t,E,wfft,wst,n);
for(j=0;j<=n-1;j++)
{inf_conj[j]=conjf(inf[j]);}��
cvecvmlt(E,inf_conj,Ein,n);
ifft(Ein,t,Ein,wfft,wst,n);
for(j=0;j<=N-1;j++)
{OO[j]=Ein[j].re;
w[j]=w[j]+2*u*OO[j];}��
}
在EZ-KIT測試板中,筆者用匯編語言和C語言程序分別測試了典型LMS演算法的運行速度,並與FBLMS演算法的C語言運行速度進行了比較,表2所列是其比較結果,從表2可以看出濾波器階數為64時,即使是用C語言編寫的FBLMS演算法也比用匯編編寫的LMS演算法速度快20%以上,如果濾波器的階數更大,則速度會提高更多。