日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用PWM实现语音播放

發布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用PWM实现语音播放 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉自ARM中文社區,作者:Xiaoya

鏈接:https://community.arm.com/cn/b/blog/posts/nucleof429-2-pwm

事實上大部分MCU都可以實現語音播放

下面是一段音頻數據的波形

局部放大圖:

以一定的速度采樣(ADC)這些波形進行存儲,就是音頻數據了,所以播放就是按原來采樣的速率再用DAC輸出對應的數據即可。

這里的音頻有兩個主要的參數,采樣速率采樣位數

采樣速率:指1s中采樣多少個數據點,比如1s種采集16000個點,那么采樣率就是16KHz。采樣速率越高,越能抓到頻率較高的聲音,比如CD的采樣率就是44.1KHz,確保人耳能聽到的聲音都會被抓到。

采樣位數:指音頻幅度最大值與最小值分為了多少階,比如滿幅度是3.3V,如果是8Bit位數,那么每一階就是3.3V/256 = 12.89mv,采樣位數越高,聲音細節越好。所以采樣速率和位數越高,聲音還原越逼真,但存儲的數據量也越大,一首三四分鐘的歌曲,如果不采用編碼按原始波形數據存儲,數據量有好幾十兆大小,這涉及到音頻編碼的問題,這里不展開講了,有興趣的同學可以找相關資料。

接下來看怎么播放,最簡單的當然是把采樣(ADC)的數據按原樣輸出(DAC)了。但我們有些芯片本身不帶有DAC,所以只能用PWM代替DAC,PWM即脈沖寬度調制。這里只需要把DAC的幅度值轉換成PWM的占空比即可,例如16KHz 8Bit的聲音轉換成16Khz 256階占空比的PWM。但有一個問題,如果用16KHz的PWM播放語音,聲音是可以播放,但有一個16Khz的諧波存在,這個聲音會被人耳聽到,所以需要更高頻率的PWM,數據還是按照16Khz更新。

我這里使用32KHz的PWM,用16KHz 8Bit PCM格式的音頻數據,8Bit的數據對應一個Byte,16KHz采樣,1秒種占用存儲空間就是16K Byte,F429有2M Byte的Flash存儲空間,理論上可以存儲2048K/16K = 128秒的音頻。

下面是用NucleoF429實現音頻播放的具體過程:

一、配置PWM

1、用STM32CubeMx建立工程,配置兩個定時器TIM1和TIM2,TIM用于PWM產生,TIM2用于16KHz數據更新。

TIM1選擇PWM互補輸出(單通道也可以),將PE8和PE9復用為PWMN和PWMP。

TIM1在APB2總線上,TIM2在APB1總線上

所以TIM1和TIM2的時鐘頻率分別為180M和90M,系統時鐘用HSE輸入的8MHz。

將TIM1設置為32KHz,即31.25us。8Bit占空比,一個LSB為31.25us / 256 = 0.1220703125us = 8.192MHz,TIM1 180M / 8.192M = 21.97265625,這里取整數22。所以實際的PWM頻率為1/(180 / 22)?*256 =? 31.289us = 31.96KHz

TIM2 為90MHz,45分頻后為2MHz即0.5us,周期125即62.5us = 16KHz。

NVIC開啟TIM2中斷。生成工程名和目錄后生成Keil工程。

二、播放語音

1、先編譯后,編寫TIM中斷服務程序。

完成后,開啟TIM2中斷和PWM,(PWM是互補輸出,需要單獨開啟各個通道)

用邏輯分析儀測量輸出波形。

如圖所示,TIM1 PWM為31.96KHz,TIM2為62.5us即16KHz,結果正確。

接下來處理音頻:

這里使用的音頻是PCM格式,是未進行壓縮編碼的原始數據,可以直接給PWM輸出。

音頻處理的軟件有許多,只要能把格式轉為PCM即可,下面是我用Cool Edit這款軟件做的音頻格式轉換。

選擇菜單?文件-->批量轉換

選擇新的采樣率和采樣位數。

選擇PCM格式。設置輸出目錄后運行批處理完成轉換。

完成后的音頻文件用WinHeX這個軟件打開。

圖中紅框中的44個Byte為PCM格式的文件頭信息,后面的的數據為音頻數據,數據全選后利用WinHex的可選格式復制

將數據以C數組的形式導出,在工程目錄下新建.h文件,將復制的文件粘帖到.H文件并在工程中Include進來,定義起始和結束地址,數組的大小即為文件結束地址,數組用const修飾,可以將數據存儲到Flash中。

在TIM2中,以16KHz的速度更新PWM數據即可實現音頻播放。

編譯工程,下載到NucleoF429板子上,在PE8或PE9上接一個喇叭即可聽到聲音。

以上用的音頻采樣是16K 8Bit,要想提高音質,提高采樣和Bit數即可,音量可以用外接三極管或功放放大,音頻數據也可以用ADC采集后存儲到SPI Flash后播放,實現錄音回放。

為了方便閱讀,附件中包含了此文的PDF文檔,Source Code也在附件中,可以直接下載到Nucleo運行。

公眾號后臺回復關鍵詞:PWM語音,即可獲取源碼下載鏈接。


推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈

關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。

歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記于心~

總結

以上是生活随笔為你收集整理的使用PWM实现语音播放的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。