基于声卡的双通道实时信号采集处理系统设计
韩红帮1,解永刚2,张恒云3,杨亚彪1,李海雁1
(1.昆明学院现代教育技术中心,云南昆明650214;2.昆明学院资产管理与设备处,云南昆明650214;
3.昆明学院化学科学与技术系,云南昆明650214)
摘要:采用声卡代替商用数据采集卡,利用VisualC++软件编程技术,设计了基于声卡的双通道实时信号采集处理系
统,该系统能够实现25kHz范围内双路信号的实时采集、实时分析,所采集数据的存储和网络发送等功能,系统实用
性较强,可广泛应用于各高校实验室及实时语音信号处理等领域。
关键词:声卡;信号采集;信号处理;系统设计
中图分类号:TP274.2文献标识码:A文章编号:1674-6236(2013)02-0001-03
Designofdouble-channelreal-timesignalcollectinganddisposalsystem
basedonsoundcard
HANHong-bang1,XIEYong-gang2,ZHANGHeng-yun3,YANGYa-biao1,LIHai-yan1
(1.TheCenterofModernEducationTechnology,KunmingUniversity,Kunming650214,China;
2.OfficeofAssetandEquipmentManagement,KunmingUniversity,Kunming650214,China;
3.TheDepartmentofChemistry,KunmingUniversity,Kunming650214,China)
Abstract:Thisarticleaimsatthedesignofdouble-channelreal-timesignalcollectinganddisposalsystembasedon
soundcardbymeansofreplacingcommercialdatacollectingcardwithsoundcard,withtheapplicationofVisualC++
softwareprogrammingtechnology.Thissystemiscapableofthereal-timecollecting,analysis,storageandonline
transmittingofthedouble-channelsignalswithintherangeof25kHz.Andtheauthorbelievesthatthissystemisofhigh
practicalapplicabilitywhichensuresitsfulluseinuniversitylaboratoriesandothercertainfieldslikereal-timevoice
signaldeposal.
Keywords:soundcard;signalcollecting;signaldisposal;systemdesign
收稿日期:2012-09-22稿件编号:201209163
基金项目:云南省教育厅科学研究基金项目(2011Y238)
作者简介:韩红帮(1977—),男,云南曲靖人,硕士,实验师。研究方向:现代教育技术。在高校教学和科研实践工作中,常常需要对一些信号进
行采集分析处理,但由于经费不足等原因许多实验室无相应
仪器设备,或者存在设备数量较少,功能单一等问题,不能很
好地满足教学实验和科研实践要求。要实现信号采集,就需
要数据采集卡的支持,而市场上数据采集卡价格比较昂贵,
不可能在实验室中普遍配置使用。
目前声卡已成为多媒体计算机的一个标准配置,它是一
个非常优秀的音频信号采集系统,其最高采样率可达192
kHz,量化精度可选择8比特、16比特和24比特,支持双通道
模式,能够无失真采集25kHz以下信号。在采样频率要求不
高的情况下,可以利用计算机声卡作为数据采集卡,利用计
算机CPU作为信号处理器,通过软件编程实现常规信号实时
采集分析处理[1]。
本文设计的系统不仅能满足教学工作和科研实践要求,
还能根据不同应用需求灵活方便的添加信号处理软件模块,
实现采集信号的实时处理。1系统硬件结构
声卡一般有MicIn和LineIn两个输入插孔,待采集信号
可以通过这两个插孔输入到声卡。两个插口的区别是:1)MicIn
接口有前置放大器,容易引入噪声且会导致信号过负荷,而
LineIn接口噪声干扰小且动态特性良好;2)MicIn接口有4kHz
的前置低通滤波器,仅适合话筒信号输入,而LineIn接口前置
低通滤波器带宽范围为25kHz,实用信号范围更广。声卡用作
数据采集卡时一般选择Linein口为信号输入接口[2-3]。在本文系
统中待采集信号分别以左右声道方式同时从Linein口输入。
2系统软件编程技术
声卡作为数字采集卡使用,首先必须对其编程控制并连
续不断的获取AD采样数据。其软件编程接口有几种可供选
择,首先,声卡是一种多媒体设备,可以用MCI(MediaControl
Interface)命令来控制声卡,MCI提供了一组与设备无关的控
制命令,是一种访问多媒体设备的高层次方法。但是该方法电子设计工程ElectronicDesignEngineering第21卷Vol.21第2期No.22013年1月Jan.2013
-1-《电子设计工程》2013年第2期
不够灵活,无法在录音的过程中访问内存中的采样数据,只
有在录音完成后通过访问录音文件才可以得到采样数据,另
外,声卡在采样过程中存取文件需要耗费时间,有可能造成
采样数据的断续,显然该方法不能满足信号实时采集的要
求。其次,Windows低级波形音频函数提供了对声卡最大灵活
性的操作,它允许在采样过程中实时访问内存中每个采样数
据,能很好地满足实时采集处理要求[4]。
2.1双路信号实时采集实现原理
实现声卡采集数据的实时性、连续性和可靠性是软件设
计的关键问题。本文软件系统中,通过直接调用Windows最
底层波形音频接口函数,实现声卡的编程控制,系统中采用
了多线程多缓冲技术,即声卡采集与数据处理使用不同的工
作线程,同时给声卡提供多个用于承载采集数据的缓冲区,
在同一时刻部分缓冲区供声卡采集线程装载数据的同时,另
外已经装满数据的缓冲区供数据处理线程处理,从而使得信
号采集和数据处理工作同时进行,有效保证了采集数据的连续性和信号处理的实时性[5-6],其原理框图如图1所示。
2.2声卡软件编程
Windows以动态链接库Mmsystem.dll的形式提供低级波
形音频函数,用以控制声卡实现信号的正确采集,在软件编
程中采用面向对象的思想,将声卡实时采集功能封装成专门
的类CSoundIn,以下从代码的角度给出声卡采集模块的软件
实现过程[7]。
1)设置声卡基本参数。先定义WAVEFORMATEX结构
变量m_Format,设置声卡采样数据格式、采样率、采样位数、
通道数以及缓冲大小。具体代码为:
m_Format.wFormatTag=WAVE_FORMAT_PCM;//设置
采样的编码方式
m_BufferSize=9600;//设置缓冲区大小
SetBitsPerSample(16);//设置采样位数
SetSamplesPerSecond(16000);//采样率设置
SetNumberOfChannels(1);//采样声道数设置
缓冲区设置不能太大也不能太小,太大时信号采集的实
时性受到影响,太小时采集的信号有可能来不及处理就被覆
盖了,从而导致数据不连续,起不到缓冲的作用。
2)打开声卡设备,添加数据缓冲区,开始数据采集,主要
代码如下:
boolCSoundIn::Start()
{//基于回调函数的方式打开录制设备
mmReturn=::waveInOpen(&m_hRecord,WAVE_MAPPER,
&m_Format,
(DWORD)waveInProc,(DWORD)this,
CALLBACK_FUNCTION);
if(mmReturn)returnFALSE;
else{
//准备并加入多个供录制的数据缓冲区
AddInputBufferToQueue();
//调用waveInStart()开始录音
mmReturn=::waveInStart(m_hRecord);
if(mmReturn)returnFALSE;
m_bRecording=true;
}
}
其中waveInOpen(&m_hRecord,WAVE_MAPPER,&m_Format,
(DWORD)waveInProc,(DWORD)this,CALLBACK_FUNCTION)
函数打开声卡采集线程;AddInputBufferToQueue()函数通过
调用waveInPrepareHeader(m_hRecord,m_pHdr[i],sizeof
(WAVEHDR))和waveInAddBuffer(m_hRecord,m_pHdr[i],
sizeof(WAVEHDR))函数给声卡添加多个供存储数据的缓
冲区。
3)通过回调函数实时获取采集数据。从上一步的waveIn
Open()函数具体参数可知,采用了回调函数的方式实时获取
声卡采样数据,当声卡缓冲队列中有装满数据的缓冲区时,
操作系统会自动调用回调函数waveInProc()将装满数据的缓
冲区及时回调供用户线程实时分析处理,同时将提取数据后
的空缓冲区重新加入到采集缓冲队列中,继续循环使用。具
体代码为:
voidCSoundIn::waveInProc(HWAVEINhwi,UINTuMsg,
DWORD
dwInstance,DWORDdwParam1,DWORDdwParam2)
{
MMRESULTmmReturn=0;
CSoundIn*pSound=(CSoundIn*)dwInstance;
LPWAVEHDRpHdr=(LPWAVEHDR)dwParam1;
if(uMsg==MM_WIM_DATA)
{
//将录制好的数据缓冲回调到处理类中进行处理
pSound->DataFromSoundIn((BOOLEAN*)pHdr->lpData,
//将缓冲重新加入缓冲队列中
pHdr->dwBufferLength,pSound->m_pOwner);
mmReturn=::waveInAddBuffer(pSound->m_hRecord,
pHdr,sizeof(WAVEHDR));
if(mmReturn)return;
}
}图1声卡实时采集原理框图Fig.1Schematicdiagramofsoundcardreal-timecollecting