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

在DSP上實現即時模糊邏輯

上網時間: 2005年05月10日     打印版  Bookmark and Share  字型大小:  

關鍵字:DSP  模糊邏輯  重心法  Centroid  fuzzifier 

模糊邏輯並不需要特別的硬體或新的編程語言,它僅僅是要求有一種不同的設置隸屬關係(membership)的方法。從電梯到電鍋,大量的物理系統都可受益於模糊邏輯編程。本文探討了對一個商用DSP晶片編程來建構一個基本的模糊邏輯控制器。

你可以採用現成的標準微處理器來構建模糊邏輯系統。傳統的微處理器對於大多數應用來說是足夠的,即使是模糊邏輯,但對於需要可預測且非常快速響應時間的高安全性系統來說則未必。當傳統處理器不夠快時,數位訊號處理器(DSP)可能正是你的系統所需要的。

圖1:‘高’的布爾變量。

DSP是具有指令集和針對算術運算特性的專用微處理器,其最初只是用在訊號處理應用。現在,隨著DSP軟體開發工具種類的增加和品質的提升,這種處理器變得越來越流行。DSP如今在成本上與通用微處理器也能競爭。今天,任何可以受益於高速乘法/累加(MAC)運算的應用都可以考慮採用DSP。

本文將闡述模糊邏輯系統的組成部份,並提供如何採用DSP來實現的實例。

模糊邏輯基礎

Lotfi Zadeh被認為是模糊邏輯的創立者,他在1965年的一篇文章中提出了布爾數學體系集合論的擴展,將二元擴展到多值。他的模糊邏輯集合論是一種廣義的經典集合論,是對非精確性的極好表述。模糊邏輯的優勢在於它可以在不採用數學方法的情況下使你能準確地描述一個過程或行為。

程式1:去模糊化器:主函數的C程式碼。

布爾數學體系集合既可以是真,也可以是假,而模糊集合可以具有部份的這種隸屬關係。例如,圖1提供了一個布爾變量。在布爾表中,對於6英呎來說‘高’是真,而低於6英呎則為假,但在圖2中,模糊變量的高既不是真也不是假,它具有可變的真假隸屬關係。布爾變量通常被稱為明確的集合(crisp set),模糊變量成為模糊集合。模糊集合行為類似於其對應的明確集合。舉例來說,模糊邏輯採用與、或、非以及補數運算。‘與’處理是取輸入量中的小者,‘或’處理是取輸入量的較大者,補數運算是用1減去輸入值。

控制器的組件

任何基於模糊邏輯的控制器具有三個組件:模糊化器(fuzzifier)、規則庫和去模糊化器。在將一個明確(數位)輸入轉變成模糊值並對該值進行處理,然後再將模糊值轉變成明確值輸出的過程中,每個組件扮演著重要的角色。儘管模糊控制器的實現不盡相同,他們都具有這三個基本部份。

模糊化器獲取一個明確輸入值,並根據是否需要將其進行縮放來轉換成模糊值,並轉變為多值實體(entity)。縮放處理將輸入域映射到所有變量都採用的一些內部格式。該多值實體是將輸入值與其對應的輸入集合進行比較的結果,並對該值進行映射處理以反應出其隸屬關係特性。

規則庫從前一級取得輸入值,並將其與每個相關語句的區間相加。規則庫由一系列一個或多個IF-THEN語句組成。每個語句依次組成了兩個部份:條件(antecedent),在關鍵字then的左邊;結果(consequent),在then的右邊。一個語句可能具有一個或更多的antecedent和consequent。典型的規則語句看起來就像這樣:

圖2:‘高’的模糊變量。

IF antecedent1 . . . antecedentN THEN

consequence1 . . . consequenceN

條件和結果都採用條件形式變量,這裡的變量是條件的輸入變量或結果的輸出變量。結果的條件部份是一個模糊隸屬函數,如冷、暖、熱。規則庫對來自模糊化器的數據與規則進行比較。當它遇到一個條件是真,就觸發語句的結果動作。

以電梯為例,規則庫可能就像:

IF門打開AND速度為零AND距離可以忽略THEN電機轉速為0

IF 門關閉AND速度慢AND距離大THEN電機轉速最大

IF 門關閉AND速度中等AND距離一般THEN電機轉速一般

IF 門關閉AND速度快AND距離一般THEN電機轉速一般

程式2:去模糊化器:
GetData()函數的C程式碼。

這個例子有四個規則,每個規則有四個變量:門、電機、速度、距離(到選定層)。每個規則有三個條件和一個結果,總共有十種情況組成了四個變量的隸屬關係集合。例如,速度具有變量0、慢、中等和快速。可變距離具有以下四個值:忽略、很小、一般、大。門要麼開要麼就是關閉。對於各種隸屬集合,電機轉速具有0、最小、平均和最大四個變量。

舉例來說,我們假設升降機門是關閉的,速度為10英呎每秒,這個速度定義在慢和中兩種隸屬關係區間的中間(所有的隸屬關係區間互相重疊)。距離是42英呎,這個值同時被定義在大和中兩個區間。這樣一來規則庫中的兩個規則都被激發(第二個和第三個規則),結果就被平均了。

規則激發是控制器組件中的關鍵問題。當規則激發時將導致語句的條件部份變成有效。一旦有效,語句的結果部份就與所有被激發規則的結果累加起來。這樣一來,該級的輸出將產生一個所有激發結果的複合值。這看起來就像被激發結果的所有隸屬集合的和。

模糊邏輯的第三個組件是去模糊化器。去模糊化器將來自前一級的輸出轉變為明確的輸出值。當今有四種方法在執行去模糊化中比較流行,分別是重心法(Centroid)、最大化、單點(singleton)和權重平均。每種方法都有其優勢和不足,重心法最流行。這裡只討論一下重心法。

圖3: FuzzyLevel系統。

重心法去模糊化是計算來自前一級的複合模糊集合的重心。這是一種數位密集型方法,需要計算集合的積分,還要求輸出集合重疊以避免產生無效輸出的情況,以及每個變量的隸屬集合由一個奇數或區間組成。

程式碼轉換

為在DSP上實現即時模糊邏輯控制器,你需要將模糊邏輯引擎設計轉換到實際的程式碼。為了將每個組件轉換為軟體,你必須了解控制器、控制器的每部份以及它將控制的系統。

將主要的程式轉換成程式碼是很簡單的。本質上,它無外乎就是這樣的無限循環:獲得數據值並將他們轉換成對等的模糊量,處理模糊數據,再將輸出去模糊化形成明確值,最後將這個值輸出到正確的輸出埠。這些作業的每一個都對應著一個C函數,它們共同組成了模糊引擎。

在表1中的GetData()函數從一個I/O元件重新獲得數據點。這個函數只是一部份,僅用來測試,但是如果完全實現它,將存取實體I/O元件。在本例中,函數從一個陣列中提取儲存數據點,每個循環提取一個數據點集合,並將提取的數據饋入到下一個函數,即模糊化器。

程式3:模糊化器部份的實現。

Fuzzifier()函數將數據轉換為一個模糊表達,轉換方法是透過一個結構將明確的數據值變換成規則庫能使用的值。然後,Fuzzifier()必須為每次循環反覆清除數據點。在每次反覆後,另外一個內建函數來清除這個結構。一旦轉換完成,規則庫就可以使用這些數據點。

RuleBase得到模糊化器的結果(數據點),然後將這些點與內部規則庫表進行比較。當產生一個匹配,RuleBase就獲取對應的結果值,並將這個值用於每個被觸發的規則。之後,RuleBase將所有的觸發規則相加產生一個最後的模糊結果,最後將這個結果應用到Defuzzifier()函數。

Defuzzifier()函數將模糊數據轉換回一個明確的量,這個量可以為數位類比轉換器或其它的實體元件所用。通常,一個輸出片段將這個輸出轉變成一個外部世界可以處理的值。然而,由於我們透過採用陣列使系統受到限制,去模糊化器組件僅簡單地將結果儲存到輸出陣列。表1和2顯示了主函數和GetData()函數的C程式碼。

為了將模糊程式編寫成程式碼,讓我們回到模糊化器的介紹以確保我們了解模糊化器是如何工作的。模糊化器是將明確的輸入數據轉換成可以作業的模糊數據,這意味著這個數據被轉換成了一個多值量。而且這個量還是該特定輸入數據的隸屬集合的一個函數。一個C結構是用來儲存模糊化數據單元的理想結構,因為它可以具有多個值。這種結構的每一個單元對應著一個隸屬區間。例如模糊輸入變量Deflection具有小、中、大三個區間。假設區間定義如下:

圖4: FuzzyLevel應用圖。

0 <小 < 25

10<中< 55

20 <大< 90

如果這個變量的明確輸入具有13這個值,其對等的模糊化量就由一個多值變量組成,這個變量具有三個布爾值:小、中和大。這三個單元是根據明確輸入數據來設置的。每個域都是一個布爾量,初始值設置為假。13這個值落入到兩個類別,因此小和中兩個單元都設置為真。同樣,23這個輸入值將所有三個組件集合設置為真。在程式碼中實現模糊化器這個概念需要由下面的步驟組成:建立一個C結構、將其範圍與輸入數據比較,根據比較來指定一個適當的域。表3提供了模糊化器部份的實現。如果有需要的話,模糊化器通常執行縮放處理。

控制器的規則庫部份執行輸入數據的處理。由於這部份處理大部份的工作,因此規則庫是最複雜的。前面講過,規則庫將表中所有觸發規則值進行求和,然後將和除以這些規則的數量。表中包含了每個輸入變量的隸屬區間值。例如‘Position’變量有三個區間,變量‘Error’有5個區間。表總共有15(5*3)個單元。表的列和行的交叉點對應IF-THEN語句中的條件部份中的兩個條件的AND。矩陣中的值從左向右增加,從上向下增加。例如,如果Position的區間為近、鄰近、遠。近對應著矩陣中的0列,鄰近對應著第一列,依次類推。類似地,如果變量Error具有很小、小、一般、大、很大五個量,很小對應第一行,小為第二行,依次類推。因此,矩陣中的交叉點就對應條件語句中的AND處理。例如第0列和第0行對應為真:

程式4:規則程式碼。

IF Position為近AND Error很小THEN . . .

表4提供了規則庫的程式碼。注意到單元都為序數,在模型定義和調整後,這些單元都被填滿。另外,這個表的大小是規則數的函數,因此表的大小隨應用而變。如果表改變,與陣列相關的變量必須也改變以反映它的大小改變。

去模糊化器模組將模糊化的輸出轉換成明確的輸出。通常,去模糊化器將模糊輸出轉變為明確輸出,然後再將其縮放到變量的外部域。該引擎在兩方面與傳統的去模糊化器相背離:第一,實際的明確數值儲存在規則表中,故不必對它們進行轉換。在大部份真實場景中,類比輸入和輸出通常由在0-5V之間隨時變化的電壓構成。一個例子就是常用於控制馬達和伺服電機的PWM。表5提供了去模糊化器的程式碼。注意,透過使它經過一個陣列來存取,這部份還簡化了外部介面。這使我們可以專注於邏輯除錯。一旦邏輯除錯完,真正的I/O被加進來。將一個陣列用於測試的另一個好處就是可以使過程更容易移植。

應用實例

FuzzyLevel是基於DSP控制器的一個實例,用來控制一個工業控制應用的液體槽中流體的高度和壓力。這種控制器通常用在煉油廠。

FuzzyLevel保持槽中液體在一個確定的高度,同時保証其中的氣壓不會達到危險的程度。槽中的液體高度和壓力是相關聯的,液體越多壓力越大。同樣,液體以某個?定的速度流入槽中。圖3提供了FuzzyLevel系統的簡化結構圖。採用感測器來監測氣壓和液體高度,一個電機用來控制輸出閥門打開的程度。

圖5:Code Composer Studio
模擬FuzzyLevel應用的結果。

了解了系統如何動作之後,現在需要將這個動作轉換為能透過模擬來得到其最佳工作點的設計。為實現這種轉換,首先需要確定系統的輸入、輸出以及將進行的處理。從前面的描述中我們知道系統的輸入來自感測器,因此,壓力和高度是輸入變量。此外,電機是系統中的唯一輸出。因此,‘閥’是系統唯一的輸出變量。緊接著需要定義變量的範圍。對於本例,我們假設每個變量有三個區間。例如,壓力的區間為小、中、大;高度的區間為低、一般、高;唯一的輸出變量閥門的區間為全關、部份開、全開。

定義了變量和它們的區間之後就可以描述系統處理了。正如前面提到的,輸入和輸出之間存在一定關係,描述這種關係也就定義了系統的行為。而且這種行為使用系統本身的規則來描述的,規則的數量與輸入變量的區間相關。由於每個規則有三個區間,因此該系統有9個規則。現在就完成了大致的模型。

接著要模擬這個模型來產生進入模糊引擎矩陣的去模糊化的點。本例將採用來自Impatiens Publications的TeachFuzz模糊邏輯模擬器。在將設計轉換為模擬器能理解的格式之前,必須設置輸入和輸出變量的實際值。模擬器並不關心所有單位的類別,它唯一的要求就是一些正數。單位對模擬器並不重要(設計師為了方便而採用這些單位)。變量的範圍如下:0<高<80,0<壓力<1,600和0<閥門<240。這些變量的單位分別為英呎、磅/平方英吋和轉矩的英呎*磅。

程式5:去模糊化器。

執行模擬器將產生關於模型的可視數據,你通常必須對模型進行修改,因為模型的動作並不像所期望的那樣。對模型參數的修改也稱為調整過程。調整使我們能找到控制器最佳的工作點。通常,調整包括區間數的修改以及改變這些區間的形狀。這裡的模型也不例外。在完成調整後,就可以將規則矩陣載入。我們可以透過找到只觸發一個規則的數據集合來確定去模糊化值。這個值被放入到矩陣中相應輸入變量區間的交叉點。例如,下面的規則是某個給定輸入數據集合觸發的唯一規則:IF高度為低且壓力為中THEN閥門為部份開。

30這個值被放入到矩陣中,對應高度為低和壓力為中的交叉點。這對應的是那個結果的重心點。對所有的規則反覆進行這個過程不斷,直到矩陣完全填滿為止。表1顯示了FuzzyLevel模型表完全填滿的結果。當表矩陣滿時,控制器就可以進行測試了。

圖4和圖5顯示了一個在十次程式碼反覆之後的編譯/除錯片段,這裡採用TI的Code Composer模擬C5402 DSP晶片。插入的printfs在這裡用來簡化I/O驗証。模擬統計表顯示了第一次反覆佔用了722個周期,十次反覆佔用7,100個周期,平均每次反覆為710個周期。在一個100MHz的C5402晶片上,FuzzyLevel從輸入到輸出的每一個反覆需要0.71毫秒。對於大多數應用來說,這個速度可能太大材小用了,但對於安全很關鍵的應用來說,這又是很合理的,例如前面的流體槽。

快速模糊

當採用一般的微處理器不能滿足快速系統響應要求時,採用模糊邏輯的DSP加速將非常有效,當前很多應用採用這種方法,例如一些醫學麻醉系統或伺服電機控制器。Fuzzy Level的例子也是一種類似於一些當前在煉油廠中所用的簡化控制系統。

表1:FuzzyLevel模型表

你可以修改引擎來提供更多的輸入和輸出。特別是,透過修改陣列將引擎修改成N輸入×M輸出的控制器。可以透過改變陣列為輸入的函數來增加額外的輸入,例如三個輸入-三維規則矩陣。多個輸出可以透過幾種方法來處理,例如矩陣的交叉單元可以包含多個值。反過來,交叉點單元可以包含一個指向保持所有去模糊化數值的數據結構的指針。

另一個改進就是使不同的條件只觸發特定的結果。然而,這涉及到多控制器的重構以及指針的廣泛間接應用。如果你決定這樣做,請確保最後的響應時間能夠足夠快來響應系統的輸入。

作者簡介:Byron Miller是一位獨立的韌體工程師,專注於微處理器、DSP的設計和硬體除錯、移植,以及針對控制數據獲取、模糊邏輯、網際網路設備的韌體開發。他具有電腦科學學士學位和軟體工程碩士學位。

作者:Byron Miller

獨立韌體工程師

Email:bmiller2@isd.net





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


EE人生人氣排行
 
返回頁首