事實(shí)上大部分MCU都可以實(shí)現(xiàn)語音播放
下面是一段音頻數(shù)據(jù)的波形
局部放大圖:
以一定的速度采樣(ADC)這些波形進(jìn)行存儲(chǔ),就是音頻數(shù)據(jù)了,所以播放就是按原來采樣的速率再用DAC輸出對(duì)應(yīng)的數(shù)據(jù)即可。
這里的音頻有兩個(gè)主要的參數(shù),采樣速率和采樣位數(shù)。
采樣速率:指1s中采樣多少個(gè)數(shù)據(jù)點(diǎn),比如1s種采集16000個(gè)點(diǎn),那么采樣率就是16KHz。采樣速率越高,越能抓到頻率較高的聲音,比如CD的采樣率就是44.1KHz,確保人耳能聽到的聲音都會(huì)被抓到。
采樣位數(shù):指音頻幅度最大值與最小值分為了多少階,比如滿幅度是3.3V,如果是8Bit位數(shù),那么每一階就是3.3V/256 = 12.89mv,采樣位數(shù)越高,聲音細(xì)節(jié)越好。所以采樣速率和位數(shù)越高,聲音還原越逼真,但存儲(chǔ)的數(shù)據(jù)量也越大,一首三四分鐘的歌曲,如果不采用編碼按原始波形數(shù)據(jù)存儲(chǔ),數(shù)據(jù)量有好幾十兆大小,這涉及到音頻編碼的問題,這里不展開講了,有興趣的同學(xué)可以找相關(guān)資料。
接下來看怎么播放,最簡單的當(dāng)然是把采樣(ADC)的數(shù)據(jù)按原樣輸出(DAC)了。但我們有些芯片本身不帶有DAC,所以只能用PWM代替DAC,PWM即脈沖寬度調(diào)制。這里只需要把DAC的幅度值轉(zhuǎn)換成PWM的占空比即可,例如16KHz 8Bit的聲音轉(zhuǎn)換成16Khz 256階占空比的PWM。但有一個(gè)問題,如果用16KHz的PWM播放語音,聲音是可以播放,但有一個(gè)16Khz的諧波存在,這個(gè)聲音會(huì)被人耳聽到,所以需要更高頻率的PWM,數(shù)據(jù)還是按照16Khz更新。
我這里使用32KHz的PWM,用16KHz 8Bit PCM格式的音頻數(shù)據(jù),8Bit的數(shù)據(jù)對(duì)應(yīng)一個(gè)Byte,16KHz采樣,1秒種占用存儲(chǔ)空間就是16K Byte,F(xiàn)429有2M Byte的Flash存儲(chǔ)空間,理論上可以存儲(chǔ)2048K/16K = 128秒的音頻。
下面是用NucleoF429實(shí)現(xiàn)音頻播放的具體過程:
一、配置PWM
1、用STM32CubeMx建立工程,配置兩個(gè)定時(shí)器TIM1和TIM2,TIM用于PWM產(chǎn)生,TIM2用于16KHz數(shù)據(jù)更新。
TIM1選擇PWM互補(bǔ)輸出(單通道也可以),將PE8和PE9復(fù)用為PWMN和PWMP。
TIM1在APB2總線上,TIM2在APB1總線上
所以TIM1和TIM2的時(shí)鐘頻率分別為180M和90M,系統(tǒng)時(shí)鐘用HSE輸入的8MHz。
將TIM1設(shè)置為32KHz,即31.25us。8Bit占空比,一個(gè)LSB為31.25us / 256 = 0.1220703125us = 8.192MHz,TIM1 180M / 8.192M = 21.97265625,這里取整數(shù)22。所以實(shí)際的PWM頻率為1/(180 / 22) *256 = 31.289us = 31.96KHz
TIM2 為90MHz,45分頻后為2MHz即0.5us,周期125即62.5us = 16KHz。
NVIC開啟TIM2中斷。生成工程名和目錄后生成Keil工程。
二、播放語音
1、先編譯后,編寫TIM中斷服務(wù)程序。
完成后,開啟TIM2中斷和PWM,(PWM是互補(bǔ)輸出,需要單獨(dú)開啟各個(gè)通道)
用邏輯分析儀測(cè)量輸出波形。
如圖所示,TIM1 PWM為31.96KHz,TIM2為62.5us即16KHz,結(jié)果正確。
接下來處理音頻:
這里使用的音頻是PCM格式,是未進(jìn)行壓縮編碼的原始數(shù)據(jù),可以直接給PWM輸出。
音頻處理的軟件有許多,只要能把格式轉(zhuǎn)為PCM即可,下面是我用Cool Edit這款軟件做的音頻格式轉(zhuǎn)換。
選擇菜單 文件--》批量轉(zhuǎn)換
選擇新的采樣率和采樣位數(shù)。
選擇PCM格式。設(shè)置輸出目錄后運(yùn)行批處理完成轉(zhuǎn)換。
完成后的音頻文件用WinHeX這個(gè)軟件打開。
圖中紅框中的44個(gè)Byte為PCM格式的文件頭信息,后面的的數(shù)據(jù)為音頻數(shù)據(jù),數(shù)據(jù)全選后利用WinHex的可選格式復(fù)制
將數(shù)據(jù)以C數(shù)組的形式導(dǎo)出,在工程目錄下新建.h文件,將復(fù)制的文件粘帖到.H文件并在工程中Include進(jìn)來,定義起始和結(jié)束地址,數(shù)組的大小即為文件結(jié)束地址,數(shù)組用const修飾,可以將數(shù)據(jù)存儲(chǔ)到Flash中。
在TIM2中,以16KHz的速度更新PWM數(shù)據(jù)即可實(shí)現(xiàn)音頻播放。
編譯工程,下載到NucleoF429板子上,在PE8或PE9上接一個(gè)喇叭即可聽到聲音。
以上用的音頻采樣是16K 8Bit,要想提高音質(zhì),提高采樣和Bit數(shù)即可,音量可以用外接三極管或功放放大,音頻數(shù)據(jù)也可以用ADC采集后存儲(chǔ)到SPI Flash后播放,實(shí)現(xiàn)錄音回放。
編輯:lyn
-
PWM
+關(guān)注
關(guān)注
114文章
5190瀏覽量
214101 -
語音播報(bào)
+關(guān)注
關(guān)注
1文章
28瀏覽量
14546
原文標(biāo)題:使用PWM實(shí)現(xiàn)語音播放
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論