虚拟音频采集播放器的设计方案

时间:2022-10-07 11:23:35

虚拟音频采集播放器的设计方案

摘 要:相对于传统仪器功能固定的缺点,虚拟仪器具备很强的适应性。本文采用虚拟仪器的设计思想,利用声卡的采集和播放功能,提出了在PC机上实现虚拟音频采集播放器的方案。

关键词:虚拟;音频采集;播放;声卡

本文设计的虚拟音频采集播放器可支持的多种带宽模式。利用声卡和VC++软件,就可以让PC机变成一个虚拟音频采集播放器。在PC机上编程,可对声卡采集后的数据进行处理(数据处理程序可以随具体应用场合而定)和播放。

1 声卡和驱动软件

声卡是计算机自带的硬件,基本功能有信号滤波、放大、采样保持、A/D和D/A等,相当于一个数据采集卡的功能。随着电子技术的发展,声卡在采样率上和采样精度上都有更高的标准,有的采样率可达192KHz,采样精度可达24bit。采用低层音频服务API 函数,就可将声卡作为数据采集器来使用,大大节约了成本。

声卡驱动软件直接决定了声卡各组成部件协调工作。设计中采用API 函数,方便与声卡驱动程序进行通信,能够对采样频率、数据长度、采样通道数以及数据缓冲区大小等进行设置,并对波形输入输出缓冲区数据进行控制,保证数据处理的实时性。

以waveIn 开头的基本低层音频服务API函数如下:

waveInGetNumDevs 返回输入设备的个数

waveInGetDevCaps 获取输入设备的性能

waveInOpen 打开波形输入设备进入采集状态

waveInAddBuffer 添加缓冲区

waveInStart 启动缓冲区

waveInStop 停止存储数据

waveInClose 关闭输入设备

与输入相对应有以waveOut 开头的,对输出设备进行控制的函数,如:waveOutOpen、waveOutPrepareHeader、waveOutWrite、waveOutUnPrepareHead

er等。

2 音频采集模块

分别通过waveInGetNumDevs、waveInGetDevCaps 函数获取声卡的数量和性能。填写WAVEFORMATEX 结构体,对声卡的采样通道数、采样频率、数据长度、量化精度、数据格式进行设定。例如:

waveformat.wFormatTag表示编码类型,如果设定为 WAVE_FORMAT_PCM ,表示选择的编码类型是PCM格式即脉冲编码方式。

waveformat.nChannels表示声道数,如果设为1,表示选择了单通道。也可以选择双声道甚至多声道,要根据具体需要选择。单通道就是简单的采样,采集的数据依次存放在一个缓冲区中。如果用双通道采集,两个通道的数据是交错排列的,先存储左声道,再存储右声道,交替进行。

waveformat.nSamplesPerSec表示采样率,采样率要保证大于等于输入信号的最高频率的两倍。一般采样率越大性能越好,失真越少,但处理冗余度会增加,所以要折衷考虑。

waveformat.wBitsPerSample表示采样位数,也就是每一个采样值量化编码后的二进制位数。该值越高,量化噪声就越少。一般而言,采样位数可以取8或16,高端声卡可以取到24位。

waveformat.nBlockAlign,表示对音频处理的最小单位,也就是一个样值占有的字节数。如果量化后一个样值占16位,那么该参数为2。

waveformat.nAvgBytesPerSec表示每秒钟采集的数据量,它是用字节来度量。如果一个样值占两个字节,那么该值相当于两倍的采样速率。

waveformat.cbSize表示在标准的头部之后还有多少字节数。对于PCM格式而言为0,或者忽略不检查。

将这些参数和系统的工作界面关联后,就可以通过运行界面设定。参数初始化后,可以调用waveInOpen打开波形输入设备。调用waveInAddBuffer函数添加数据缓冲区,也就是分配内存,存储采样得到的数据。如果只开设一个存储区(一个缓存区的数据可称一帧),可能在数据处理的时候,丢失部分数据。因此设计中采用两个存储区,去轮流的记录声卡采集过来的数据。在一块用完后,驱动程序会自动使用另一块缓存来保存新采样的数据。使得处理程序从容的工作,在任何时候至少有一个缓存可用。缓冲区开设好后,调用waveInStart开始录音,也就是启动采样。

采集工作流程如下:

(1)在VC++中运行程序,出现参数设置界面;(2)通过参数设置界面设置信号采集参数,包括声卡的采样通道数、采样频率、数据长度、量化精度、数据格式等,参数设置完成后启动系统,让音频采集器进入工作状态,声卡开始采集数据;(3)从电脑上的Line_In或MIC接口送入待采集处理的模拟信号,经过声卡将模拟信号转变为数字信号,并将数据存放到其中一个预先分配的缓冲区中;(4)一个缓冲区满后,自动执行信号处理程序,并调用另一个缓冲区进行新数据的记录。

采集后的信号可以进行信号处理,信号处理函数自成模块,可以有很多类型。比如可以进行去噪声处理,让数据通过去噪滤波器,使得声音信号更加清晰;可以进行音频信号的格式转换;可以调整音量,添加回声,模拟立体声等。从广义上来看,该采集系统还有更灵活广泛的应用。比如对数据进行fft操作,得到信号的频谱;比如给信号添加信道因素,使该系统成为一个虚拟信道模拟器;还可以满足现实定的信号变化,让PC机变成一个多功能的虚拟仪器。该系统的工作流程就是数据的动态处理过程,若要停止信号采集工作,可通过虚拟按键关闭或直接关闭窗口,自动调入waveInStop停止向缓冲区存储数据,调用waveInUnprepare-Header函数释放波形输入缓冲区。

3 音频播放模块

无论经过怎样的信号处理过程,最后都要以一定的形式表现出来。例如进行去噪处理,让数据通过去噪滤波器使得声音信号更加清晰;或者进行音频信号的格式转换;或者调整音量,添加回声,模拟立体声等,都要以一定的形式表现出处理效果。对于声音信号的显示往往通过声音的播放来实现,同样要调用低层音频服务API函数。与之对应有以waveOut开头的,对信号输出设备进行控制的函数,如:waveOutOpen、waveOutPrepareHeader、waveOutWrite和waveOutUnPrepareHeader等。但是对于工程应用来说,只是听声音是不够的,如果有直观的视觉感受就更好了,因此需要添加图形的动态显示界面。比如对数据进行fft操作,可以通过动态界面看到输出信号的频谱;比如给信号添加信道因素,可以通过界面看到信道影响后的时域和频域波形。从而让PC机变成一个带显示功能的虚拟仪器。

具体方法,可以在VC++中调用CDC类的成员函数进行绘图操作。CDC类的定义包含在头文件afxwin.h中。同时MFC还提供了CDC的派生类CpaintDC、CclientDC等,用于完成特定的操作。利用VC++的可视化,可自己定位并选择颜色在MFC窗口实现波形的绘制。简单起见,采用OnDraw函数,并以帧为单位进行显示。处理完一帧刷新一次,就可以实现了波形的动态显示。

结束语

本系统利用声卡采集和播放音频信号,在VC++软件平台上编程开发,使得PC机成为一个音频采集播放器。通过界面可以设定采集的频率,数据的长度,数据处理方式等。在后期的制作中,通过添加不同的处理程序,把PC机变成具备不同功能的虚拟仪器。只要待处理信号在声卡工作频率范围内,都可以采用个人计算机来实现音频信号的处理。大大节省了费用和研发周期,因此该系统具备较好的商业应用价值。

参考文献

[1]周敬利,余胜生等.多媒体计算机声卡技术及应用[M].北京:电子工业出版社,1998.

[2]黄伟伦.MS-Windows多媒体程序设计实务与范例[M].武汉:华中理工大学出版社,1996.

上一篇:浅谈“四基”应用下的初中数学概念教学 下一篇:初中德育生活化教育策略