肖娟 張志強
【摘要】設計一個基于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—),男,湖北黃石人,大學本科,現就讀于武漢輕工大學金銀湖校區電氣與電子工程學院,主要研究方向:電氣工程及其自動化。