摘 要: 基于ARM Cortex?M3內核的32位處理器STM32F103和快速傅里葉變換(FFT)算法實現了音頻信號頻譜的分析。 整個系統由前級信號調理、A/D采樣電路、CPU運算電路和LCD顯示電路等組成。實驗表明,系統能夠檢測20 Hz~10 kHz范圍內的頻率成份并顯示音頻信號頻譜,該方案成本低,具有一定的應用價值。
關鍵詞: 音頻信號; FFT; STM32; 基?4時間抽取
中圖分類號: TN911.7?34 文獻標識碼: A 文章編號: 1004?373X(2014)01?0019?03
音頻信號分析應用于音頻制作、信號分析等領域,如音頻設備的研發與生產、低頻信號的綜合分析等。本設計利用頻譜分析原理來分析被測音頻信號的頻率、頻譜,傳統的頻譜分析方法有掃頻法、數字濾波法。采用STM32實現快速傅里葉變換(FFT)設計方案,通過FFT把被測的音頻信號由時域信號轉換為頻域信號,將其分解成分立的頻率分量。
1 系統設計
音頻信號通過前級信號處理電路放大和濾波及模數轉換,經STM32進行FFT運算后獲得信號的頻譜,單片機控制A/D轉換器實時采集信號,頻譜在液晶屏掃描顯示。單片機采用ST公司的低功耗STM32F103ZET6 32位單片機,其內部含有3個12位16通道A/D轉換模塊和2個12位D/A轉換模塊。系統框圖如圖1所示。
1.1 信號調理與采集
設計思想:為滿足輸入信號較大的動態范圍,必須在信號進行A/D轉換前進行合理的處理,使其在A/D量化范圍內達到量化精度最高,該方法相當于AD位數的增加。本設計要求輸入信號幅度范圍(峰?峰值)為0.01 mV~10 V,即100 dB的輸入信號動態范圍。設定ADC芯片的最小輸入信號峰?峰值為500 mV,再設定ADC的輸入動態范圍為20lg(10 V/500 mV),即26 dB,故需要5路放大電路,每一路放大倍數固定,分別為62 400,8 000,400,20,1倍。由于設計小信號放大的增益較大,放大器的選擇尤為關鍵,根據影響放大器輸出的主要參數:運放的增益帶寬積、噪聲電壓密度、噪聲電流密度、失調電流和失調電壓等,選擇TI公司生產的運放OPA637,該運放增益帶寬積約800 MHz,輸入換算電壓噪聲密度為[4.5 nVHz,]輸入偏置電流2 pA,輸入失調電壓130 μV。具體電路如圖2所示。
圖1 系統框圖
抗混疊濾波器設計:信號送到ADC之前要對信號進行抗混疊低通濾波器處理,防止高頻分量信號被采樣,產生頻譜混疊,而影響給定較低頻率信號的幅值分析。為此設計了一個截止頻率為15 kHz的四階巴特沃斯低通濾波器作為抗混疊濾波器。
1.2 基?4時間抽取FFT
基?4時間抽取(Radix?4 Decimation In Time,DIT4) 的FFT 算法思想是將長序列逐次分解為4個短序列,最后由短序列的DFT逐次合成長序列的DFT。基?4時間抽取相比于基?2時間抽取,復數乘法的運算量減少,隨之而來運算速度加快,因此這里采用基?4時間抽取。基?4時間抽取FFT是將時域序列[x[k]]以前后兩部分按奇偶順序逐級抽取重新排列形成4個短序列,由此4個短序列的DFT合成的頻域序列[X[k]]按自然順序排列,故稱為基?4時間抽取FFT。設序列[x[k]]的長度為[N=4M,][M]為正整數。則基?4時間抽取FFT計算公式為:
[Xm=X1m+WmNX2m+W2mNX3m+W3mNX4mXm+N4=X1m-jWmNX2m-W2mNX3m+jW3mNX4mXm+2N4=X1m-WmNX2m+W2mNX3m-W3mNX4mXm+3N4=X1m+jWmNX2m-W2mNX3m-jW3mNX4m]
式中:[m=0,1,2,…,N4-1;][X1m,X2m,X3m和X4m]分別是與[x[k]]按對4的余數順序重新排列后的序列[x1k,][x2k,x3k]和[x4k]對應的[N4]點DFT。
由此可以得出DIT4?FFT的蝶形運算的信號流圖,如圖3所示。
圖3 基?4時間抽取蝶形運算的信號流圖
設采樣率為[fs,]則第[fi=ifsN]頻率點[Xi=ai+jbi,][i=0,1,2,…,N2-1],則原信號所含該頻率的分量[Si]為:
[Si=ai2+bi2N, i=0Si=Aicos2πfit+θi=2ai2+bi2Ncos2πifsNt+arctanbiai,]
[i=1,2,…,N2-1]
通過上式,可從采集的信號中提取出各頻率點的幅度值,作為音頻信號的分析結果。
1.3 軟件設計和流程圖
系統軟件設計分為采樣、量化、基?4 FFT、各頻率分量幅值計算和液晶屏顯示共5個部分。其中片上ADC完成采樣與量化,MCU完成基?4 FFT及幅值計算,液晶屏完成最終顯示。軟件流程圖如圖4所示。
圖4 軟件流程圖
軟件采用“STM32F10xxx DSP Lib”的1 024點基?4 時間抽取FFT,該庫的核心FFT算法采用的是匯編語言,速度快、效率高,一次1 024點FFT最快運算時間能達到1.768 ms,因此對整個系統影響很小,故采用之。
通過對基?4 FFT的分析,便可設計出幅值計算的算法。模塊代碼如下:
ADC_Sample[count_flag++]=ADC_GetConversionValue(ADC1); //轉換結果存儲
ft_asm_test(ADC_FFT_Out,ADC_Sample);
//調用基?4 FFT 變換和幅值計算函數
void fft_asm_test(vu32 *OUT,vu32*IN)
{
cr4_fft_1024_stm32(OUT, IN, NPT); //DSP LIB 1 024點FFT
fft_asm_powerMag(OUT); //計算幅值
}
void fft_asm_powerMag(vu32*p)
{
for(i=0;i { AX=(*(p+i)<<16)>>16; //復數實部 AY=(*(p+i)>>16); //復數虛部 float X=NPT*((float)AX)/32768; float Y=NPT*((float)AY)/32768; float Mag=sqrt(X*X+Y*Y)/NPT; //取模 *(p+i)=(u32)(Mag*65535); //2*模值=對應頻率真實幅值的量化值,因只需取前512有效點 } } 2 系統測試 通過Matlab仿真測試與實際硬件電路測試比較,進而驗證系統設計是否符合設計標準。測試信號為單頻信號和方波信號。Matlab仿真結果和實際測試結果如圖5,圖6所示。通過對比圖5,圖6看出,實際測試結果與仿真結果一致。 圖5 Matlab仿真頻譜 3 結 語 本設計采用數字信號處理技術,在STM32內部完成了1 024點浮點型FFT計算,利用STM32運算速度快,功耗低的優勢,實現了對音頻信號的頻譜分析。由實驗調試結果及測試數據可知, 本設計能準確判斷頻率成分在20 Hz~10 kHz、幅值范圍為0.1 mV~10 V 的輸入信號的頻譜,頻率分辨力最高可達10 Hz。系統對待測量信號2 s刷新一次并可實時顯示。不僅達到設計要求,還進一步提高了頻率分辨力,增加了掉電存儲回放顯示及信號頻譜顯示的功能,擴展了數據的掉電存儲與頻譜顯示的功能。 圖6 實際觀察到的頻譜 參考文獻 [1] 陳后金,薛健,胡健.數字信號處理[M].2版.北京:高等教育出版社,2008. [2] 王旭東,潘明海.數字信號處理的FPGA實現[M].北京:清華大學出版社,2011. [3] MEYER?BAESE U. Digital signal processing with field programmable gate arrays[M]. 3rd ed. Germany: Springer, 2007. [4] 全國大學生電子設計競賽組委會.全國大學生電子設計競賽獲獎作品選編(2007)[M].北京:北京理工大學出版社,2008. [5] 童詩白,華成英.模擬電子技術基礎[M].3版.北京:高等教育出版社,2003. [6] 黃根春,陳小橋,張望先.電子設計教程[M].北京:電子工業出版社,2007. [7] Sanjit K Mitra.數字信號處理:基于計算機的方法[M].2版.北京:清華大學出版社,2006. [8] 劉軍.例說STM32[M].北京:北京航空航天大學出版社,2011. [9] 劉火良,楊森.STM32庫開發實戰指南[M].北京:機械工業出版社,2013. [10] 劉保柱,蘇彥華.Matlab 7.0從入門到精通[M].北京:人民郵電出版社,2010.