【#文档大全网# 导语】以下是®文档大全网的小编为您整理的《DOS下DSP播音的编程(1)(精)》,欢迎阅读!
DOS下 DSP播音的编程⑴
摘要该文介绍了 DSP编程的基本原则和方法,并给出程序实例帮助理 解,
读者可以此为基础来拓展、生成自己的实用程序。在 DOST编程,将声音转 化为数据记录下来,或将数据转化为声音,通过声卡上配置的喇叭回放出来,是一 项很有实用价值和开发魅力的技术。时下流行的声卡 ,如Sou nd Blaster Pro 及 其兼容卡,都配有数字声音处理器 DSP芯片(Digital Sou nd Processor), 专门用 于对声音进行数字记录及回放,是声音数字处理的基础硬件。而 WAX文件、VOC 文件等,则都是这些数据记载的具体形式。Creative公司为了方便用户,提供了 一组CT-Voice驱动程序,专门针对VOC文件,作为开发利用DSP功能的软接口, 使用比较方便。但是,也造成了某些限制。对于开发者而言,直接对DSP硬件编 程,实现其功能,也许是更有吸引力的。声音,无论是从扬声器输出的,还是从话 筒输入的,都是模拟量。而数据,无论是内存里操作的,还是磁盘上存储的都是数 字量。因此,微机处理声音,大多离不开ADC与 DAC两种转换。由于声音数据的 数据量比较大,在声音的数字处理中,除直接由CPU进行传输外,批量数据常采用 DMA方式传输,以节省较多的CPU时间。总括起来,ADC与DAC两种转换方式,直 接传输和DMA专输这两种传输方式,再加上不同的压缩方式,如喇叭控制、静寂 等等,所有这些的不同组合,就构成了 DSP的各种功能。根据DSP的硬件原理,其 各种功能都规定了一定的操作步骤。一、 DSPS程要点在DSPS程中,主要注意 命令与端口两个层次的操作。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常规 内存内处理这种规模的数据,实例程序采取了分块处理的方式,将数据分成以当 前剩余自由内存大小为单位的块,将其逐次读入,逐次处理。同时,由于C语言的 read()函数每次读操作的字节数最多不过 64k-1,因此,每一个分块又需分若干 次读入。实例表明,经此法处理的播放程序不受 WAV文件长度的限制,笔者在 Windows下录制的长达5M多的WAVt件(11k采样率,约8分钟)也照播不误。5. 声音文件。本文提供的程序实例其声音数据取自 WAX文件,其实,对于VOC文件, 本播放技术也一样适用,只不过数据的读取格式有所不同而已。关于 WAX文件的 格式,可参考文献3,VOC文件的格式参考献1和2。实例程序用Borland C++
3.1编译,在配置OPTI 386主板、海洋486主板及多种与SoundBlaster Pro 兼 容声卡的兼容机上运行通过。三、源程序清单
#i nclude#i nclude#i ncludevc on io.h>#i nclude#i nclu devfc ntl.h>#i nclude#i ncludevstri ng.h>#i nclude#i ncl
ude"timer.h"#defi ne n1 20#defi ne n2 100struct WavHead{char riff[4];l ong size0;char wavefmt[8];lo ng size1;i nt fmttag;i nt cha nn el;l ong samplespersec;l ong bytespersec;i nt blockalig n;i nt bitspersample;char flg[4];}whead; un sig ned Port=0x210;char
Foun d=0 ;un sig ned cn t1,c nt2;void PortReset();void outwave( un sig ned char huge *,lo ng);void WritePortC(u nsig ned char);void errexit(char *);void mai n(){
本文来源:https://www.wddqxz.cn/7d00cf6ba75177232f60ddccda38376baf1fe07f.html