所有網頁 圖片 影片 地圖 新聞 網誌搜尋 Gmail 更多 »
最近造訪的群組 | 說明 | 登入
Google 網上論壇首頁
群組資訊
成員: 101
語言: 中文 (繁體)
群組類別:
藝術文化
科技學術
電腦資訊
更多群組資訊 »
FORTH操作音效卡    

FORTH操作音效卡

作者:曾慶潭

2008123日於紐西蘭

ilikeforth@gmail.com



  1. 前言之前


經過四個月的努力,我在629日與中華民國FORTH語言學會聯絡時提及的構想──想要設計一個地震早期警報系統,其軟體程式已接近完成。為了實現這個構想,伴隨著主導計劃,有不少可貴的Forth程式逐個被落定。程式設計實耗時間實際上不多,研究資料與整理成果以便寫成文章,所須時間則相當可觀。

當初挑選的Forth系統主要是以eForth32為主,很慶幸做了正確的選擇,它對解決此類問題較為適當,本文是其一例。

剛開始進入這個主題時,就想先利用電腦設計出一個慢速可調示波器的功能,首先遇到的問題是系統不會劃任意兩點間的一條直線,我挑選了一個近期內的美國專利,純用高階定義方式與單純整數系統,令其實現。

接著預估會有信號處理的工作想做,而Forth的數值分析處理能力不太好,於是耗費了三個月的時間,在四個Forth系統上完成了Tiny BASIC Compiler的程式設計,讓Forth能像BASIC一樣的執行程式,而且發現這樣做呈現了特異性能,並完成了一篇90頁的中文文章。

eForth32欠缺了不少傳統指令,例如:DO…LOOP指令群便付諸闕如,我堅信自eForth始,任何其他指令都能以高階定義方式完成,這是Forth基本精神,這個問題剛好做為對自己程式設計的考驗,於是博覽群書,終於全用高階定義技術,設計出了我要的東西。

有感於Forth不應自閉性的過日子,此類設計日後很可能需要與別的程式語言進行資料溝通,以形成共榮的系統。若能如此,則別的程式語言可能更會誇獎Forth的存在,於是,我在圖書館裡鑽研了一陣子,參考別的程式語言教學用書是如何介紹資料檔案的存取的?結果也完成了一份資料檔案標準存取格式的通用程式設計,可以毫無問題的與CBASIC甚至於其他任何程式語言交換資料。近代的Forth系統中有READ-FILEWRITE-FILE等指令,但它們都還只是系統中的指令,要完完整整的做完資料檔案的存取工作,必須像我這樣的設計標準通用方法才行,而且要有根據,是參考專家寫的書籍得來的。

我已不再在職場上打轉,當然不可能像當年在台灣時闊綽的大買軟硬體來大肆發展自己的構想,軟體已進行到不得不碰硬體的時候,只好暫時打住,等待支援了。奉駿泉先生答應提供一套A/D轉換器助我發展,但要等到過舊曆年時才能帶來紐西蘭供我使用,我則未曾稍懈於此事,研究地震早期警報相關書籍及期刊論文,以及電容式水下麥克風與前置放大器、低通濾波器、甚至於音響信號接頭的標準接法,彙集資料,成果相當可觀。

紐西蘭是一個非常強調資源回收的國家,有許多的『機會商店』販賣仍可使用的回收物品,他們有私人開設的店面,也有救世軍、紅十字會、聖文森…等慈善單位所經營的商店,偶爾會有『機會』商品出售,售價大約是新品價格的十分之一以下,我須要材料維修物品時常去光顧。有一天我對舊的音效卡產生了一絲興趣,我非常痛恨微軟公司封閉資訊的作風,把世界上許多還很可以用的東西搞成是嚴重污染環境的來源,音效卡也是其中之一,我想我可以在這件事情上盡一點力,於是廉價收集了一些音效卡,著手設計程式,最後也完成了這個項目,值得為文一書,公開推介,在未有A/D卡之前,音效卡可以當做模擬硬體。

前述各個專題彙整後,總內容實在不小,將近是一本書的規模,而且我仍在整理積聚中,自覺值得留供自己永遠參考,至於是否要出版成書,以後再說。我已經不為獲利而寫文章了,更不可能印書當贈品,這個計劃若想真正全面實現,除了由政府支助外,不可能有人有興趣出錢幫忙完成,是個有利人類卻無利於個體的研究項目,根據我自己的經驗,書籍出版之後,如果沒有300本以上的基本銷售量,不可能收回印書的成本,因此,若無法達到可售出300本書的規模,我就不考慮發表而讓它自然廢棄,只留一套簡易硬體在我家後院長期試其性能,成為老來生活上的高級玩具,足矣。

當前Forth的推廣發展遭遇不少困難,其中一個主要因素,就是可供參考學習的材料相當缺乏。事實上Forth的推廣並不缺書,丁陳漢蓀老師,鄒靖寧老師,金城老師,奉駿泉先生…等Forth先進,都曾在台灣出版過相關中文教材書籍,幾個書局也曾印行幾本好的Forth英文原文書籍,如果有心向學,這些資源相當足夠了,我個人便永遠保留這些書本,這次能完成這些Forth程式,必須參考這些書籍。

我雖十幾年不寫FORTH程式了,但對台灣FORTH同好例行性活動的關心則不曾稍減,這是一個我曾努力貢獻過心力的特殊環境,我也相信它會恆久存在,因此在情況許可時,我仍願再寫些文章來引起共鳴。根據我個人的經驗,使用一般FORTH參考書籍進行推廣時,會有較缺乏應用實例的遺憾。這種情況對學習者而言,就好像學生考試時老是面對著『解釋名詞』,卻顧不了『應用問題』,而通常都是『應用問題』所佔的分數比較高,不是嗎?可是許多應用實例常具有時效性,通常只宜利用期刊發表,期刊的維持發行卻更為不易,連最有參考價值的『FORTH DIMENSIONS』都停刊了,可見一般。現在網路暫時霸佔了傳播媒體的最重份量,我不排斥它,有感於它可以頂替部份期刊的角色,現在又可以造福到全體中國人,我也只好很不情願的隨波逐流,自架了一個簡易純文字的個人Blog網頁:


http://forthfortnight.blogspot.com/


暫定有空時每兩個星期更新一次『慶的世界』網站上的文章,有興趣就來訪參觀吧,可是我得事先聲明,可能沒空回答問題,它暫時只是一個單向式的個人網站,我也沒空將其搞得花俏美觀,那不是目的所在。


  1. 前言


一般而言,聲音信號在我們有興趣的各種物理量度訊號中算是快速類的了,舉凡工程上常強調的壓力、流量、溫度、速度、重量…等信號,其變化頻率都不太高,大約每秒量度一次也就夠了,普通聲音頻率要求,大約要高到每秒兩萬次,為防止取訊失真,取訊的頻率就應高過最高頻率的兩倍以上,因此,音效卡的設計,以能夠用44.2 kHz的速率取得訊號為基本要求,所以屬快速訊號。當我們想將物理變化的訊號傳入電腦時,單只考慮取訊速度條件,若能處理聲訊,其他訊號也將不成問題,音效卡如能應用在這一方面,可具有不錯的潛在功能。

在訊號的解析度方面,我所用的音效卡雖只有8位元,A/D轉換器最高1/256的分辨能力,工程應用上也很足夠了,具有百分之一以內精確度的儀錶是非常好的錶,所以在不苛求的情況下,音效卡應該很容易滿足一般要求。

如果能用音效卡做點事情,它潛在的最大好處是因被批量生產而價格低廉。而最大的潛在問題,則是為了防止仿冒而封閉了一切相關資訊,甚至於被製成晶片組,讓使用者想利用它來做點份外事,或想進一步了解其軟硬體特性時,均不得其門而入。

由此看來,音效卡在上市的第一天,我們就應該可以用Forth寫程式搞出一大堆像樣的產品來了,有許多因素使我們以前就未能及時做到此事,殊為可惜,但今天才做,其實也不嫌晚,它確實還能做些事情。也許生產銷售音效卡的廠商,應該看一看我們如何令其另有用途,而及早公開它的相關資訊,銷路也許更廣,獲利更多。

按我初始計劃的目標,只想取得20Hz以下低頻聲訊,信號抓取速率最高每秒40次也就可以大約不失真了,至於信號強度的配合,則純粹是硬體設計的問題,軟體只在配合,因此我對使用Forth操控音效卡深具信心,軟體方面只要選對系統,就可以完成。本文重點不擬強調聲訊知識,大約的討論就到此為止。


  1. 軟硬體安排


熟悉Forth的人一定知道我為什麼一開始就不用Win32Froth?根本原因就是它在IntelIBMMicrosoft三家公司聯合搞出的現行暢銷個人電腦,已經不准你執行硬體輸出或輸入指令了,在CPU硬體方面有所謂的保護模式( Protection mode ),在後來的作業系統內有所謂的特權等級( Privilege level ),封死了程式語言執行輸出 / 輸入指令的功能,你硬要做,系統就恆給你一個『異常』( Exception )警告訊息,耗在那裡。詳細的細節不是本文論述的重點,以後有機會再另文探討,但我相信在接近這套電腦系統快要變成廢物以前,就會公布解決辦法,那些只想賺不道德錢的公司,一向都是如此待客的。寄生在這些作業系統下的Forth系統很無奈的被使用著,失去了P@P!類指令的Forth,套句台灣人的話形容它,就好像是『去給人家斷了腳筋』似的茍延殘喘,大半輩子有好多事情都不能作了,不是嗎?

要能執行硬體輸出 / 輸入的Forth系統依然不少,只要還能寄生在Windows’98以下的環境執行的Forth都可以列入此計劃的選擇考慮,甚至於包括曾經做為台灣推廣標準的F83F-PC Forth兩個系統也都可以,我又為何硬要選eForth32呢?一方面是選擇前試用了它的一些性能,夠我所須,沒有版權問題,另一方面是我對eForth後續發展的一點好奇感,就如同前述提及的『解釋名詞』與『應用問題』區別,我個人很想找題目試其真正的性能,是否真的可以一貫到底?現在我相信它了,以eForth的方式這樣子搞Forth,一定可以搞出名堂,無庸置疑。

Rick VonNorman把系統改得很快了,也提供了Forth Assembler,及與作業系統之間的現成指令,還有不少範例程式,我在接觸它的第一天就先執行一次標準的meta-compiler程式,又快又好,是真正的用ForthForth,它進行的過程相當完整,有些人誤把meta-compiler當一般compiler使用,那會使得一個能讓毛毛虫『蛻變』成美麗花蝴蝶的meta-compiler退化成『劣變』工具了。他也不甘寂寞的轉置此系統到Os2保護模式下執行,在XP作業環境中也工作得很好,是一個純用eForth方式發展出來的成功範例,很值得用它。

讀者很難想像,我竟然是用DOS3.3的陽春系統完成所有設計的,我的電腦安裝了硬碟抽取盒,可以在新電腦上快速更換舊系統所須的硬碟,電腦硬體本身背負了歷史的包袱,能執行XP作業系統的電腦依然可以執行DOS,功能沒有減少,要試這個程式,只須另備一個簡易麥克風,及舊的音效卡。

在硬體方面的安排,此計劃原則上應以標準的A/D卡來發展才是正途,因為資料才有可能透通齊全,像標準Forth一樣,使用者可以完全沒有疑問的工作,採用音效卡是一時權宜之計,不適用於所有狀況,除非生產廠願意供給資料,我們才有可能順便為其創造新利潤。

舊的音效卡快要變成廢物了,資料也缺乏保密價值,有一些善心人士就公開了它的用法,我從網路上搜索了三天幾百個網頁後,取得唯一可茲參考的資料,獲得一篇很好的關鍵程式── “ Real time Signal Processing Code ”,將其改寫成Forth程式後,試用成功,試出了原程式的功能,也試出了我想要的一份音效卡,為尊重原創人的貢獻,理應說明出處:


作者:Ethan Brodsky

連絡信箱:<ericbrodsky@psl.wisc.edu>



3. 依據程式


/* sbsample C */

void writedsp( unsigned char value ) ;

unsigned char readdsp( void ) ;

int resetdsp( void ) ;

void turnspeakeron( void ) ;

void turnspeakeroff( void ) ;

unsigned char getsample( void ) ;

void outsample( unsigned char sample ) ;


#defined TRUE 1

#defined FALSE 0


/* -------------------- */

#include < conio.h>

#defined RESETPORT 0x226

#defined READPORT 0x22A

#defined WRITEPORT 0x22C

#defined POLLPORT 0x22E


void writedsp( unsigned char value )

{

while( inp(WRITEPORT) & 0x80 ) ;

outp( WRITEPORT, value ) ;

}


unsigned char readdsp( void ) ;

{

while( ! ( inp( POLLPORT ) & 0x80 ) ) ;

return( inp( READPORT ) ) ;

}


int resetdsp( void )

{

int i ;

outp( RESETPORT, 1 ) ;

outp( RESETPORT, 0 ) ;

i = 100 ;

while( ! &&( readdsp( ) = 0xAA ) ) i++ ;

return( i ) ;

}


void turnspeakeron ( )

{

writedsp( 0xD1 ) ;

}


void turnspeakeroff ( )

{

writedsp( 0xD3 ) ;

}


unsigned char getsample( void )

{

writedsp( 0x20 ) ;

return( readdsp( ) ) ;

}


void outputsample( unsigned char sample )

{

writedsp( 0x10) ;

writedsp( sample ) ;

}


  1. Forth 對應程式


根據這個程式,幾乎已經獲得了幾個最重要的訊息,其中有重要的輸出入位址,以及幾個相關的控制碼,足供我們設計Forth程式時使用,改寫完成的Forth程式如下:


\ Sound Blaster card testing Forth words

\ eForth32 version

\ Author: Ching-Tang Tseng at Hamilton, New Zealand 2008-12-04

VARIABLE #DELAY 1 #DELAY !

: MS ( n - - ) FOR 300 FOR NEXT NEXT ;

HEX

0220 CONSTANT PORTBASE

PORTBASE 6 + CONSTANT RESETPORT

PORTBASE A + CONSTANT READPORT

PORTBASE C + CONSTANT WRITEPORT

PORTBASE E + CONSTANE POLLPORT

: RESETDSP ( - - )

1 RESETPORT PC!

0 RESETPORT PC!

100 FOR NEXT ;

: SB? ( - - )

RESETDSP

POLLPORT PC@ 80 AND

IF READPORT PC@ AA =

IF .” There it is! ” CR .” Sound Blaster Board detected.”

ELSE .” Nothing! System without Sound Blaster Board. ”

THEN

ELSE .” There is no response! ”

THEN ;

: WRITEDSP ( b - - )

WRITEPORT PC@ 80 AND 0=

IF WRITEPORT PC!

ELSE ABORT” Unable to write! ”

THEN ;

: READDSP ( - - b )

POLLPORT PC@ 80 AND

IF READPORT PC@

ELSE ABORT” Unable to read! ”

THEN ;

: GETSAMP ( - - b )

  1. WRITEDSP

READDSP ;

: OUTSAMP ( b - - )

  1. WRITEDSP

WRITEDSP ;

: .SB ( - - )

RESETDSP

PAGE

BEGIN

  1. 1 AT GETSAMP 10 U.R

#DELAY @ MS KEY?

UNTIL ;

: TURNSPON ( - - )

D1 WRITEDSP ;

: TURNSPOFF ( - - )

D3 WRITEDSP ;

DECIMAL


  1. 測試結果與分析


上列Forth程式大部份是翻譯的結果,沒有甚麼好解釋的。唯一可以推介的一個指令則是『.SB』,從我在個人電腦上使用Forth以來,如此的設計方式屢試不爽地被加以應用,它可以在螢幕右上角固定位置,動態的顯示一個記憶體之內容,速度可調,非常適合用來觀察硬體的內容狀況有無變化?例如:另一個位址046C,它是電腦計時用的最根本位址,計數內容不斷地快速變化往上增加,無論新舊,那一台電腦都一樣,不信你自己舉一反三的試試看。

這樣的執行Forth程式,才能顯現所謂的Real time control效果,它是Forth應該具有的最基本精神,失去了這個功能,憑良心講,就不能成其為Forth了。現在,請問讀者,能不能體會出我為什麼不用Win32Forth來發展這個計劃的道理了?

實際應用這個程式時,有一些結果可以提供讀者參考。有一些音效卡執行RESETDSPSB?指令時都無問題,可以通過測試,並被顯示系統中有音效卡存在,但隨後卻不能讀寫資料,無論我調整讀寫資料的速度如何?就是沒有結果,換句話說不具音效卡的功能,因我用的全是舊卡,只能透過三用電錶,測出麥克風輸入處,仍恆保有5伏的高電位狀況,但就是不工作,是卡壞了?或另有控制碼須執行?我也不得而知,這也是資料不透通所帶來的痛苦。幸好我仍試得了一片板子可供利用,因為它好,所以也不必在乎是否免費為這家廠商做廣告了,如此便可以鼓勵將來廠商盡量與我們合作,因此,故意要留下記錄如下:


『勁駒微電子股份有限公司銷售的ESS ES1868勁聲卡』


程式中端口基準位址PORTBASE暫設為0220,隨著音效卡的硬體選址設定,此值亦可配合調變,根據一般音效卡隨卡附屬的說明手冊顯示,位址的範圍大約為:十六進制的220230240250。卡上一般還有電玩搖桿( Joy stick )、中斷( IRQ )、記憶體直接存取( DMA )、喇叭輸出、光碟機介面…等設定可供操作,本文不打算涉及太多,因為資料不夠完整,有興趣的讀者,請向原創人索取。

上列程式基本上可供測試系統中有無音效卡了,如果功能仍正常,進行用卡前歸原設定、取訊與播放亦可執行,其他的應用程式便能據此來設計,這些功能也暫時能滿足我個人所須,隨後發展的一些應用程式中,包含了一個模擬示波器的設計,它工作得很好,因程式事涉專利,不宜發佈於此,但若你有現成的可畫線指令,下列程式便可依樣設計出來:


\ Digital Oscilloscope Simulator

\ LOAD (1) STD.4 (2) SB.4 (3) FLD.4 then this program

\ Author: Ching-Tang Tseng at Hamilton, New Zealand 2008-12-04

: INITX0

RESETDSP PAGE

GMODE

  1. X1 ! 300 Y1 ! AFTCAL COLOUR @ 0 0 EGA! ;

: ONEPAGE

  1. 0

DO I 300 GETSAMP - DRAW

#DELAY @ MS

LOOP ;

: SCOPE

INITX0

BEGIN

EGA ONEPAGE KEY?

UNTIL ;



  1. 展望與結論


為了要實現我的目標,還有不少事情要做,回顧已經完成的工作,每當我階段性的完成一些程式後,似乎都感覺到這些程式都還有不少其他功能可以發揮,這就是設計應用程式比純討論系統或指令性能來得好的原因,因為它比較務實。

事實上,應用程式看起來都不太艱深,當做學習教材最為適當,它將Forth連接到我們生活的環境中去,應用程式發揮功能時,設計人更容易產生成就感、快感與滿足感,要讓Forth能延續發展,多創作各個領域的應用程式是很重要的,否則在系統創作者辛勤設計發佈產品後,無論產品有多好,在無人接續的情況,很快的都將壽終正寢,因為電腦科技進展的速度是很快的。

應用程式本質上也有弱點,大部份都屬於有時效性的問題,時過境遷或事過境遷後就不太有參考價值。另外,既然是應用程式,就應該是很值得直接應用了,通常也因此而事涉創作人的版權問題,這也是讀者不容易見到此類作品的主要原因,我個人則非常尊敬肯公開應用程式的作者,能發表這篇文章首先應該感謝的人就是Ethan Brodsky,想引用的人不必謝我,請直接去信鼓勵原創人便可。

設計應用程式時免不了可能得碰硬體,設計人就得有些機電方面的概念,通常此類人才不多,這大概也是可公開應用程式寥寥無幾的一個主要原因。本人是略有所知,可以常觸此事,例如:我用一個旋軸式可變電阻及定電壓直流電源,配上運算放大器設計了簡單電路,接通到音效卡的輸入端,如此便模擬了所有物理感測器的信號源,廢棄的音效卡就相當於可以用來設計信號擷取系統,由於沒有像麥克風輸入時的背景噪音,讀得的信號還更為穩定。

想搞語音分析者,上面的資料也很能協助提供分析所須的音源樣品來源了,取得信號後存成任何一種資料檔案的格式,對我們而言是毫無問題的,如果使用了其他裝置系統,遭遇到資料檔與後續應用或分析系統無法連上的情況時,本文提供的透通資料就深具價值。

Forth是擅長執行即時性自動控制的程式語言,應用在這方面更為恰當,舉例而言:如果有海測船想用聲納測度海底壯況,用Forth設計邊開船邊測量,立即就取得結果的系統,比用其他任何方法要容易也更快速,當然也價廉,本文已經提供了這個答案。另提一個不吉利的建議,要發展找沉船的系統也一定比別人快,問題只在主事者願不願意接受Forth

文末,我想請我女兒協助,拍一張數位照,顯示本文提及的示波器功能,我在照片中,也向所有讀者問好,螢幕上被停格畫面錄得的聲音花樣是:『大家好』。(圖在檔案:FORTH操作音效卡_html_m59373aee.jpg)


版本: 
2 則關於本網頁的訊息
2008年12月4日,作者:燕南
按一下 http://groups.google.com.tw/group/FigTaiWan/web/forth ;如果這個方法無效,請將其
複製並貼到您瀏覽器的網址列。
2008年12月4日,作者:燕南
按一下 http://groups.google.com.tw/group/FigTaiWan/web/forth ;如果這個方法無效,請將其
複製並貼到您瀏覽器的網址列。
建立群組 - Google 網上論壇 - Google 首頁 - 服務條款 - 隱私權政策
©2009 Google