您的当前位置:首页正文

基于STM32的实时语音处理系统设计

2022-02-27 来源:客趣旅游网


基于STM32的实时语音处理系统设计

【摘要】设计一个基于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));//等待校准完成

因篇幅问题不能全部显示,请点此查看更多更全内容