離散系統之數學運算與軟體MATLAB介紹


MATLAB的特點

在離散傳利葉轉換中,由於處理的對象是一些序列,因此非常適合使用電腦來擔任計算的工作,而 MathWorks, Inc. 所發展的 MATLAB 數學運算軟體,即是這方面非常強而有力的電腦軟體,在 MATLAB 上面執行一些數列或矩陣的運算非常方便,而它的程式結構有點類似 BASIC C 程式,寫起來十分平易近人,而其函式的呼叫又很簡單,再加以目前各種視窗上的版本都已推出,編輯程式,執行、觀看結果和列印,都可輕鬆的透過視窗的切換及下拉式功能來完成,更值得特別一提是MATLAB 的工具箱 (TOOLBOX) SIGNAL IMAGE 兩項法寶,對於我們學習、數位信號處理的過理中,能夠提供完備的的輔助。唯一較遺憾的是目前 MATLAB 上面建立的程式仍然較難直接與一些界面卡(如影像處理卡)相互溝通,因此如果我們想利用它來從事實際上的影像處理,必須先在其他工作環境下,將影像抓取進來,存成圖檔後再進入MATLAB 中,將圖檔呼叫出來作深入的分析。另一點美中不足的地方是,雖然 MATLAB 在從事一些本身的內建函式運算時速度很快,但是如果是執行我們所建立的一些外部函式運算時速度卻相當慢,因此,如果從事語音及影像分析時,大量的計算工作將使得電腦花費不少處理的時間,這一點也使得它變得較為不切實際,而無法直接運用於線上的數位信號處理。


 

MATLAB入門介紹

接下來我們作簡短的 MATLAB 入門介紹:

目前 MATLAB 在各種視窗上的版本都已推出,在視窗中執行MATLAB 的好處是您可將鍵入資料剪輯,因此可先抱著嘗試錯誤的心態,線上學習鍵入指令,再用滑鼠選取,然後剪下來到文書處理器慢慢研究,也可將圖形視窗的圖案迅速列印,或者將它轉成 BMP 檔後,存於剪貼簿中,再進入其他文書編輯軟體作圖文整合。

首先我們介紹 help 的功能,例如我們希望了解 SIGNAL 這方面有那些函式可以利用時,我們只須鍵入 HELP SIGNL,螢幕隨即出現SIGNAL 這方面詳細的內容,如果我們希針對其中的單項(例如:快速傳利葉轉換 FFT )作更進一步了解時,只須再將該單項挑出來求助即可(例如:再呼叫 HELP FFT)

在進入 MATLAB 後,我們只須鍵入 DEMO,即可進入 MATLAB功能展示,我們可以逐一瀏覽 MATLAB 能夠處理那些事情,稍微了解存記於心,以備日後有這方面需求時,可加以應用,另一方面,我們可挑選自己感興趣的部份,例如:假設我們對它所展的快速傳利葉轉換頻譜分析有興趣,那麼我們就可到"檔案"中選取"開啟 M 檔案",再到子目錄MATLAB\ TOOLBOX\MATLAB\DEMOS 中挑出該示範程示來看,有時候我們看到該示範程式的執行結果,但並不確知其名稱時,可以根據檔名來推測,或是直接執行一下該檔之程式,看是否跑出您所期待的結果來,例如:傳利葉頻譜分析示範程式的檔名即為 FFTDEMO.M,我們叫出該程式的內容後,可以根據它的指令來了解 MATLAB 的語法,另一方面如果日後我們遇到類似頻譜分析的問題時,也可直接將這個程式修改後加以靈活運用。 FFTDEMO.M 之副檔名 .M 大致上可分成兩大類,一是函式檔,它是 MATLAB 的延伸功能,一是可執行檔,其中為主程式,我們可以運用 .M 檔來呼叫另一個 .M 檔,以進行一連串的命令。 .M 檔的運算速度通常都較慢,因此我們程式撰寫時應力求使用 MATLAB 本身的內部運算指令。

現在就我們來看看 FFTDEMO.M 的重要內容及說明(說明置於 "%"符號之後,"%" 符號是註解用的,MATLAB 會忽略它後面的文字。)


 

MATLAB常用指令

再下來我們來看看MATLAB有那些常用的指令:

1. 基本操作指令

2. 矩陣運算子指令

3. 陣列運算子指令

4. 關係和邏輯運算子指令

5. 磁碟檔案指令

6. 特殊字元指令

7. 特殊值指令

8. 關係和邏輯函數指令

9. 基本數學函數指令

10. 文書和字串指令

11. 程式設計指令

12. 其他的矩陣函數指令

13. 多項式指令

14. 數據處理指令

15. 矩陣條件指令

16. 公用矩陣指令

17. 分解和因數分解指令

18,控制流程指令

19. 影像處理指令

20. 繪圖視窗指令

21. 命令列視窗指令

22. 信號處理指令


 

MATLAB之程式設計

在從事 MATLAB 之程式設計之初,可以利用線上學習鍵入想要瞭解的指令,然後研究這個指令執行後所產生的結果,例如前面介紹傳氏反轉換心能夠將原來的數值轉換回來,我們就可試行利用一個只有四個數據的序列,先將其定義如下:

a=[1 2 3 1]

由於我們在此一列的終結,未使用抑制列印 ";" 符號,因此這時螢幕傳回值為

a =

1 2 3 1

再執行快速傳氏轉換如下:

b=fft(a)

此時螢幕傳回值為

b =

7.0000 -2.0000 - 1.0000i 1.0000 -2.0000 + 1.0000i

再將所得到的數列將予以傳氏反轉換,觀察最後的結果是否和一開始所輸入的相同:

c=ifft(b)

此時螢幕傳回值為

c =

1.0000 2.0000 + 0.0000i 3.0000 1.0000 - 0.0000i

最後的結果果然和一開始所輸入的相同!

就這樣我們可以一邊練習MATLAB之指令,一邊驗證數位信號處理之理論,最後就可以開始嘗試將程式寫長一點。前面說過 MATLAB 之程式設計一開始入門時,可以先到子目錄 MATLAB\TOOLBOX\MAT LAB \DEMOS 中挑出該示範程示來看,把程式的內容一個一個指令來了解,如果自己有 MATLAB 的專門書籍固然很好,否則只需將該指令挑出來 help 求助即可,等到整個程式來龍去脈都瞭解了,再將這個程式修改並力求變化,加以靈活運用,等到較為熟習 MATLAB 之程式後,便可以建立自己的函式檔 (function),亦即是 MATLAB 的延伸功能,以補充 MATLAB 本身的不足,等到自己的函式檔建立多了,形成了模組化架構,就很容易組合寫出所需的程式來了。以下為利用 MATLAB function 功能所建立的函式檔之一例,檔名為 imgtru.m,它主要適用於6-BIT 的影像陣列處理,可以將過飽和(大於 64) 及不足(小於 0 )的灰度值加以修正。

function imgtru=imgtru(im1)

m=size(im1,1);

n=size(im1,2);

for i=1:m

for j=1:n

if im1(i,j)<0

imgtru(i,j)=0;

else

imgtru(i,j)=im1(i,j);

end

if im1(i,j)>64

imgtru(i,j)=64;

end

end

end

以後我們如果遇到 6- BIT 的影像陣列 im1 有過飽和或不足的灰度值需處理,則我們只需呼叫函式 imgtru(im1),就可以得到修正後之結果(灰度值大於 64 的修正為 64,灰度值小於 0 的修正為 0)。

在上例中曾使用流程控制之指令,說到 MATLAB 之流程控制方面常用的有 forwhile if 迴圈,其作法與其他程式語言大同小異,例如:

for i=15

for j=16

x=i*j+x

end

end

或是:

while i>10

i=i+1

end

或是:

if a>b

a=b

else

a=1

end 


                                                          離散時間....  離散系統之.... 信號取樣.... 離散傅氏.... 快速傅利葉轉換                                                                                   回首頁  回文字版首頁