DOS下DSP播音的编程(1)(精)

时间:2022-07-13 16:12:14 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
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时间。总括起来,ADCDAC两种转换方式 接传输和DMA专输这两种传输方式再加上不同的压缩方式如喇叭控制、静寂 等等,所有这些的不同组合,就构成了 DSP的各种功能。根据DSP的硬件原理, 各种功能都规定了一定的操作步骤。一、 DSPS程要点在DSPS程中,主要注意 命令与端口两个层次的操作。1.DSP命令。DSP的功能一般以一个操作码(称作 命令)的写操作为中心按规定的步骤配合若干必要的辅助操作构成一串操 作的组,称为DSP命令。8位直接播放功能命令号为10h,8位直接录音功能 命令号为20h,喇叭的通断功能命令号分别为 d1hd3h等等。2.端口操作。

DSP命令主要靠端口操作来实现。端口操作包括 DSP初始化、写DSP命令 (即发 DSP命令)DSP犬态参数、DSP中断等。所涉及的端口地址及相应的用途如 11 DSP端口及用途端口地址由基址 2x0h60ah0ch0eh等形成 其中,x可取值123456,具体情况随硬件设置而定,多数卡在出厂 被默认设置为2,即基址为220h。通过跳线可改变此值避免与其它设备口地址 冲突。二、编程实例DSP的功能是比较丰富的限于篇幅本文只简要介绍其中 8位直接播放功由此举一反三其它功能的用法不难得知。各功能的规定 操作可参考文献121.命令操作步骤。8位直接播放功能的操作步骤如 •写命令号10h; •写数据字节(播放声音的8位数据);•按采样率所需时 间周期延时。以此三步操作为循环体进行n次循环,即完成播放。其中,n为声 音数据字节数。2.2xch端口写操作。在DSP编程中,无论是发送命令,还是发送 数据,都是通过写端口 2xch来完成的。在写端口 2xch之前,应先读此端口 ,直到 所得值的bit70,这才表明此端口处于可写状态才能进行写操作。此过程的 c 语言形式如下:while (inportb(0x22c)&0x80);outportb(0x22c,byte); 这里 假定端口基址为220h。句中byte可以是命令号,也可以是数据。3.定时器。为 使播放按一定的采样率进行需对数据发送进行定时控制。这一般是借用主机定 时中断int8将其调用频率提高到与采样率相当的程度利用其监视、控制数据 发送的时间满足播音频率的要求。关于定时中断的编程技术已有过许多介绍 限于篇幅,不再赘述,读读文后的程序清单即一目了然。应该说明的是对于 CPU较慢的机型如386,于计时代码本身的执行时间可能已经超过采样率对应 的时间周期定时控制就达不到预期的效果。这种情况下用一个空循环来定时


调整循环次数即可满足频率要求。此法的缺点是定时精度差参数因CPU 异。所幸的是目前多数配置多媒体的PCCPU都在486以上。4.内存利 用。人耳可辨声音的最高频率可达 20kHz以上,因此DSP的采样率至少也要达到 与此相当的水平而为了容纳立体声双声道信息采样率还要再翻一倍。常见的 WAV^音的采样率有441002205011025等。在这么高的采样率下,声音的数 据量自然很大,44k采样率下,20秒的录音数据长达800k为在DOS常规 内存内处理这种规模的数据实例程序采取了分块处理的方式将数据分成以当 前剩余自由内存大小为单位的块将其逐次读入,逐次处理。同时由于C语言的 read()函数每次读操作的字节数最多不过 64k-1,因此每一个分块又需分若干 次读入。实例表明,经此法处理的播放程序不受 WAV文件长度的限制,笔者在 Windows下录制的长达5M多的WAVt(11k采样率8分钟)也照播不误。5. 声音文件。本文提供的程序实例其声音数据取自 WAX文件,其实,对于VOC文件, 本播放技术也一样适用只不过数据的读取格式有所不同而已。关于 WAX文件的 格式,可参考文献3,VOC文件的格式参考献12。实例程序用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.wddqw.com/doc/7d00cf6ba75177232f60ddccda38376baf1fe07f.html