肖娟 张志强
【摘要】设计一个基于STM32的实时语音处理系统。硬件模块通过放大、除杂完成将语音信号转换成处理器能够进行高效处理的有效数字信号,软件部分主要涉及到TIM配合ADC采样数据并通过DMA传输,SRAM存储语音信号通过FSMC与STM32连通,按键控制输出选择模式,DAC经过DMA将信号传输。
【关键词】实时语音;STM32;数字信号;存储
引言
声音信号在人类的社会生活中普遍存在,随着科学技术的不断发展,语音处理系统在人们的生活中应用越来越广泛,处理方法也越来越多样化。
设计一个基于STM32F103ZET6的实时语音处理系统。硬件模块通过放大、除杂完成将语音信号转换成处理器能够进行高效处理的有效数字信号,软件部分主要涉及到TIM配合ADC采样数据并通过DMA传输,SRAM存储语音信号通过FSMC与STM32连通,按键控制输出选择模式,DAC经过DMA将信号传输。
1.系统方案设计
本系统分为三大模块:信号采集、信号处理、信号输出。信号采集模块包括声电转换、信号滤波与放大模块;信号处理模块包括模数转换、信号存储、按键控制模块;信号输出模块包括数模转换、功率放大模块。系统设计框图如图1所示。
图1 系统总体设计框图
2.硬件设计
本语音处理系统的硬件模块包括:语音输入模块、音频放大模块、滤波模块和功率放大模块。
2.1 语音输入模块
驻极体的输出线有两根:一般用蓝色塑线表示源级S,用红色塑料线和连接金属外壳的屏蔽线表示漏极D。语音输入电路图如图2所示。
图2 语音输入电路图 图3 音频放大电路图
2.2 音频放大模块
本设计的音频放大模块选用LM386。 音频放大的电路原理图如图3所示,本设计中由于驻极体出来的电压是毫伏级别,单片机处理的最高电压是3.3V,可通过电位器来调节从驻极体输入过来的电压值,放大倍数大致设为约为38倍,计算方法如:
2.3 除杂滤波模块
本设计采集的声音频率范围是200Hz到3000Hz,采用低通滤波和高通滤波电路来滤除杂波信号,为了更好的滤掉3KHz以外的高频保留3KHz以内的低频信号,采用二阶有源低通滤波电路。为使信号在低频段以更快速率下降,采用一阶有源高通滤波电路,滤波电路如图4所示。
图4 滤波模块电路图 图5 抬压电路图
2.4 抬压电路
声音信号经过放大滤波后变为纯净的信号送至控制芯片进行A/D转换,但是开发板只能接受正的电压信号,负电压信号会对开发板造成不可逆的影响,同时为了使声音实现不失真的储存,需将声音信号中的幅信号抬高至零参考电压以上才送入处理器处理,电路原理图如图5所示。
3.软件设计
软件设计部分包括以下几个模块:信号的采集与转换、语音信号的存储、按键对存储语音的控制。其中信号的采集是指控制器将经过放大滤波后的模拟信号转换成数字信号;语音信号的存储是指将通过端口采集到的语音数字信号存储到SRAM中,需要播放的时候输出播放;涉及到CPU的内部资源的存储、ADC、TIMER、DMA、FSMC等模块。
3.1 初始化设置
STM32上电复位结束后,首先要进行系统的初始化。
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1|
RCC_AHBPeriph_DMA2|RCC_AHBPeriph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|
RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|
|RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6|RCC_APB1Periph_DAC|RCC_APB1Periph_TIM3|RCC_APB2Periph_AFIO,ENABLE);
}
3.2 A/D软件设计
为了频段获得优良的音频输出,A/D的采样频率设置为40KHz,使用定时器进行配合输出,当计数时间到了产生中断,从而让ADC采集一次数据。主要程序如下:
void ADC_Config(void)
{
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode=ENABLE;
//打開扫描模式
.......
ADC_Cmd(ADC1, ENABLE);//开启ADC1
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1)); //等待重新校准完成
ADC_StartCalibration(ADC1);//开始校准
while(ADC_GetCalibrationStatus(ADC1));//等待校准完成
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
3.3 定时器软件设计
定时器控制准确的时间来产生中断控制DMA将ADC采集到的数据进行相应的处理。本设计选用的是通用定时器TIM3,它是16位的计数器可向上、向下、向上/向下自动装载。具有16位可编程预分频器,分频系数为1~65536之间任意数值。当计数器向上或向下溢出时就会产生DMA请求。
void TIM3_Configuration(void)
{
TIM_TimeBaseStructure.TIM_Period = 900;//自动重装载的值
TIM_TimeBaseStructure.TIM_Prescaler=0; //预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision= 0x0;//不设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_Cmd(TIM3,ENABLE);//定时使能
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //定时中断使能
}
3.4 DAC软件设计
DAC转换可以由某外部事件触发,本设计选择TIM6的TRGO事件。每次DAC接口侦测到来自选中的定时器TRGO输出,则最近存放在数据寄存器DAC_DHRx中的数据就会被传送到数据输出寄存器DAC_DORx中。
void DAC_Config(void)
{
TIM_PrescalerConfig(TIM6, 0x0, TIM_PSCReloadMode_Update);//预分频值为1
TIM_SetAutoreload(TIM6,900);//自动重装载值900
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
//使用更新时间触发
DAC_InitStructure.DAC_Trigger= DAC_Trigger_T6_TRGO;
//DAC触发方式为T6触发
DAC_InitStructure.DAC_WaveGeneration=DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;//不使用输出缓存
DAC_Init(DAC_Channel_1, &DAC_InitStructure);//初始化DAC
}
3.5 FSMC模块设计
FSMC(Flexible Static Memory Controller,可变静态存储控制器)是STM32系列采用的一種新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势,根据系统的应用需要,通过设置相应的时序,数据位数等,可以很方便地与存储器传输。具体程序代码略。
3.6 按键控制设计
本设计中使用SW1、SW2、SW3三个按键进行控制。按下SW1时开始将语音信号存储至SRAM中;按下SW2时播放存储在SRAM中的语音信号;按下SW3时进行实时语音播放。程序有几个分支需要进行判断。第一种情况是从存储器读出标志位未置1,此时只进行实时语音播放。第二种情况按下存储按键时,语音依然播放,并且通过函数FSMC_SRAM_WriteBuffer(Escalator8bit,write_read_addr++,1);进行存储。第三种情况按下播放按键时通过函数FSMC_SRAM_ReadBuffer(Escalator8bit, write_read_addr++,1);将存储在SRAM中的数据读出。第四种情况存储超过范围时将不再进行存储。第五种情况播放超出范围时继续重首地址播放。
具体程序代码略。
4.结语
设计一个基于STM32F103ZET6的实时语音处理系统,该系统不仅能够达到对语音信号的采集与不失真的输出,同时还可以对语音信号进行一定量的存储。结果表明,达到了预期的设计要求,并用于实际项目中。
参考文献
[1]易克初等.语音信号处理[M].北京:国防工业出版社,2000.
[2]蔡莲红等.现代语音技术基础与应用[M].北京:清华大学出版社,2003.
[3]齐子元等.一种实时语音信号采集处理系统的设计与实现[J].计算机工程与应用,2005,9:105-107.
[4]吴明晖等.基于ARM的嵌入式系统开发与应用[M].北京:人民邮电出版社,2004.
[5]谭浩强等.C语言程序设计[M].北京:清华大学出版社,2000.
[6]Brian W.Kernighan.The C Programming Language[M].北京:机械工业出版社,2004.
[7]Andrew Koenig.Expert C Programming[M].北京:人民邮电出版社,2008.
作者简介:
肖娟(1975—),女,湖南常宁人,硕士,讲师,现供职于武汉轻工大学金银湖校区电气与电子工程学院,主要研究方向:信息传输与处理。
张志强(1992—),男,湖北黄石人,大学本科,现就读于武汉轻工大学金银湖校区电气与电子工程学院,主要研究方向:电气工程及其自动化。