<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 在MSP430F1611上實現周期圖譜分析及校正

          在MSP430F1611上實現周期圖譜分析及校正

          作者: 時間:2012-05-09 來源:網絡 收藏

          設浮點乘法運算的表達式為:float x,y,z;z=xy。假設經過統(tǒng)計(這里“統(tǒng)計”的意思是所有計算中數據范圍都在定標范圍內)后x的定標值為Qx,y的定標值為Qy,乘積z的定標值為Qz,則z=xy;zq×2-Qz=xq×yq×2-(Qx+Qy);zq=(xqyq)2Qz-(Qx+Qy)。所以,定點表示的乘法為:


          1.3 FFT計算過程中的數據定標
          為了在以MSP43F1611為處理器的儀表系統(tǒng)上進行基于FFT的,必須先由的ADC進行采樣,而ADC采樣得到的數據需要經過定標后才能進行。定標過程為:ADC的采樣電壓范圍為0~2.5 V,因此,采樣過程實際上就是將信號電壓除以2.5進行歸一化,使得采樣得到的數據范圍為O~1 V,此時數據就可用Q15表示,即將ADC的12位采樣結果寄存器中的數據右移4位保存起來,維持12位精度,轉換為Q15定點數表示。由于FFT運算過程中,蝶形輸出相對蝶形輸入數據被放大了3倍,因此蝶形輸出數據范圍為一3~+3 V。此時數據如果仍然使用Q15表示,就會發(fā)生溢出,故改用Q13表示數據,即將12位ADC數據右移1位。實際上經過處理后,ADC數據精度沒有變化,但使用Q13表示數據比用Q12表示數據,其蝶形輸出的數據精度高。這是由于時需要對蝶形輸出右移以防止溢出,而使用Q13表示數據比使用Q12表示數據少右移了1位,因此多了1位有效數據。FFT運算過程中使用Q13表示數據,就使得加法乘法運算都可以直接使用定點指令實現,減少了很多判斷處理,提高了運算速度。使用Q13表示數據,即最高位(左邊的第1位)是符號位,剩下的15位表示數據的大小。表示數據大小的15位中,高2位(左邊的第2位和第3位)用來表示數據中的整數部分,在計算中作為保護位;最低的13位(右邊的13位)表示數據中的小數部分,如果經過某次蝶形單元運算后,最大值正好被放大3倍,此時數據就由13位擴大到15位,保證數據不會增大到16位,沖走符號位,發(fā)生溢出。運算完成后將FFT計算過程中的這一級所有結果都右移2位,就能夠使得這一級計算結果的最大值仍然可用13位表示,同時也可將這一級所有蝶形運算輸出的數據同時縮小,保證下級計算。表示數值大小的15位數據的數據格式如圖2所示。

          1.4 旋轉因子數據定標
          FFT運算過程使用,且使用有符號乘法,必須始終保留1位作為符號位;而旋轉因子范圍為-1~1,因此可定標為Q14,轉換為16位定點數。其轉換過程為:根據參與FFT運算的數據點數計算出旋轉因子的正余弦表,然后將正余弦表乘以16384,即左移14位,最后四舍五人取整。如果使用Q15表示數據,即需要左移15位,那么正余弦表中最大值1,經過上述處理后成為-1,發(fā)生溢出。


          2 防止溢出,保證精度
          FFT中的蝶形運算如圖3所示。設蝶形輸入為:X1(k),實部為X1(k)r,虛部為X1(k)i;X2(k),實部為X2(k)r,虛部為X2(k)i。設蝶形輸出為:X(k),實部為X(k),,虛部為X(k)i;X(k+N/2),實部為X(k+N/2)r,虛部為X(k+N/2)i。則有:



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();