肖娟 張志強(qiáng)
【摘要】設(shè)計(jì)一個(gè)基于STM32的實(shí)時(shí)語音處理系統(tǒng)。硬件模塊通過放大、除雜完成將語音信號(hào)轉(zhuǎn)換成處理器能夠進(jìn)行高效處理的有效數(shù)字信號(hào),軟件部分主要涉及到TIM配合ADC采樣數(shù)據(jù)并通過DMA傳輸,SRAM存儲(chǔ)語音信號(hào)通過FSMC與STM32連通,按鍵控制輸出選擇模式,DAC經(jīng)過DMA將信號(hào)傳輸。
【關(guān)鍵詞】實(shí)時(shí)語音;STM32;數(shù)字信號(hào);存儲(chǔ)
引言
聲音信號(hào)在人類的社會(huì)生活中普遍存在,隨著科學(xué)技術(shù)的不斷發(fā)展,語音處理系統(tǒng)在人們的生活中應(yīng)用越來越廣泛,處理方法也越來越多樣化。
設(shè)計(jì)一個(gè)基于STM32F103ZET6的實(shí)時(shí)語音處理系統(tǒng)。硬件模塊通過放大、除雜完成將語音信號(hào)轉(zhuǎn)換成處理器能夠進(jìn)行高效處理的有效數(shù)字信號(hào),軟件部分主要涉及到TIM配合ADC采樣數(shù)據(jù)并通過DMA傳輸,SRAM存儲(chǔ)語音信號(hào)通過FSMC與STM32連通,按鍵控制輸出選擇模式,DAC經(jīng)過DMA將信號(hào)傳輸。
1.系統(tǒng)方案設(shè)計(jì)
本系統(tǒng)分為三大模塊:信號(hào)采集、信號(hào)處理、信號(hào)輸出。信號(hào)采集模塊包括聲電轉(zhuǎn)換、信號(hào)濾波與放大模塊;信號(hào)處理模塊包括模數(shù)轉(zhuǎn)換、信號(hào)存儲(chǔ)、按鍵控制模塊;信號(hào)輸出模塊包括數(shù)模轉(zhuǎn)換、功率放大模塊。系統(tǒng)設(shè)計(jì)框圖如圖1所示。
圖1 系統(tǒng)總體設(shè)計(jì)框圖
2.硬件設(shè)計(jì)
本語音處理系統(tǒng)的硬件模塊包括:語音輸入模塊、音頻放大模塊、濾波模塊和功率放大模塊。
2.1 語音輸入模塊
駐極體的輸出線有兩根:一般用藍(lán)色塑線表示源級(jí)S,用紅色塑料線和連接金屬外殼的屏蔽線表示漏極D。語音輸入電路圖如圖2所示。
圖2 語音輸入電路圖 ? ? ? ? ? ? 圖3 音頻放大電路圖
2.2 音頻放大模塊
本設(shè)計(jì)的音頻放大模塊選用LM386。 音頻放大的電路原理圖如圖3所示,本設(shè)計(jì)中由于駐極體出來的電壓是毫伏級(jí)別,單片機(jī)處理的最高電壓是3.3V,可通過電位器來調(diào)節(jié)從駐極體輸入過來的電壓值,放大倍數(shù)大致設(shè)為約為38倍,計(jì)算方法如:
2.3 除雜濾波模塊
本設(shè)計(jì)采集的聲音頻率范圍是200Hz到3000Hz,采用低通濾波和高通濾波電路來濾除雜波信號(hào),為了更好的濾掉3KHz以外的高頻保留3KHz以內(nèi)的低頻信號(hào),采用二階有源低通濾波電路。為使信號(hào)在低頻段以更快速率下降,采用一階有源高通濾波電路,濾波電路如圖4所示。
圖4 濾波模塊電路圖 ? ? ? ? ?圖5 抬壓電路圖
2.4 抬壓電路
聲音信號(hào)經(jīng)過放大濾波后變?yōu)榧儍舻男盘?hào)送至控制芯片進(jìn)行A/D轉(zhuǎn)換,但是開發(fā)板只能接受正的電壓信號(hào),負(fù)電壓信號(hào)會(huì)對(duì)開發(fā)板造成不可逆的影響,同時(shí)為了使聲音實(shí)現(xiàn)不失真的儲(chǔ)存,需將聲音信號(hào)中的幅信號(hào)抬高至零參考電壓以上才送入處理器處理,電路原理圖如圖5所示。
3.軟件設(shè)計(jì)
軟件設(shè)計(jì)部分包括以下幾個(gè)模塊:信號(hào)的采集與轉(zhuǎn)換、語音信號(hào)的存儲(chǔ)、按鍵對(duì)存儲(chǔ)語音的控制。其中信號(hào)的采集是指控制器將經(jīng)過放大濾波后的模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào);語音信號(hào)的存儲(chǔ)是指將通過端口采集到的語音數(shù)字信號(hào)存儲(chǔ)到SRAM中,需要播放的時(shí)候輸出播放;涉及到CPU的內(nèi)部資源的存儲(chǔ)、ADC、TIMER、DMA、FSMC等模塊。
3.1 初始化設(shè)置
STM32上電復(fù)位結(jié)束后,首先要進(jìn)行系統(tǒng)的初始化。
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軟件設(shè)計(jì)
為了頻段獲得優(yōu)良的音頻輸出,A/D的采樣頻率設(shè)置為40KHz,使用定時(shí)器進(jìn)行配合輸出,當(dāng)計(jì)數(shù)時(shí)間到了產(chǎn)生中斷,從而讓ADC采集一次數(shù)據(jù)。主要程序如下:
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)); //等待重新校準(zhǔn)完成
ADC_StartCalibration(ADC1);//開始校準(zhǔn)
while(ADC_GetCalibrationStatus(ADC1));//等待校準(zhǔn)完成
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
3.3 定時(shí)器軟件設(shè)計(jì)
定時(shí)器控制準(zhǔn)確的時(shí)間來產(chǎn)生中斷控制DMA將ADC采集到的數(shù)據(jù)進(jìn)行相應(yīng)的處理。本設(shè)計(jì)選用的是通用定時(shí)器TIM3,它是16位的計(jì)數(shù)器可向上、向下、向上/向下自動(dòng)裝載。具有16位可編程預(yù)分頻器,分頻系數(shù)為1~65536之間任意數(shù)值。當(dāng)計(jì)數(shù)器向上或向下溢出時(shí)就會(huì)產(chǎn)生DMA請求。
void TIM3_Configuration(void)
{
TIM_TimeBaseStructure.TIM_Period = 900;//自動(dòng)重裝載的值
TIM_TimeBaseStructure.TIM_Prescaler=0; ? ? ? ?//預(yù)分頻系數(shù)
TIM_TimeBaseStructure.TIM_ClockDivision= 0x0;//不設(shè)置時(shí)鐘分割
TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_Cmd(TIM3,ENABLE);//定時(shí)使能
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); ?//定時(shí)中斷使能
}
3.4 DAC軟件設(shè)計(jì)
DAC轉(zhuǎn)換可以由某外部事件觸發(fā),本設(shè)計(jì)選擇TIM6的TRGO事件。每次DAC接口偵測到來自選中的定時(shí)器TRGO輸出,則最近存放在數(shù)據(jù)寄存器DAC_DHRx中的數(shù)據(jù)就會(huì)被傳送到數(shù)據(jù)輸出寄存器DAC_DORx中。
void DAC_Config(void)
{
TIM_PrescalerConfig(TIM6, 0x0, TIM_PSCReloadMode_Update);//預(yù)分頻值為1
TIM_SetAutoreload(TIM6,900);//自動(dòng)重裝載值900
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
//使用更新時(shí)間觸發(fā)
DAC_InitStructure.DAC_Trigger= DAC_Trigger_T6_TRGO;
//DAC觸發(fā)方式為T6觸發(fā)
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模塊設(shè)計(jì)
FSMC(Flexible Static Memory Controller,可變靜態(tài)存儲(chǔ)控制器)是STM32系列采用的一種新型的存儲(chǔ)器擴(kuò)展技術(shù)。在外部存儲(chǔ)器擴(kuò)展方面具有獨(dú)特的優(yōu)勢,根據(jù)系統(tǒng)的應(yīng)用需要,通過設(shè)置相應(yīng)的時(shí)序,數(shù)據(jù)位數(shù)等,可以很方便地與存儲(chǔ)器傳輸。具體程序代碼略。
3.6 按鍵控制設(shè)計(jì)
本設(shè)計(jì)中使用SW1、SW2、SW3三個(gè)按鍵進(jìn)行控制。按下SW1時(shí)開始將語音信號(hào)存儲(chǔ)至SRAM中;按下SW2時(shí)播放存儲(chǔ)在SRAM中的語音信號(hào);按下SW3時(shí)進(jìn)行實(shí)時(shí)語音播放。程序有幾個(gè)分支需要進(jìn)行判斷。第一種情況是從存儲(chǔ)器讀出標(biāo)志位未置1,此時(shí)只進(jìn)行實(shí)時(shí)語音播放。第二種情況按下存儲(chǔ)按鍵時(shí),語音依然播放,并且通過函數(shù)FSMC_SRAM_WriteBuffer(Escalator8bit,write_read_addr++,1);進(jìn)行存儲(chǔ)。第三種情況按下播放按鍵時(shí)通過函數(shù)FSMC_SRAM_ReadBuffer(Escalator8bit, write_read_addr++,1);將存儲(chǔ)在SRAM中的數(shù)據(jù)讀出。第四種情況存儲(chǔ)超過范圍時(shí)將不再進(jìn)行存儲(chǔ)。第五種情況播放超出范圍時(shí)繼續(xù)重首地址播放。
具體程序代碼略。
4.結(jié)語
設(shè)計(jì)一個(gè)基于STM32F103ZET6的實(shí)時(shí)語音處理系統(tǒng),該系統(tǒng)不僅能夠達(dá)到對(duì)語音信號(hào)的采集與不失真的輸出,同時(shí)還可以對(duì)語音信號(hào)進(jìn)行一定量的存儲(chǔ)。結(jié)果表明,達(dá)到了預(yù)期的設(shè)計(jì)要求,并用于實(shí)際項(xiàng)目中。
參考文獻(xiàn)
[1]易克初等.語音信號(hào)處理[M].北京:國防工業(yè)出版社,2000.
[2]蔡蓮紅等.現(xiàn)代語音技術(shù)基礎(chǔ)與應(yīng)用[M].北京:清華大學(xué)出版社,2003.
[3]齊子元等.一種實(shí)時(shí)語音信號(hào)采集處理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2005,9:105-107.
[4]吳明暉等.基于ARM的嵌入式系統(tǒng)開發(fā)與應(yīng)用[M].北京:人民郵電出版社,2004.
[5]譚浩強(qiáng)等.C語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2000.
[6]Brian W.Kernighan.The C Programming Language[M].北京:機(jī)械工業(yè)出版社,2004.
[7]Andrew Koenig.Expert C Programming[M].北京:人民郵電出版社,2008.
作者簡介:
肖娟(1975—),女,湖南常寧人,碩士,講師,現(xiàn)供職于武漢輕工大學(xué)金銀湖校區(qū)電氣與電子工程學(xué)院,主要研究方向:信息傳輸與處理。
張志強(qiáng)(1992—),男,湖北黃石人,大學(xué)本科,現(xiàn)就讀于武漢輕工大學(xué)金銀湖校區(qū)電氣與電子工程學(xué)院,主要研究方向:電氣工程及其自動(dòng)化。