当前位置:文档之家› 基于声卡的双通道实时信号采集处理系统设计

基于声卡的双通道实时信号采集处理系统设计

基于声卡的双通道实时信号采集处理系统设计

韩红帮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

相关主题