- 相關推薦
DOS下DSP播音的編程
摘要 該文介紹了DSP編程的基本原則和方法,并給出程序實例幫助理解,讀者可以此為基礎來拓展、生成自己的實用程序。
在DOS下編程,將聲音轉化為數據記錄下來,或將數據轉化為聲音,通過聲卡上配置的喇叭回放出來,是一項很有實用價值和開發魅力的技術。時下流行的聲卡,如Sound Blaster Pro及其兼容卡,都配有數字聲音處理器DSP芯片(Digital Sound Processor),專門用于對聲音進行數字記錄及回放,是聲音數字處理的基礎硬件。而WAV文件、VOC文件等,則都是這些數據記載的具體形式。Creative公司為了方便用戶,提供了一組CT-Voice驅動程序,專門針對VOC文件,作為開發利用DSP功能的軟接口,使用比較方便。但是,也造成了某些限制。對于開發者而言,直接對DSP硬件編程,實現其功能,也許是更有吸引力的。
聲音,無論是從揚聲器輸出的,還是從話筒輸入的,都是模擬量。
而數據,無論是內存里操作的,還是磁盤上存儲的都是數字量。因此,微機處理聲音,大多離不開ADC與DAC兩種轉換。由于聲音數據的數據量比較大,在聲音的數字處理中,除直接由CPU進行傳輸外,批量數據常采用DMA方式傳輸,以節省較多的CPU時間。
總括起來,ADC與DAC兩種轉換方式,直接傳輸和DMA傳輸這兩種傳輸方式,再加上不同的壓縮方式,如喇叭控制、靜寂等等,所有這些的不同組合,就構成了DSP的各種功能。根據DSP的硬件原理,其各種功能都規定了一定的操作步驟。
一、DSP編程要點
在DSP編程中,主要注意命令與端口兩個層次的操作。
1.DSP命令。DSP的功能一般以一個操作碼(稱作命令號)的寫操作為中心,按規定的步驟,配合若干必要的輔助操作,構成一串操作的組合,稱為DSP命令。如8位直接播放功能命令號為10h,8位直接錄音功能命令號為20h,喇叭的通斷功能命令號分別為d1h與d3h等等。
2.端口操作。DSP命令主要靠端口操作來實現。端口操作包括DSP初始化、寫DSP命令(即發DSP命令)、讀DSP狀態參數、DSP中斷等。所涉及的端口地址及相應的用途如表1。
表1 DSP端口及用途
端口地址由基址2x0h加6、0ah、0ch、0eh等形成,其中,x可取值1、2、3、4、5、6等,具體情況隨硬件設置而定,多數卡在出廠被默認設置為2,即基址為220h。通過跳線,可改變此值,避免與其它設備口地址沖突。
二、編程實例
DSP的功能是比較豐富的,限于篇幅,本文只簡要介紹其中的8位直接播放功能,由此舉一反三,其它功能的用法不難得知。各功能的規定操作可參考文獻1和2。
1.命令操作步驟。8位直接播放功能的操作步驟如下:
·寫命令號10h;
·寫數據字節(即播放聲音的8位數據);
·按采樣率所需時間周期延時。
以此三步操作為循環體,進行n次循環,即完成播放。其中,n為聲音數據字節數。
2.2xch端口寫操作。在DSP編程中,無論是發送命令,還是發送數據,都是通過寫端口2xch來完成的。在寫端口2xch之前,應先讀此端口,直到所得值的bit7為0,這才表明此端口處于可寫狀態,才能進行寫操作。此過程的c語言形式如下:
while (inportb(0x22c)&0x80);
outportb(0x22c,byte);
這里假定端口基址為220h。句中byte可以是命令號,也可以是數據。
3.定時器。為使播放按一定的采樣率進行,需對數據發送進行定時控制。這一般是借用主機定時中斷int8,將其調用頻率提高到與采樣率相當的程度,利用其監視、控制數據發送的時間,來滿足播音頻率的要求。關于定時中斷的編程技術已有過許多介紹,限于篇幅,不再贅述,讀讀文后的程序清單,即一目了然。應該說明的是,對于CPU較慢的機型如386,由于計時代碼本身的執行時間可能已經超過采樣率對應的時間周期,定時控制就達不到預期的效果。這種情況下,用一個空循環來定時,調整循環次數,即可滿足頻率要求。此法的缺點是定時精度差,參數因CPU速度而異。所幸的是,目前多數配置多媒體的PC機,其CPU都在486以上。
4.內存利用。人耳可辨聲音的最高頻率可達20kHz以上,因此DSP的采樣率至少也要達到與此相當的水平,而為了容納立體聲雙聲道信息,采樣率還要再翻一倍。常見的WAV聲音的采樣率有44100、22050、11025等。在這么高的采樣率下,聲音的數據量自然很大,如44k采樣率下,20秒的錄音數據長達800多k。為在DOS常規內存內處理這種規模的數據,實例程序采取了分塊處理的方式
[1] [2] [3] [4]
【DOS下DSP播音的編程】相關文章:
DOS命令04-29
DOS的特點電腦資料11-01
DSP放異彩04-28
防火墻·什么是DoS04-26
編程的心得03-14
給機器編程04-28
數控編程心得05-07
編程語言排名04-29
求職信與履歷表的DOS & DONTS04-26
有趣的編程課作文04-20