在MSP430F1611上 實(shí)現(xiàn)周期圖譜分析及校正
由式(1)和式(2)可以看出,蝶形輸出的實(shí)部和虛部是由3個(gè)數(shù)相加得到的,因此數(shù)據(jù)可能會(huì)放大3倍。如果計(jì)算過(guò)程中的數(shù)據(jù)始終使用定點(diǎn)數(shù)表示,隨著級(jí)數(shù)的增加,就會(huì)發(fā)生溢出。例如,使用16位定點(diǎn)數(shù)表示,其最高位(從左數(shù)第1位)為符號(hào)位,其表示的數(shù)據(jù)范圍為-32 768~32 767。如果采樣得到的數(shù)據(jù)最大值為4 096,經(jīng)過(guò)兩級(jí)計(jì)算后蝶形最大輸出就可能為4096×3×3=36 864,超出了16位定點(diǎn)數(shù)的表示范圍。
下面介紹保證數(shù)據(jù)計(jì)算精度的方法。
為了提高計(jì)算速度,系統(tǒng)中使用定點(diǎn)數(shù)法運(yùn)算FFT,且使用Q13表示數(shù)據(jù)。蝶形運(yùn)算中,其蝶形輸出的數(shù)據(jù)的實(shí)部和虛部都使用3次加法運(yùn)算,即每級(jí)蝶形運(yùn)算都可能使數(shù)據(jù)擴(kuò)大3倍,因此,蝶形輸出的實(shí)部和虛部結(jié)果都需要右移2位(縮小4倍)以防止溢出。但隨著計(jì)算級(jí)數(shù)的增加,移位將會(huì)使數(shù)據(jù)變得越來(lái)越小。例如,128點(diǎn)FFT,總共需要7級(jí)運(yùn)算,數(shù)據(jù)最終將移位2×7=14位(縮小47=16 384倍),因此當(dāng)信號(hào)幅值不夠大時(shí),經(jīng)過(guò)多級(jí)運(yùn)算可能會(huì)無(wú)法分辨出主信號(hào)頻率。
設(shè)FFT運(yùn)算結(jié)果的主信號(hào)頻率點(diǎn)的對(duì)應(yīng)實(shí)部為r,虛部為i,其幅值為A(ADC的量化值),參與運(yùn)算的數(shù)據(jù)點(diǎn)數(shù)為N,由FFT功率譜計(jì)算的性質(zhì)可得:本文引用地址:http://butianyuan.cn/article/195825.htm
設(shè)經(jīng)過(guò)定點(diǎn)FFT運(yùn)算,也就是運(yùn)算過(guò)程中有移位,則該主信號(hào)頻率點(diǎn)的模為K,即:
聯(lián)立式(3)和式(4),得
由于功率譜估計(jì)是找出功率譜中的最大值,確定主信號(hào)的頻率,根據(jù)經(jīng)驗(yàn),使用定點(diǎn)數(shù)運(yùn)算FFT,當(dāng)實(shí)部和虛部的模的平方K2為2時(shí),就無(wú)法由功率譜分辨出主信號(hào)頻率。由式(5)可得:
因此,當(dāng)K2為2,N為128時(shí),A=128×1.414=180.992=181,即當(dāng)信號(hào)的幅值為18l/4 096×2.538=112 mV,就分辨不出主信號(hào)頻率??紤]K2為2的極限情況,當(dāng)A為724,N為512時(shí),即給定信號(hào)幅值為724/4 096×2.538=449 mV時(shí),就分辨不出主信號(hào)頻率。
為了防止計(jì)算結(jié)果經(jīng)過(guò)多次移位后,數(shù)據(jù)太小無(wú)法分辨主信號(hào),系統(tǒng)針對(duì)定點(diǎn)FFT運(yùn)算采取如下處理:由于FFT定點(diǎn)運(yùn)算中,一般情況下,為了處理方便,每級(jí)蝶形運(yùn)算中乘法結(jié)果都限制在-1~1范圍內(nèi),即乘法運(yùn)算的結(jié)果始終為小數(shù)(只有經(jīng)過(guò)加法運(yùn)算,數(shù)據(jù)才有可能超出-1~1范圍),因此,通過(guò)判斷蝶形輸出的結(jié)果,決定是否移位。當(dāng)發(fā)現(xiàn)超出-1~1范圍,就將本級(jí)的所有蝶形運(yùn)算的輸出結(jié)果右移2位,沒(méi)有超出就不進(jìn)行移位。
3 內(nèi)存分配
由式(3)可知,功率譜估算時(shí)需要另外開(kāi)辟一段內(nèi)存空間存儲(chǔ)功率譜結(jié)果。例如,當(dāng)進(jìn)行2048點(diǎn)基于FFT的功率譜分析時(shí),需用1024個(gè)浮點(diǎn)數(shù)存放功率譜計(jì)算結(jié)果,這將占有很大一段內(nèi)存。但實(shí)際運(yùn)算中,每個(gè)頻率點(diǎn)功率,只與其FFT運(yùn)算結(jié)果中的對(duì)應(yīng)頻率點(diǎn)的實(shí)部、虛部有關(guān),而與其他頻率點(diǎn)無(wú)關(guān)。因此功率譜運(yùn)算中,可采取以下步驟將存放實(shí)部的空間存放功率譜:
①實(shí)部、虛部數(shù)據(jù)平方計(jì)算。由于MSP430F1611內(nèi)部集成了硬件乘法器,因此可將乘法器的第一操作數(shù)寄存器(OP1)、第二操作數(shù)寄存器(OP2)寫入相同的數(shù)據(jù)實(shí)現(xiàn)平方運(yùn)算。
②平方結(jié)果移位。平方結(jié)果需要右移13位,使用Q13表示,同時(shí)使用16位的臨時(shí)變量將平方結(jié)果保存。
③功率譜計(jì)算結(jié)果保存。實(shí)部平方結(jié)果、虛部平方結(jié)果相加后再存人原來(lái)的實(shí)部單元。
經(jīng)過(guò)上述步驟后,就可將原來(lái)存放實(shí)部、虛部數(shù)據(jù)的內(nèi)存單元再次利用。
定點(diǎn)FFT運(yùn)算過(guò)程中,還可將用來(lái)存放采集數(shù)據(jù)的內(nèi)存空間,再次用作存放FFT運(yùn)算過(guò)程中的實(shí)部數(shù)據(jù),另外再開(kāi)辟同等大小的內(nèi)存空間,存放虛部數(shù)據(jù)。例如,對(duì)于RAM空間為10 KB的MSP430F16ll來(lái)說(shuō),使用16位定點(diǎn)數(shù)運(yùn)算FFT,最多能夠運(yùn)算2 048點(diǎn)。因?yàn)閷?shí)部、虛部結(jié)果都需4 096 KB,故共需8.192 KB,正好小于10KB;而運(yùn)算4 096點(diǎn)FFT時(shí),共需16.384 KB,超出10 KB。
4 程序?qū)崿F(xiàn)
算法實(shí)現(xiàn)時(shí)使用如下方法簡(jiǎn)化了程序運(yùn)算過(guò)程:
①C程序調(diào)用匯編FFT程序,同時(shí)為了處理方便將功率譜運(yùn)算過(guò)程也用C語(yǔ)言實(shí)現(xiàn)。為了使匯編程序中使用的內(nèi)存空間與C程序中的內(nèi)存空間地址不發(fā)生沖突,匯編程序中所需的變量都在C文件中定義。
②由于實(shí)部、虛部都使用C語(yǔ)音數(shù)組來(lái)存儲(chǔ),當(dāng)計(jì)算點(diǎn)數(shù)很多時(shí),數(shù)組將很大。例如,當(dāng)運(yùn)算2 048點(diǎn)FFT時(shí),就需定義兩個(gè)長(zhǎng)度為2 048的整形數(shù)組,這兩段數(shù)組不能用堆棧局部空間存儲(chǔ),只能用全局?jǐn)?shù)組,由于C語(yǔ)言規(guī)定全局變量默認(rèn)初始化為0,MSP430的IAR編譯環(huán)境,進(jìn)入main函數(shù)之前的cstart函數(shù)中就用cstar_inh_zero函數(shù)對(duì)全局變量進(jìn)行初始化,由于定義的數(shù)組太長(zhǎng),初始化需要很長(zhǎng)時(shí)間,導(dǎo)致程序還沒(méi)有進(jìn)入main函數(shù),看門狗就已經(jīng)復(fù)位。因此定義全局?jǐn)?shù)組時(shí),加上_no_init關(guān)鍵字。例如,定義一個(gè)數(shù)據(jù)長(zhǎng)度為2 048的不需要初始化的整型數(shù)組,使用語(yǔ)句no_init int fft[2048]。
評(píng)論