【轉載】STM32F103C8T6 FTT音樂頻譜分析與顯示
製作過程:
1.準備材料:
stm32f103核心板 1塊
OLED12864顯示屏 1塊(SPI介面)
聲音檢測感測器 1塊 (咪頭+放大電路 可以網上買現成的模組,也可根據後文提供的原理圖自己做)
2.硬體連線:
(1)OLED連線:
OLED_SCLK ———— PB7
OLED_SDIN ———— PB6
OLED_RST ———— PB5
OLED_RS ———— PB4
(2)聲音檢測感測器連線:
直接將模組的輸出接到微控制器的PA0即可。
OK硬體連線完成!就這麼簡單!
3.程式下載
接下來將程式下載到微控制器即可,音樂頻譜就完成了!(別告訴我你連下載程式都不會 滑稽)
程式燒錄檔案 連結:https://pan.baidu.com/s/1EjKPvBFbTmYzzh6fSn0U5A 密碼:o6uu
ps:以上就是簡單的音樂頻譜製作過程,下面是較為詳細的製作過程,提供原始碼和原理圖,有興趣的同志們可以看看。
/************************分***********************************割***************************************線********************************/
整體思路:
1.使用ADC採集音訊訊號
2.使用官方提供的FFT函式對採集到的訊號進行處理
3.量化顯示
前言:
在人耳能聽到的頻率範圍(20-20KHz)中,各類樂器和人聲的頻率大部分在5KHz以下。主要是在0-5KHz這段頻率的頻譜變化明顯一些,所以觀賞性更好。故我們設定取樣頻率為10KHz(根據取樣定理,取樣頻率要大於訊號最大頻率的兩倍,才能保證不失真)來採集這0-5KHz的音訊訊號。顯示是使用的OLED12864屏,解析度為128*64,在x軸方向上最多顯示128個點,所以我們把取樣點數設定為256個點,因為FFT計算出來的資料是對稱的,我們只取一半,128個點剛剛好。
取樣頻率:Fs = 10KHz
樣本數量:NPT = 256
這兩個引數是FFT計算時候要用到的。
深入研究FFT可參考這位大大的部落格(強烈推薦):
(一)音訊訊號的採集
(1)訊號來源於咪頭採集的聲音訊號,以下是原理圖:
電路使用LM358搭建而成,採用單電源5V直流供電。由於微控制器的ADC不能採集到負值,所以我們需要把訊號加上了1/2Vcc的直流偏置,50倍增益可調。
這裡如果考慮多一些,應當加一個低通濾波,去除高頻訊號的影響,防止出現頻譜疊加,影響觀賞效果。我們簡單製作,就不考慮這個了。
下圖是我自己做的咪頭放大電路,原理圖就是上面的。
(2)使用stm32的ADC去採集咪頭電路輸出的訊號
因為我們的取樣頻率要固定在10KHz,所以這裡使用定時器去觸發ADC轉換,再使用DMA搬運,最後使用stm32cubemx去配置這些硬體,生成基礎程式碼即可。
1.adc配置
2.定時器配置
3.系統時鐘樹
到此基礎配置完成,生成程式碼即可。這裡簡單的說一下流程,這裡配置的定時器觸發ADC轉換是硬體自動觸發,不會進入中斷,ADC轉換完直接由DMA傳輸到記憶體,只有等256點全部傳輸完才會進入到DMA的中斷,這樣保證了每個取樣點的間隔時間都是一致的。
關於stm32cubemx這個工具,作為開發來說十分便捷,大大縮短開發週期,但是想學習32的朋友來說,這個就不太理想了,學習還是建議使用標註庫和暫存器。這軟體配置生成的程式碼是用的hal庫,具體使用教程可以參考學習“硬石科技”的相關教程。
(二)訊號處理
(1)移植官方DSP庫
(2)填充資料和計算幅值
(三)量化顯示
(1)簡單的GUI
這裡移植一個簡單的GUI,方便繪製各種現實效果。
(2)顯示
顯示過程,就是把我們FFT計算出來的幅值量化顯示到我們螢幕上。比如我們在填充資料的時候是填充的ADC採集到的電壓對應的數字量,FFT計算出來後經過取模,得到一個該頻率點對應幅值的一個數字量。我們只需要對這個數字量進行處理即可,這裡處理方式每個人方法都有所不同,這裡我提供的可供參考。
至此基於stm32f103的FFT音樂頻譜製作流程就分享到這裡,小弟才疏學淺內容中有問題的地方還望斧正。歡迎轉載,請註明出處,謝謝大家。