2025年7月16日 星期三

系統性能探討

系統性能探討


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 July 2025


有許多規模比較龐大的程式,我沒有發表在這個網頁,純屬於我個人的應用程式者也不網貼。有些論題很適合用來檢討系統性能,因為它們的內容通常涉及一些比較特別的需求。這一次,我取用傅立葉轉換(Fourier transform)的技術來探討我設計之 ABC Forth 系統的一些性能。

網上已有很多傅立葉轉換技術方面的資源可供參考,我也不例外的大方採用,用到之處會說明來源,以尊重他人的創作。本文借用的貼圖來自不同的網頁,表示函數時的參數並不一致,這不是我所強調的重點,但很容易看懂。別人貼出的材料都是經過一番努力後的貢獻,所以不要太強求。

Twitter(X)社群媒體上,有一個名稱為歷史上的物理學(Physics in history)帳號,最近貼出過一份能夠精簡說明傅立葉轉換技術的照片,我轉貼於此處與大家分享。這方面的數學,要在大學二年級以後才學,它是專門用於信號處理的工具,也可以用來作為偏微分方程式(PDF)求解時的工具。它的完整數學表示式定義,照片中有。


以物理觀念更簡單的說明,就是傅立葉轉換,能把隨時間而變化的函數轉換成隨頻率而變化的函數,函數的本質不變。

我自己在工程實務上的應用,除了寫過大量信號處裡方面的相關程式外,就是曾將此技術應用於原子爐六台 600 匹馬力水泵兩公尺長轉軸各有四個軸承的長期監測上。當軸承安裝妥當後,以頻譜顯示儀獲得的頻譜,是只有很單純的一個尖峰。當軸承出現問題,例如是彈子盤保持器有微小破裂時,以頻譜顯示儀獲得的頻譜,是單一個的尖峰不見了,改以佔用頻率範圍很寬廣的許多低峰值圖譜出現。這個時候,運轉裝備必須停機更換軸承,否則直徑兩英吋的傳動軸就會被震斷,整套水泵連帶馬達都全毀,重裝新泵時,連地腳螺絲都得重新設計,損失非常大,我經歷過。量測元件獲得的訊號通常都是時變訊息,要想獲得對應的頻變訊息,就需要傅立葉轉換技術。貴重與安全要求較高的裝備,值得加裝這種監測系統,能防患於未然。

我大三時學過偏微方程專門課程,書中滿滿的傅立葉轉換應用,印象深刻。我從事過電腦信號處裡的研究工作,參與過台電核二廠雜波分析發展計畫,也參與過魚雷相控陣列聲納的電腦技術研發計畫,有過一些信號處裡方面的實作經驗。設計研發程式時,知道信號處裡軟體技術發展時講求的重點,但那時還沒有自己設計過系統。也因此在後來自己設計數學計算系統時,就會強行設計一些以前系統所沒有提供的性能。例如本文提到的複數運算系統,可以直接在複數體系觀念之下設計程式。

任何週期性的時變函數圖譜,都能由許多個不同週期的函數圖譜合成,這是一種線性關係(函數乘以常數後相加本質不變的函數關係),以簡圖表示就能看出,從時變轉換成頻變表示時,函數本質不變的道理。


我把細部強調式的傅立葉轉換數學式再貼一遍,此圖仔細說明了數學式中每個符號的意義。


電腦工程實務上,這樣的公式被改寫成離散傅立葉轉換(DFT)的數學表示式:


傅立葉轉換說明至此,不再深入,有興趣的讀者可以自行從網上學習。

接下來,我採用維基百科與 Rosetta code 網頁共同建議的快速傅立葉轉換(FFT)程序描訴虛碼來探討系統性能。資料來源網頁為:

維基百科自由百科全書(WikipediaThe Free Encyclopedia)

https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm


我們逐列探討能直接執行這套虛碼的系統規格。

首先,第一列的說明強調要用到以 2 為基底的對數函數。
我在設計系統時,連浮點數的對數函數也全為採用以 2 為基底的根本函數來推導出其他所有的對數函數。但是以數學體系的觀念來設計系統時,整數與浮點數是不能混著出現在同一列運算表達式之程式中的,因為系統中兩者的資料格式完全不同。所以,在整數環境中,必須專為整數體系建立它自己的以 2 為基底的對數函數。我設計的系統中有此函數,名稱就叫做 nlb ( n1 -- n2 ),以對應於以 10 為基底的整數之對數函數 nlog ( n1 -- n2 ) 。

程式設計方法一開始就強調時變輸入信號 A 數列的點數必須為 2 的整數方次,例如:2 的 10 次方就是 1024 點,且輸入信號必須為複數的格式。我設計的系統中可以直接宣告產生陣列,所使用的指令是 [ARRAY] 。指標可以從 0 開始,這一條件,也是這套虛碼程序設計方法中的要求條件之一。

描述方法中有一列在計算複數的 exp 函數,它的參數必須是複數,結果也必須是複數。我設計的系統中建立了這樣的函數,在純粹 Forth 的環境中,我仍沿用 Forth 愛用者的習慣使用 zexp 的函數名稱。但在 BASIC 環境中,我直接就採用 exp 的設計,這樣設計不會搞混系統,因為浮點術與複數的資料格式不同,在同一列運算程式中只能有一種數字格式,所以複數環境仍可以照樣採用 exp 為該函數的名稱。

描述方法中只有指標需要運算之處是我設計系統時沒有實現的設計。這裡有兩個數列的指標 (k+j+m/2) 與 (k+j) 需要進行整數運算。在正整數運算之計算落定後,資料格式必須是正整數,這在整數環境內,不經設計就能直接執行得出來。但是在浮點數、複數等的非整數環境內就不能直接執行出來。要設計出這樣的規格時,必須在運算列內增加改變運算規格的暫態處裡,待指標之整數運算結束後,還得改變回來。我嫌這樣設計起來雜亂無章,只在 Win32Forth 系統中實現過設計後,便放棄了這樣的設計。解決辦法很簡單,凡是遇到指標有運算的地方,就必須在前一列直接增設一列程式。例如上述情況就寫成:


   
10 let k+j+m/2 = k + j + ( m / 2 )
10 let k+j = k + j


此處討論的陣列指標之運算,是快速傅立葉轉換(FFT)技術的關鍵部份。能這樣運算後調整陣列輸出數據指標,將計算所得放置到指標指定的位置,是快速傅立葉轉換能快的主因。研究 FFT 技術的主要工作,就是在探討如何處裡指標才能減少運算次數,以便加速獲得數位訊號整體的轉換結果。每種方式的技術細節,當初都曾被寫成博士論文而發表。這種技術就適合拿來檢驗系統的性能。

沒有其他限制了。換句話說,我設計的系統能夠直接書寫複數運算式子,設計好的程式跟虛碼所描述的步驟會很接近,系統有此特點。

輸入與輸出數據上了千點以上,很難再單憑人工輸入每一點數據的方式來完成工作了。我設計的系統因此而安排了可以簡易執行開關檔案、自動進行數據存取工作的能力。這一點很重要,遇到產生結果需要藉由別的軟體實現複雜工作時特別有用,過去的貼文中已有很多這樣的使用範例。

在套用這種功能時,有一點必須注意,如果數列只是單一個變數的數列,容易處裡。數列每列具有兩個以上的變數數列時必須注意 ! 按照 Forth 處裡輸出輸入數據的方式,一次只做一列,遇到跳列(LF或CR)時可以暫停。但輸入的數據在堆疊上是先進後出,輸出的數據是後進的先出。我在 Win32Forth 增建 ABC Forth 性能時,解決過這方面的問題,後來再增建的系統就簡化了設計,不再理會這種問題,特此聲明。

沒有留言: