Global Sources
電子工程專輯
 
電子工程專輯 > 處理器/DSP
 
 
處理器/DSP  

用自適應濾波器分析未知系統特性

上網時間: 2002年04月13日     打印版  Bookmark and Share  字型大小:  

關鍵字:filter  濾波器  IIR  FIR  dot product 

透過濾波器可以了解系統的脈衝響應,而系統的脈衝響應完全反映了系統的特性,因此可以利用脈衝響應來分析未知系統,尤其是當希望確定未知系統內部特性或預測其信號輸出時。而透過脈衝響應,則可以推導出未知系統的傳遞函數和頻率響應。

最常用的濾波器(IIR和FIR)均採用一種稱為點積的算術處理。兩個向量的點積將得到與兩個向量關聯度直接成正比的一個值,也就是說,如果兩個向量之間不存在任何關係,輸出將為0,而任何不為0的結果顯示兩者之間存在某種關聯。

顯然,如果得到一個具有頻率響應特徵的向量,例如500Hz或更低的頻率,那麼就可以將該向量應用到輸入數據流上,得到的輸出數據流只有500Hz或更低的那個值,而任何更高頻率的輸出為0。這種算法適用於去除不期望的信號成分的應用中(這是該功能的重要方面),本文將討論IIR和FIR濾波器的另一功能,即作為觀察器用於分析未知系統。

設計工程師經常可能處理或分析一些未知系統,即所謂的‘黑盒子’。存在‘黑盒子’是由於某些原因,如系統根本不存在,或者無法進入系統內部了解其工作原理。

有時,我們希望控制不帶反饋的電機,或者希望去除信號中的噪音,但卻並不知道噪音的頻率或信號的頻率。在這兩種情況下,必須知道信號或過程的某些關鍵變量值。

在本文中將提供一些Matlab代碼,這樣就能實際應用並觀察其運行結果。這些Matlab代碼具有清晰明了的特點和較強的啟發性,代碼的最佳化留給讀者在實際應用中完成。

For循環

首先介紹實際完成這項功能的簡單for循環算法。該循環接收輸入向量或數據流xn(),並產生一個輸出向量或數據流y()。該循環的執行過程如下:

1. 程式控制的判定點:確定for循環是否遍歷了所有的待採樣點。如果是則繼續,否則執行for循環。

2. 從數據流或向量xn()中得到一個新採樣,並將該採樣提交給x(1),x(1)表示與FIR濾波器系數(脈衝響應)相卷積的緩衝區起始部份。(必須注意在for循環的結束部份,已駐留在緩衝區的數據將下移一個位置,這樣當for循環返回至循環起始部份時,為新數據留出儲存空間。)

a. 將緩衝區儲存數據x()與濾波器系數weights()相卷積,得到的結果為y()。

b. 找到被追蹤信號data()與濾波器輸出y()之間的差異,該差異稱為誤差,用該誤差參數校正自適應濾波器。

c. 使用第二個for循環

 . 根據誤差、β因子和緩衝區數據計算一組新的濾波器系數weights。

 . 將緩衝區中的所有採樣數據向下移一個位置,以便為主for循環起始部份的新採樣預留出儲存空間,並丟棄最早採樣的數據。

3) 返回至for循環的開始。

在該算法中,我們實現了具有自適應濾波器功能的非對稱FIR濾波器。FIR濾波器是輸入向量x()的時間逆序和一組weights()系數這兩個向量的簡單點積,其中weights()表示濾波器的脈衝響應。點積將增強脈衝響應中的可用輸入信號流成分並去除那些脈衝響應中不可用的成分。Matlab實現代碼如下:

interim=0;

for l=1:order

interim=(weights(l)*x(l))+interim;

end

y(k)=interim;

這?的interim表示用於計算點積的一個臨時變量,weights()表示濾波器系數,x()表示輸入向量,y()表示濾波器輸出。

濾波器可在即時條件下處理連續的數據採樣流,但由於並不具備這樣的連續採樣流,因此我們決定產生由1,024個採樣數據組成的向量,並將該向量像即時系統處理數據那樣依次發送至濾波器。

但是如何確定濾波器的weights()系數呢?由於觀察器本身就是用來追蹤目標系統或信號,我們可以得到濾波器輸出y()和目標系統輸出之間的差異(即誤差),然後用誤差乘以輸入向量和增益系數b,最後將結果加至weights本身。

這?的b用來控制算法的收斂,N表示濾波器長度,Px表示輸入信號的平均功率。b值越大,收斂速度也越快。

對於絕大多數情況,這?提出的算法可作為一個參考,可在此算法的基礎上按照實際需要進行開發。用Matlab來實現該循環的代碼如下:

for k=1:N

x(1)=xn(k);

y(k)=0;

interim=0;

for l=1:order

interim=(weights(l)*x(l))+

interim;

end

y(k)=interim;

error(k)=data(k)-y(k);

for l=1:order

p=order+1-l;

weights(p)=weights(p)+

(2*beta*error(k)*x(p));

t=ne(p,1);

if t x(p)=x(p-1);

end

end

end

在上述濾波器中,了解參考信號的特徵很重要,這?的參考信號是我們希望在噪音中追蹤的信號dn()。根據目標的不同,參考信號可能是期望的實際信號的一個採樣,也可以是希望去除的信號採樣。如果我們不知道實際信號是什麼,但對信號的噪音特性有相當的了解,就可以追蹤噪音並將其從信號中去除。

需要產生一個簡單的餘弦信號使該代碼塊能夠實現其功能,代碼如下:

N=1024;

for l=1:N

dn(l)=cos(2*3.14*10*(l/N));

end

這樣即可產生頻率為10Hz的採樣列向量。

為了顯示濾波器能實現期望的功能,可以添加一些噪音。Matalb代碼如下:

for l=1:N

noise(l)=rand;

end

for l=1:N

xn(l)=dn(l)+noise(l);

end

我們將該噪音添加到信號向量,得到xn()。但在處理數據之前,我們必須將其規格化:

for l=1:N

if max < noise(l) max=noise(l);

elseif min > noise(l) min=noise(l);

end

end

for l=1:N

if max < xn(l) max=xn(l);

elseif min > xn(l) min=xn(l);

end

end

for l=1:N noise(l)=noise(l)/max;

end

for l=1:N xn(l)=xn(l)/max;

end

圖1顯示了濾波器的一些輸入和輸出信號波形。初始的dn信號如最上圖所示,這是頻率為10Hz的簡單餘弦信號。第二幅圖顯示了在該餘弦信號上添加了零平均隨機噪音xn的波形。第三幅圖為濾波器本身的輸出,可以看出,經過一段短暫的捕獲時間(時間長短取決於係數b的大小),輸出就能很好地追蹤輸入。第四幅圖為誤差。在起始階段,誤差很大,但隨著濾波器捕獲到信號後,誤差迅速趨近於0。

由於可以成功地將噪音從信號中過濾(如圖1所示),我們可以確定濾波器的脈衝響應類似於被追蹤信號的脈衝響應。系統的脈衝響應完全反映系統的特性,因此可以利用脈衝響應來了解系統的特性,尤其是當我們希望確定黑盒子?面的內容或預測其下一次信號輸出時。透過脈衝響應可以推導出未知系統的傳遞函數和頻率響應。

圖1中的第五幅圖顯示了濾波器和被追蹤系統的脈衝響應。第六幅圖是脈衝響應的快速傅立葉變換(FFT),描述了頻譜低端處的頻率。實際上,這正是所追蹤的信號的頻率。

如果需要對本文先前定義的‘噪音’進行處理,我們可以藉由從輸入信號中減去被追蹤信號或藉由等式

error(k)=noise(k)-y(k)

來使濾波器追蹤噪音,而不是數據信號。儘管這樣也行之有效,但追蹤更為穩定的信號並將其從輸入中減去的方法可能比追蹤噪音的效率更高。

顯然,反饋信號或誤差是濾波器鎖定的決定因素,它可以是目標信號或噪音,或任何其它你所希望的信號。另外,相位問題在該類濾波器中不存在,該算法力圖在參考信號及其輸出之間保持穩定的關係並使兩者之間的差異盡可能小。但這類濾波器最大的問題是需要一個參考信號。

信號功率

很多情況下,我們並不知道初始信號是什麼樣的情況,那麼如何確定帶噪音信號的功率並追蹤該信號呢?

首先了解相關性的概念:相關性是確定一個信號在次級信號(有時是藉由延遲的相同信號)中所佔的比重。這種相關性分析的優點在於,如果該信號是零均值隨機信號,那麼在分析中就可以不加考慮,因為其能量在整個頻譜範圍內是均勻的,因此也就沒有中央峰值。如果頻率為100kHz的正弦信號與一些60Hz的線性噪音和白噪音混合,藉由適當的相關性處理,該正弦信號本身在100kHz處將具有很強的峰值,這是信號中唯一的初始內容。另外,60Hz處還有另一峰值,其幅度完全取決於干擾程度,因為60Hz的線性噪音不是零均值隨機噪音,而白噪音則完全不起任何作用。

同FIR濾波器一樣,相關性也是一個點積,兩者的區別在於,FIR濾波器在卷積之前完成時間逆序。但在點積中,對哪個向量逆序並不重要,所得到的結果都相同。因此只需簡單地將濾波器中的weights系數逆序即可。因為非對稱FIR濾波器的脈衝響應是時間零點每一側的鏡像(非對稱FIR濾波器以相同的方式進行前向和後向讀取),因此它也是一種相關性。

這意味著如果作用在信號及其延遲信號中,那麼這?引入的程式就能同時實現濾波器和相關處理功能。為此只需對算法進行一些很小的改動,改動大小取決於誤差的確定方式。現在不將其從參考信號中減去,而是將其從輸入的延遲信號中減去。這需要在輸入數據流中確定實際能量,並將其作為一個輸出。修改後的Matlab代碼如下:

for k=1:N

x(1)=xn(k);

y(k)=0;

interim=0;

for l=1:order

interim=(weights(l)*x(l))+

interim;

end

y(k)=interim;

err(k)=y(k)-xn(k+2);

error(k)=dn(k)-y(k);

for l=1:order

p=order+1-l;

weights(p)=weights(p)+

(2*beta*err(k)*x(p));

t=ne(p,1);

if t x(p)=x(p-1);

end

end

end

由代碼可知,我們使用濾波器輸出和延遲兩個採樣的輸入來追蹤濾波器。如果工作正確,可以找到並追蹤未知信號。這種情況下,就能使用與示例一相同的工具來觀察未知數據集的脈衝響應和頻率響應。如圖2所示,該工具能完成上述功能。最上圖是頻率為100Hz並帶有噪音的餘弦信號;第二幅圖顯示了淹沒在噪音中的餘弦信號;第三幅圖顯示了自適應濾波器的輸出;第四幅圖則顯示了誤差信號,在代碼中表示為err;第五幅圖還是濾波器鎖定時的脈衝響應圖;而第六幅圖這是該脈衝響應的頻譜圖。這種簡單的自適應濾波器及其類似的其它濾波器對於分析和預測未知系統非常有用。

作者:Don Morgan

高級工程師

Ultra Stereo實驗室

Emai:dgm@baykitty.com。




投票數:   加入我的最愛
我來評論 - 用自適應濾波器分析未知系統特性
評論:  
*  您還能輸入[0]個字
*驗證碼:
 
論壇熱門主題 熱門下載
 •   將邁入40歲的你...存款多少了  •  深入電容觸控技術就從這個問題開始
 •  我有一個數位電源的專利...  •  磷酸鋰鐵電池一問
 •   關於設備商公司的工程師(廠商)薪資前景  •  計算諧振轉換器的同步整流MOSFET功耗損失
 •   Touch sensor & MEMS controller  •  針對智慧電表PLC通訊應用的線路驅動器
 •   下週 深圳 llC 2012 關於PCB免費工具的研討會  •  邏輯閘的應用


EE人生人氣排行
 
返回頁首