自適應濾波器(Adaptive Filter)
======= Wikipedia的解釋 =======
自適應濾波器是能夠根據輸入信號自動調整性能進行數字信號處理的數字濾波器。作為對比,非自適應濾波器有靜態的濾波器系數,這些靜態系數一起組成傳遞函數。
對於一些應用來說,由於事先並不知道所需要進行操作的參數,例如一些噪聲信號的特性,所以要求使用自適應的系數進行處理。在這種情況下,通常使用自適應濾波器,自適應濾波器使用反饋來調整濾波器系數以及頻率響應。
總的來說,自適應的過程涉及到將代價函數用於確定如何更改濾波器系數從而減小下一次迭代過程成本的算法。價值函數是濾波器最佳性能的判斷准則,比如減小輸入信號中的噪聲成分的能力。
隨着數字信號處理器性能的增強,自適應濾波器的應用越來越常見,時至今日它們已經廣泛地用於手機以及其它通信設備、數碼錄像機和數碼照相機以及醫療監測設備中。
下面圖示的框圖是最小均方濾波器(LMS)和遞歸最小平方(en:Recursive least squares filter,RLS,即我們平時說的最小二乘法)這些特殊自適應濾波器實現的基礎。框圖的理論基礎是可變濾波器能夠得到所要信號的估計。
在開始討論結構框圖之前,我們做以下假設:
- 輸入信號是所要信號
和干擾噪聲
之和
- 可變濾波器有有限脈沖響應結構,這樣結構的脈沖響應等於濾波器系數。
階濾波器的系數定義為
-
.
- 誤差信號或者叫作代價函數,是所要信號與估計信號之差
可變濾波器通過將輸入信號與脈沖響應作卷積估計所要信號,用向量表示為
其中
是輸入信號向量。另外,可變濾波器每次都會馬上改變濾波器系數
其中 是濾波器系數的校正因子。
自適應算法根據輸入信號與誤差信號生成這個校正因子,LMS 和 RLS 是兩種不同的系數更新算法。
======= 我關於自適應濾波器及其應用的理解 =======
相對於其它類型的濾波器,自適應濾波器效果更好的關鍵是:自適應濾波器是反饋結構。
自適應濾波器的自適應過程是:用自適應算法(Update Algorithm)調節FIR或IIR濾波器的系數,使誤差信號逼近於0。
自適應濾波器的應用:
系統辨識
逆系統辨識
噪聲消除
擬合預測
有關使用LMS算法進行線性擬合預測的內容參見博文:最小均方算法(LMS Algorithm)理論及DSP實現
對於初學者,實際問題中,比如一個不知道分布狀態的聲音信號,期望信號d(x)的確定很難理解,而很多文章都沒有提到這點!在上面提到的自適應濾波器的4種應用中,我覺得最大的不同也在於d(x)的不同。
自己對這點也不是特別清晰,希望有識之士能提供幫助。這里暫且先做個標記!
======= Matlab代碼演示 =======
自適應濾波器的函數
- function [yn err] = zx_lms(xn, dn, param)
- % x 輸入信號
- % dn 期望輸出
- % param Structure for using LMS, must include at least
- % .w - 初始化權值
- % .u - 學習率
- % .M - 濾波器階數
- % .max_iter - 最大迭代次數
- % .min_err - 迭代最小誤差
- %
- % y 經過濾波器后的輸出信號
- % error 誤差輸出
- W = param.w; % 初始權值
- M = param.M; % 濾波器階數
- if length(W) ~= M
- error('param.w的長度必須與濾波器階數相同.\n');
- end
- if param.max_iter > length(xn) || param.max_iter < M
- error('迭代次數太大或太小,M<=max_iter<=length(xn)\n');
- end
- iter = 0;
- for k = M:param.max_iter
- x = xn(k:-1:k-M+1); % 濾波器M個抽頭的輸入
- y = W.*x;
- err = dn(k) - y;
- % 更新濾波器權值系數
- W = W + 2*param.u*x;
- iter = iter + 1;
- if (abs(err) < param.min_err); break; end
- end
- % 求最優時濾波器的輸出序列
- yn = inf * ones(size(xn));
- for k = M:length(xn)
- x = xn(k:-1:k-M+1);
- yn(k) = W(:,end).'* x;
- end
- end
調用自適應濾波器實例,參考信號d(x)為正弦信號,加高斯白噪聲后構成輸入信號x(n),
- clear all;
- clc;
- close all;
- fs = 44100;
- % x = wavread('b.wav');
- t = -5*pi:pi/100:5*pi;
- x = sin(t);
- x = x(:);
- sx = size(x,1);
- subplot(2,2,1);
- plot(x);axis([0 sx -1 1]);
- % 原信號FFT
- xf = fft(x,1024);
- subplot(2,2,3);
- plot(abs(xf));
- % 添加高斯噪聲
- t = 0 : 1/fs : (sx-1)/fs;
- noise = 0.2*randn(size(x)); % 均值為0,方差為0.5的標准正態噪聲
- x1 = x + noise;
- subplot(2,2,2);
- plot(x1);axis([0 sx -1 1]);
- % 信號加噪聲后的FFT
- xf = fft(x1,1024);
- subplot(2,2,4);
- plot(abs(xf));
- % LMS自適應濾波
- param.M = 50;
- param.w = ones(param.M, 1) * 0.1;
- param.u = 0.1;
- param.max_iter = 100;
- param.min_err = 0.5;
- [yn err] = zx_lms(x1(:,1), x(:,1), param);
- figure,
- plot(yn)
- ynf = fft(yn(param.M:end), 1024);
- figure,
- plot(abs(ynf));
使用LMS自適應濾波器前原始信號和加高斯白噪聲后的信號(時域+頻域)如下,
使用LMS對添加了高斯白噪聲的信號濾波后效果如下,