DOS下DSP播音的編程_第1頁
DOS下DSP播音的編程_第2頁
DOS下DSP播音的編程_第3頁
DOS下DSP播音的編程_第4頁
DOS下DSP播音的編程_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、DOS下DSP播音的編程摘要該文介紹了dsp編程的根本原那么和方法,并給出程序實例幫助理解,讀者可以此為根底來拓展、生成自己的實用程序。在ds下編程,將聲音轉化為數據記錄下來,或將數據轉化為聲音,通過聲卡上配置的喇叭回放出來,是一項很有實用價值和開發魅力的技術。時下流行的聲卡,如sundblasterpr及其兼容卡,都配有數字聲音處理器dsp芯片(digitalsundpressr),專門用于對聲音進展數字記錄及回放,是聲音數字處理的根底硬件。而av文件、v文件等,那么都是這些數據記載的詳細形式。reative公司為了方便用戶,提供了一組t-vie驅動程序,專門針對v文件,作為開發利用dsp功

2、能的軟接口,使用比擬方便。但是,也造成了某些限制。對于開發者而言,直接對dsp硬件編程,實現其功能,也許是更有吸引力的。聲音,無論是從揚聲器輸出的,還是從話筒輸入的,都是模擬量。而數據,無論是內存里操作的,還是磁盤上存儲的都是數字量。因此,微機處理聲音,大多離不開ad與da兩種轉換。由于聲音數據的數據量比擬大,在聲音的數字處理中,除直接由pu進展傳輸外,批量數據常采用da方式傳輸,以節省較多的pu時間。總括起來,ad與da兩種轉換方式,直接傳輸和da傳輸這兩種傳輸方式,再加上不同的壓縮方式,如喇叭控制、靜寂等等,所有這些的不同組合,就構成了dsp的各種功能。根據dsp的硬件原理,其各種功能都規

3、定了一定的操作步驟。一、dsp編程要點在dsp編程中,主要注意命令與端口兩個層次的操作。1.dsp命令。dsp的功能一般以一個操作碼(稱作命令號)的寫操作為中心,按規定的步驟,配合假設干必要的輔助操作,構成一串操作的組合,稱為dsp命令。如8位直接播放功能命令號為10h,8位直接錄音功能命令號為20h,喇叭的通斷功能命令號分別為d1h與d3h等等。2.端口操作。dsp命令主要靠端口操作來實現。端口操作包括dsp初始化、寫dsp命令(即發dsp命令)、讀dsp狀態參數、dsp中斷等。所涉及的端口地址及相應的用處如表1。表1dsp端口及用處端口地址由基址2x0h加6、0ah、0h、0eh等形成,其

4、中,x可取值1、2、3、4、5、6等,詳細情況隨硬件設置而定,多數卡在出廠被默認設置為2,即基址為220h。通過跳線,可改變此值,防止與其它設備口地址沖突。二、編程實例dsp的功能是比擬豐富的,限于篇幅,本文只簡要介紹其中的8位直接播放功能,由此舉一反三,其它功能的用法不難得知。各功能的規定操作可參考文獻1和2。1.命令操作步驟。8位直接播放功能的操作步驟如下:寫命令號10h;寫數據字節(即播放聲音的8位數據);按采樣率所需時間周期延時。以此三步操作為循環體,進展n次循環,即完成播放。其中,n為聲音數據字節數。2.2xh端口寫操作。在dsp編程中,無論是發送命令,還是發送數據,都是通過寫端口2

5、xh來完成的。在寫端口2xh之前,應先讀此端口,直到所得值的bit7為0,這才說明此端口處于可寫狀態,才能進展寫操作。此過程的語言形式如下:hile(inprtb(0 x22)0 x80);utprtb(0 x22,byte);這里假定端口基址為220h。句中byte可以是命令號,也可以是數據。3.定時器。為使播放按一定的采樣率進展,需對數據發送進展定時控制。這一般是借用主機定時中斷int8,將其調用頻率進步到與采樣率相當的程度,利用其監視、控制數據發送的時間,來滿足播音頻率的要求。關于定時中斷的編程技術已有過許多介紹,限于篇幅,不再贅述,讀讀文后的程序清單,即一目了然。應該說明的是,對于pu

6、較慢的機型如386,由于計時代碼本身的執行時間可能已經超過采樣率對應的時間周期,定時控制就達不到預期的效果。這種情況下,用一個空循環來定時,調整循環次數,即可滿足頻率要求。此法的缺點是定時精度差,參數因pu速度而異。所幸的是,目前多數配置多媒體的p機,其pu都在486以上。4.內存利用。人耳可辨聲音的最高頻率可達20khz以上,因此dsp的采樣率至少也要到達與此相當的程度,而為了包容立體聲雙聲道信息,采樣率還要再翻一倍。常見的av聲音的采樣率有44100、22050、11025等。在這么高的采樣率下,聲音的數據量自然很大,如44k采樣率下,20秒的錄音數據長達800多k。為在ds常規內存內處理

7、這種規模的數據,實例程序采取了分塊處理的方式,將數據分成以當前剩余自由內存大小為單位的塊,將其逐次讀入,逐次處理。同時,由于語言的read()函數每次讀操作的字節數最多不過64k-1,因此,每一個分塊又需分假設干次讀入。實例說明,經此法處理的播放程序不受av文件長度的限制,筆者在inds下錄制的長達5多的av文件(11k采樣率,約8分鐘)也照播不誤。5.聲音文件。本文提供的程序實例其聲音數據取自av文件,其實,對于v文件,本播放技術也一樣適用,只不過數據的讀取格式有所不同而已。關于av文件的格式,可參考文獻3,v文件的格式參考獻1和2。實例程序用brland+3.1編譯,在配置pti386主板

8、、海洋486主板及多種與sundblasterpr兼容聲卡的兼容機上運行通過。三、源程序清單#inludei.h#inludeds.h#inludeni.h#inludestdi.h#inludefntl.h#inludestdlib.h#inludestring.h#inludeall.h#inludetier.h#definen120#definen2100strutavheadharriff4;lngsize0;haraveft8;lngsize1;intfttag;inthannel;lngsaplesperse;lngbytesperse;intblkalign;intbitsper

9、saple;harflg4;head;unsignedprt=0 x210;harfund=0;unsignednt1,nt2;vidprtreset();vidutave(unsignedharhuge*,lng);vidriteprt(unsignedhar);viderrexit(har*);vidain()intfp;unsignedn,r,nn,i,j;harnae32;lngfere,rr,datasize;unsignedharhuge*data,huge*p;if(arg2)errexit(issfilenaen);strpy(nae,argv1);strat(nae,.av)

10、;fp=-pen(nae,0-rdnly);if(fp=-1)errexit(errrpenfilen);-read(fp,head,sizef(avhead);if(head.blkalign=1strnp(head.flg,data,4)=0)elseif(head.blkalign=2strnp(head.flg,fat,4)=0)lseek(fp,12l,1);elseerrexit(errrfilestrutn);fare=farreleft();p=data=(unsignedharhuge*)farall(datasize);n=datasize/32768;r=datasize

11、%32768;fr(i=0;in;i+,p+=32768)-read(fp,p,32768);-read(fp,p,r);utave(data,datasize);data=(unsignedharhuge*)farall(fare);p=data;fr(j=0;jn;j+,p+=32768)-read(fp,p,32768);-read(fp,p,r);p=data;fr(i=0;in;i+,p+=32768)-read(fp,p,32768);-read(fp,p,r);farfree(data);-lse(fp);nt1=n1;hile(prt0 x260)!fund)utprtb(pr

12、t+6,1);utprtb(prt+6,0);nt2=n2;hile(nt22inprtb(prt+0 xe)128)-nt2;if(nt2=0|inprtb(prt+0 xa)!=xaa)-nt1;if(nt1=0)nt1=n1;prt=prt+0 x10;vidutave(unsignedharhuge*p,lnglen)lngi;intspl;spl=44100/head.saplesperse/head.blkalign;fr(i=0;ilen;i+)vidriteprt(unsignedharv)viderrexit(har*sg)-ax=3;asint10hprintf(sg);exit(0);#inludds.h#defineldtierint0 x60unsignedlngunter;unsignedunterint8,fpi8;vidsettier(vidinterrupt(*rut)(),unsignedfreq)intint;asliint=1193180/freq;utprtb(0 x43,0 x36);utprtb(0 x40,int

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論