当前位置:文档之家› 采集声音信息

采集声音信息

unit caiji;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,MMSystem, ExtCtrls;typeTForm1 = class(TForm)Button1: TButton;Memo1: TMemo;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;typetrecorder=classprivateFwavefmt:Twaveformatex;wavehandle:hwavein;wavehdr1:pwavehdr;wavebuffer1:lpstr;procedure callback(umsg,dwinstance,dwparam1,dwparam2:dword);stdcall; end;varForm1: TForm1;recorder:trecorder;umsg,dwinstance,dwparam1,dwparam2:dword;dddd:W A VEINCAPS;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);varre:uint;wave_num:uint;str:string;mmrError:MMRESULT;pszText: LPSTR;cchText:UINT;beginrecorder:=trecorder.Create;recorder.Fwavefmt.wFormatTag:=wave_format_pcm;recorder.Fwavefmt.nSamplesPerSec:=11025; //采样速率recorder.Fwavefmt.nAvgBytesPerSec:=22050; //每秒采样得到的数据recorder.Fwavefmt.wBitsPerSample:=16; //量化位数recorder.Fwavefmt.nBlockAlign:=2; //记录区块对齐的单位。

re:=waveInGetNumDevs;wave_num:=uint(1);re:=waveinopen(@recorder.wavehandle,wave_mapper,(@recorder.Fwavefmt),dword(@trecorder.callb ack),dword(@recorder), callback_function);//callback_function+wave_allowsync;showmessage(inttostr(re));// str:=inttostr(dddd.wMid)+' '+inttostr(dddd.wPid)+' '+inttostr(dddd.vDriverVersion)+' ';// str:=str+inttostr(dddd.dwFormats)+' '+ inttostr(dddd.wChannels)+' '+inttostr(dddd.wReserved1)+' ';case re ofMMSYSERR_ALLOCATED:showmessage('已经分配内存');MMSYSERR_BADDEVICEID:showmessage('超出索引');MMSYSERR_NODRIVER:showmessage('没有驱动');MMSYSERR_NOMEM:showmessage('不能分配内存');W A VERR_BADFORMAT:showmessage('打开不支持的设备');end;//end case//////////////////////////////////////////////为采样数据分配缓冲空间recorder.wavehdr1:=globalallocptr(ghnd or gmem_share,sizeof(wavehdr));recorder.wavebuffer1:=globalallocptr(ghnd or gmem_share,1024);recorder.wavehdr1.lpData:=recorder.wavebuffer1;recorder.wavehdr1.dwBufferLength:=1024;waveinprepareheader(recorder.wavehandle,recorder.wavehdr1,sizeof(wavehdr)); waveinaddbuffer(recorder.wavehandle,recorder.wavehdr1,sizeof(wavehdr)); waveinunprepareheader(recorder.wavehandle,recorder.wavehdr1,sizeof(twavehdr)); globalfreeptr(recorder.wavebuffer1);///////////////////////////////////////////////////////////////////////////////////////////////////启动波形输入设备re:=waveinstart(1);showmessage(inttostr(re));case re ofMMSYSERR_INV ALHANDLE: showmessage('Specified device handle is invalid.'); MMSYSERR_NODRIVER: showmessage('No device driver is present.' ) ;MMSYSERR_NOMEM:showmessage( 'Unable to allocate or lock memory.' );end;end;procedure trecorder.callback(umsg,dwinstance,dwparam1,dwparam2:dword);stdcall;var i:integer;spbyte:^byte;singledata:integer;beginshowmessage('good');case umsg ofmm_wim_open:beginshowmessage('good');end;mm_wim_data:beginspbyte:=pointer(dwparam1);for i:=0 to 100 dobeginsingledata:=spbyte^;inc(spbyte);end;end;end;end;end.//////////////////////////////资料一、特点声卡作为语音信号与计算机的接口卡件,其最基本的一项功能就是A/D转换。

实际上,除了语音外,很多信号的频率都落在音频范围内(比如机械量信号,过程量信号等),当我们需要对这些信号进行采集时,使用声卡作为采集卡是一种相当令人满意的解决方案,其理由如下:1.价格便宜。

一般声卡的价格才一百多元,比起自己从头到尾开发一块采集卡的成本低得多。

比起目前市场上的采集卡的价格,更是不可同日而语。

相应地,产品成本也会降低。

2.即买即用。

完全省略了A/D卡的的硬件开发过程,很大程度上缩短了产品的开发周期。

3.灵活性好。

量化位数可编程(8位或16位);采样频率可编程(一般声卡的最高采样频率可达200KHz,并且连续可调);采样通道可编程(1通道或2通道);由于可以使用在Windows操作系统下,可以用通用的软件开发工具对其进行开发(如Delphi,VB,VC等)。

当然也有其局限性,那就是声卡一般只能作为PC插卡用在PC机上,很难用微控制器对其进行控制(因为要用到中断和DMA技术),因而很难用在小型的仪器仪表里。

再者由于声卡是专门针对音频信号而设计的,所以它的采样速率不可能很高。

二、编程技术既然声卡本身就是一块很好的A/D卡,硬件部分已经不需操心了,那么最终的问题就是怎样对其编程才能够取得A/D的数据。

事实上,声卡是PC的一种多媒体设备,所以可以用Windows 的MCI(Media Control I nterface)命令来控制声卡。

MCI它提供了一组与设备无关的控制命令,是一种访问多媒体设备的高层次方法。

也正因为它属于一种高层次方法,所以它提供给程序员的灵活性有限,利用MCI命令来控制声卡录音时,程序员不能在录音的过程中访问内存中的采样数据,只有在录音完成后通过访问*.WA V文件才可以得到采样数据,尽管最终还是得到了采样数据,但是这样做一方面嫌其麻烦,更重要的是存取文件需要耗费时间,声卡在采样的过程中有可能会停止下来等待文件操作,造成了采样的断续。

在一些实时性要求比较高的场合(比如波形分析,实时控制等),断续的采样明显是不行的。

Windows的低级波形音频函数提供了对声卡的最大灵活性的操作,它允许在采样过程中随机地访问内存中的每个采样数据,完全可以克服使用MCI命令所遇到的实时性问题。

Windows以动态连接库Mmsystem.dll的形式提供低级波形音频函数,在Mmsystem.dll中总共包括了以下几个有关波形录入的函数:waveInAddBuffer :向声音输入设备发送缓冲区;waveInClose :关闭声音输入设备waveInGetDevCaps:获取声音输入设备性能;waveInGetErrorText:获取声音出错信息文本waveInGetID :获取声音输入设备ID;waveInGetNumDevs:返回声音输入设备数量waveInGetPosition :获取声音设备输入位置;waveInMessage :向声音输入设备发送信息waveInOpen :打开声音输入设备;waveInPrepareHeader:预备声音输入缓冲区waveInReset :停止声音输入设备工作;waveInStart :停止声音输入设备工作waveInStop :停止声音输入;waveInUnprepareHeader :清除预备的声音文件头需要说明的是:不同的编程工具多会含有对这些低级波形音频函数进行说明的头文件(比如在Delphi4.0中,对Mmsystem.dll说明的文件是Mmsystem.pas),所以在不同的编程工具中调用这些函数时有可能会使用不同的名称。

相关主题