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