基于凌阳单片机的语音信号实时采集
日期:2007-4-28摘要:语音信号采集是语音信号处理的基础。本文利用凌阳公司16位单片机——spce061a所具有的数字信号处理(dsp)功能及其所提供的音频压缩函数库来实现语音信号的实时采样与压缩;通过rs232接口,将采集到的语音信号实时上传到pc机中存储。
串口通信 语音采样 语音压缩
引言
随着单片机集成化程度的不断提高,现代单片机已经具备了数字信号处理功能,使语音信号处理用单片机实现成为可能。台湾凌阳科技公司(sunplus)推出的一款spce061a就是这样的产品。spce061a是以μ"nsp tm16位微控制器及信号处理器芯片为内核的16位单片机,采用模块式集成结构,片内集成了2kb ram、32kb flash、adc、dac、并行i/o等,特别适合语音信号处理。本文介绍如何实现用spce061a单片机采集语音信号,并传送到pc机中的方法。
1 硬件系统结构
1.1 spce061a结构
spce061a的内部结构如图1,其特点如下:
16位μ"nsp tm微控制器;
工作电压:vdd为2.6~3.6v(cpu),vddh为vdd~5.5v(i/o);
cpu时钟为0.32~49.152mhz;
内置存储器:sram为2kb,内存flash为32kb;
可编程音频处理;
2个16位可编程定时器/计数器;
7通道10位adc(内置麦克风放大和自动增益控制功能);
2个10位dac;
32路可编程通用输入输出端口;
串行输入输出接口;
低电压监测/低电压复位功能;
14个中断源可来自定时器、外部时钟输入、键唤醒等;
内置在线仿真电路ice。
1.2 spce061a开发方法
spce061a的开发是通过在线调试器probe实现的,如图2所示。它利用了spce061a内置的在线仿真电路ice和凌阳公司的在线串行编程技术。如果读者想要使用该芯片及开发系统,可上网www.unsp.com.cn查询,并寻求大学计划的免费支持。
1.3 语音采集的硬件电路
语音采集的硬件电路如图3所示。mic采用驻极体电容话筒,这种话筒具有灵敏度高、无方向性、重量轻、体积小、频率响应宽、保真度好等优点。
与pc机的串行通信用spce061a的uart接口,用max232芯片进行电平转换,即可实现rs232通信。
2 软件设计与实现
2.1 语音信号的采集压缩与数据传输
(1)语音信号的采集压缩
语音信号处理的基础是对语音信号进行数字化,并采样存储。srce061a内置专门用于语音信号采集的自动增益控制放大器(agc)的麦克风输入通道(mic_in)。语音信号经麦克转换成电信号,由隔离电容隔掉直流成分,然后输入至内部前置放大器。spce061a内部自动增益控制电路agc能随时跟踪、监视前置放大器输出的音频信号电平,当输入信号增器时,agc电路自动减小放大器的增益;当输入信号减小时,agc电路自动增大放大器的增益,以便使进入a/d的信号保持在最佳电平,又可使谐波减至最小。
adc初始化程序如下:
int >r1=0x0030;
[p_timera_ctrl]=r1;
//时钟频率为clka的fosc/2
r1=0xfa00;
[p_timera_data]=r1;
//采样率为16khz
r1=0x003d;
[p_adc_ctrl]=r1; //设置agc功能
r1=0x00a8;
[p_dac_ctrl]=r1; //采用自动方式且通过mic_in通道输入,通过定时器a的溢出锁存数据,adc为自动方式
r1=0x1000;
[p_int_ctrl]=r1; //开中断irq1_tm
int irq;
图3 语音采集的硬件连接图
采样后的数字语音信号数据量非常大,且由于语音信号采样点幅度分布的非均匀性和样本间的相关性等原因,使语音信号中含有大量的冗余信息。因此,在实际应用中采用各种信源编码技术来消除语音信号的冗余度。语音编码方法主要有波形编码、参数编码和混合编码。
波形编码的基本原理是以波形逼近为原则,在时域上把幅度样本分层量化并用代码表示;特点是语音质量高、抗噪性强编码率高,适于语音及高保真音乐。
参数编码是基于某种语音产生模型,在编程端分析出该模型参数选择适当的方式进行编码;特点是语音质量差、抗噪抗弱和编码率低。
混合编码综合了波形和参数编码之优点。
凌阳spce061a提供了压缩算法库——sacmlib(见表1),其处理的语音信号范围是200hz~3.4khz的电话语音,并将a/d、编/解码、存储及d/a做成相应的模块,对于每个模块都有其应用程序接口api。
表1 sacm-lib库中模块及其算法
模块名称 | 压缩算法 | 采样率/khz | 语音压缩编码率/kb/s | 用 途 |
sacm_a2000 | 子带编码 | 16 | 16、20、24 | 播放语音及高保真音乐 |
sacm_s480/s720 | celp混合编码 | 16 | 4.8、7.2 | 播音 |
sacm_s240 | 参数编码 | 24 | 2.4 | 播音 |
sacm_ms01 | fm音乐合成 | 16 | 16、20、24 | 音乐合成 |
sacm_dvr | 子带编码 | 16 | 16kb/s的传输率,8ksps的采样率 | adc信道录音和dac放音 |
(2)语音数据的传输
spce061a的通用异步串口(uart)提供了一个8位全双工标准接口,用于完成spce061a与外设之间的串行通信。借助于iob口的特殊功能和uart irq中断,可以同时完成uart接口的接收与发送数据的过程。根据应用需求,把uart设置为中断方式接收数据,以查询方式发送数据。
uart初始化程序inituart()见网络补充版(http://www.dpj.com.cn)。
2.2 上位机控制和存储模块
目前,mircosoft公司的vc++6.0是基于windows程序设计的主流开发工具之一。vc++不仅秉承了c++简便、灵活及面向对象等优点,而且提供了功能强大的mfc类库,并能自动生成应用程序框架,提供标准化的程序结构和用户接口。特别需要指出的是,为了今后调用低层的音频处理api函数,对由下位上传的音频数据进一步进行语音识别方面的处理,我们使用vc来编写上位机的控制及存储程序。
在实验室和工业应用中,rs232串口是常用的计算机与外部串行设备(单片机)之间的数据传输通道,由于串行通信简单易用,所以应用广泛。通常在vc++中有三种方法可以实现串行通信:
使用vc++的标准通信函数_inp和_outp来实现串口通信;
把串口看成是一个特殊的设备文件,使用有关文件处理的api函数来实现串口通信;
使用activex的串行通信控件mscomm来实现串口通信。
对于本实例来说,主要考虑的因素是实时语音数据存取,以及位机与下位机的配合。因此,采用了串行通信mscomm控件方法来实现串口通信。另外,可以采用二进制流文件cfile类来存储声音文件。具体步骤见网络补充版。
结语
通过以上实例录制的语音数据,可以从pc机下载到spce061a中(或者作为资源文件放入工程中),使用sacm_a2000模块的函数播放验证,效果能够满足进一步语音信号处理需要。
用凌阳spce061a处理语音信号有如下独特之处:
硬件电路简单,因spce061a是一款专门为语音信号处理设计的,麦克和喇叭可直接接入,用户不必外接放大电路等;
软件编程容易,有相应的api函数,可直接调用。
用ice和图形界面编译软件,调试方便。