謝志平
(廣東省技師學院,廣東 惠州 516100)
任何周期函數,都可以看作是不同振幅,不同相位正弦波的疊加。利用C語言編程的FFT算法[2]可以把對波形采樣回來的數據進行轉換,一個模擬信號,假設對其以某個采樣率采樣了N個數據,經過FFT換算以后,就可以獲得這段波形里面含有的不同頻率的特征,這就是頻譜。
對于音頻信號的采集轉換,傳統(tǒng)的51單片機的ADC轉換速度雖然可以滿足要求,C語言編程的FFT算法比較容易編寫,但帶來的缺點就是執(zhí)行效率低。而且同時要滿足ADC轉換、FFT運算及LED屏幕的數據刷新顯示和其他附加功能時會非常困難了。使用 STM32F103單片機官方的 DSP庫[2],采用里面的256位FFT變換,用匯編語言編寫,代碼執(zhí)行效率高,使用時只要調用接口函數即可,能同時滿足多種任務運行功能。
整個系統(tǒng)分為音頻采集與信號處理,紅外按鍵和顯示輸出部分,系統(tǒng)結構如圖1所示。

圖1 系統(tǒng)結構框圖Fig. 1 System structure diagram
通過選擇開關可以對外置麥克風和外部輸入音源進行采集放大。外部話筒信號采集到聲音后,經過三極管放大后,經過選擇開關可進入集成運放進行 10倍的反相放大。經過放大后輸入到單片機的A/D轉換端口。外部音頻輸入J1同樣可以經過選擇開關接入到10倍的反相放大電路進行放大。該反相放大采用的是軌至軌運算放大器[3]GS8551。該芯片是一種微功率,低零點漂移的CMOS運算放大器,放大器有著1.8 MHz的帶寬,軌對軌輸入和輸出,單電源提電從1.8 V到5.5 V。靜態(tài)電流低至180 μA,電路見圖2。

圖2 音頻選擇與音頻處理電路Fig.2 Audio selection and audio processing circuits
外部輸入電源經過穩(wěn)壓芯片進行穩(wěn)壓,得到3.3 V電壓給單片機、紅外接收頭、ISP程序下載供電。采集到的音頻信號通過PA0口輸入到單片機內部進行轉換。一體化紅外接收頭采用普通的通用接收頭,用來接收來自遙控器的信號,方便對頻譜顯示效果進行切換。全彩點陣屏采用的是HUB-75B接口的室內全彩屏。

圖3 單片機外圍與顯示屏接口電路Fig.3 MCU peripheral interface with the display circuit
該類型顯示屏接口定義如下:

表1 全彩HUB-75B接口定義Tab.1 Full color hub-75b interface definition
如果要進行256點的轉換。首先使用定時器進行定時(設置40 KHZ采樣率,最高能捕捉20 KHZ的信號),設置每次定時器溢出的時候自動觸發(fā)一次ADC轉換。轉換完成后的數據由 DMA[4]自動搬運到內存指定位置,這個采樣過程無需CPU干預,提高了效率。在完成256次頻率的轉換后,等256點全部傳輸完才會進入到 DMA的中斷,這樣保證了每個采樣點的間隔時間一致。在中斷里面將處理完成標志置為1后再繼續(xù)轉換。
每次轉換完成的數據用 DSP進行 FFT換算,DSP換算成的FFT輸出結果相當于一個復數,將該復數進行求模/2處理后,就代表了該頻率點對應上的幅度值了,然后分別送入兩個數組,一個用來做柱形效果,一個用來做漂浮點效果。
單片機通過ADC接口讀取音頻信號的電壓值,音樂信號的頻率范圍為 20-20 KHz。由采樣定理:為采樣頻率,為頻率分辨率,N為采樣點,所以一般情況給定了和F0時也就限制了N范圍:,信號的最高頻率為20 KHz。則FS= 4 0 KHz。為如果對信號進行128點的采樣,分辯率為312 Hz。如果采樣點改為256,則F0= 1 56 Hz。即設置定時器溢出為0.025 ms,采樣點N通過宏定義即可在 DSP庫函數里 cr4_fft_256_stm32(FFT_OUT,F(xiàn)FT_IN,NPT)來實現(xiàn)。使用stm32cubemx[5]去配置這些硬件,生成基礎代碼即可完成相應的功能。

圖4 ADC轉換流程圖Fig.4 ADC conversion flow chart
ADC采集到的數據產生中斷后,就可以直接轉換了,通過單片機內部的DSP進行運算處理,運行DSP庫里的FFT算法函數[6]即可完成轉換。DSP官方庫里的FFT算法有三個函數庫分別為:
cr4_fft_64_stm32.s/cr4_fft_256_stm32.s/cr4_fft_1024_stm32.s。
以256點為例,F(xiàn)FT算法的過程為:首先STM32庫中給出的FFT函數格式如下:
Void cr4_fft_1024_stm32(FFT_OUT, FFT_IN, NPT);
其中,NPT為采樣點,通過修改宏定義來修改NPT代表的值,此處為256;FFT_OUT和FFT_IN均是長度為NPT的32位長整型的數組,高16位為實部,低 16位為虛部,F(xiàn)FT_OUT [NPT]用于保存FFT之后的輸出值;FFT_IN[NPT]用于保存輸入的數值。
對原始數據進行FFT之后,需要對輸出數據進行處理。設置一個循環(huán)語句,將要采集的頻率范圍包含在里面,去掉直流分量。將FFT_OUT [NPT]32位的值分別賦予兩個變量,一個是實部,一個是虛部。再將其求均方根后除以2就是該頻率點對應的信號幅度值。
得到了信號的幅度值后,再將這個幅度值進行轉換成LED適合的顯示方式就形成了頻譜效果。點陣的分辨率比較高時,為了提高系統(tǒng)的運行效率,采用定時器中斷掃描顯示的方法來完成頻譜的刷新顯示。
利用函數信號發(fā)生器,輸出接上揚聲器,將函數信號發(fā)生器產生正弦波,幅度調到合適的值,從0 Hz到20 KHz開始測試,利用MIC輸入采集聲音,調節(jié)音量電位器,達到合適的靈敏度,顯示屏頻譜顯示基本可以做到準確地跟蹤,在 LED顯示模式上,改變顯示刷新方式,通過紅外遙控器上的功能按鍵做相應的設置,可以進行不同的顯示方式,增加多種效果。
通過使用 STC8系列單片機單周期指令的速度優(yōu)勢和內部強大的ADC轉換功能并結合FFT算法。完成對音樂信號的頻譜采集并通過 LED全彩顯示屏進行顯示,能對普通的聲音信號進行簡單的頻譜分析。同時,對日常生活音影設備增加了美感。