浮點(diǎn)運(yùn)算轉(zhuǎn)定點(diǎn)運(yùn)算_第1頁
浮點(diǎn)運(yùn)算轉(zhuǎn)定點(diǎn)運(yùn)算_第2頁
浮點(diǎn)運(yùn)算轉(zhuǎn)定點(diǎn)運(yùn)算_第3頁
浮點(diǎn)運(yùn)算轉(zhuǎn)定點(diǎn)運(yùn)算_第4頁
浮點(diǎn)運(yùn)算轉(zhuǎn)定點(diǎn)運(yùn)算_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

-:浮點(diǎn)與定點(diǎn)概述相關(guān)定義說明定點(diǎn)數(shù):通俗的說,小數(shù)點(diǎn)固定的數(shù)。以人民幣為例,我們?nèi)粘33Uf到的如123.45¥,789.34¥等等,默認(rèn)的狀況下,小數(shù)點(diǎn)后面有兩位小數(shù),即角,分。假如小數(shù)點(diǎn)在最高有效位的前面,則這樣的數(shù)稱為純小數(shù)的定點(diǎn)數(shù),如0.12345,0.78934等。假如小數(shù)點(diǎn)在最低有效位的后面,則這樣的數(shù)稱為純整數(shù)的定點(diǎn)數(shù),如12345,78934等。浮點(diǎn)數(shù):一般說來,小數(shù)點(diǎn)不固定的數(shù)。比較簡潔的理解方式是,考慮以下我們?nèi)粘R姷降目茖W(xué)記數(shù)法,拿我們上面的數(shù)字舉例,如123.45,可以寫成以下幾種形式:12.345X1011.2345xlO20.12345xl03xi為了表示一個數(shù),小數(shù)點(diǎn)的位置可以變化,即小數(shù)點(diǎn)不固定。定點(diǎn)數(shù)與浮點(diǎn)數(shù)的對比為了簡潔的把問題描述清晰,這里都是十進(jìn)制數(shù)字舉例,具體的分析,大家可以在后面的文章中看到。在運(yùn)算個過程中,需要把該運(yùn)算轉(zhuǎn)換成定點(diǎn)運(yùn)算。想了2天,都沒有想出怎么可以保證a的精度,由于a可能很小,假如簡潔的a<<=8;是無法保證a的精度的。今日快要下班時(shí),突然有靈機(jī)一動:c>>=6;b<<=8;a=l<<14-b/c;〃相當(dāng)于a<<14,保證了a的精度分子不能左移太多位,分母右移,解決問題了。發(fā)散思維說起來很簡潔,做起來不簡潔呀!5.舉例及編程中的心得1舉例"第3章DSP芯片的定點(diǎn)運(yùn)算.doc"這篇文章中給了一個很簡潔有能說明問題的例子,不想動大腦了,直接引用過來如下。這是一個對語音信號(0.3kHz~3.4kHz)進(jìn)行低通濾波的C語言程序,低通濾波的截止頻率為800Hz,濾波器采納19點(diǎn)的有限沖擊響應(yīng)FIR濾波。語音信號的采樣頻率為8kHz,每個語音樣值按16位整型數(shù)存放在insp.dat文件中。例3.7語音信號800Hz19點(diǎn)FIR低通濾波C語言浮點(diǎn)程序#include<stdio.h>constintlength=180/*語音幀長為180點(diǎn)=22.5ms@8kHz采樣*/voidfilter(intxin[]Jntxout[]jntn,floath[]);/*濾波子程序說明*//*19點(diǎn)濾波器系數(shù)*/staticfloath[19]={0.01218354,-0.009012882,-0.02881839,-0.04743239,-0.04584568,-0.008692503,0.06446265,0.1544655,0.2289794,0.257883,0.2289794,0.1544655,0.06446265,-0.008692503,-0.04584568,-0.04743239,-0.02881839,-0.009012882,0.01218354);staticintxl[length+20];/*低通濾波浮點(diǎn)子程序*/voidfilter(intxin[]Jntxout[]zintnjloath[])(inti,j;floatsum;for(i=0;i<length;i++)xl[n+i-l]=xin[i];for(i=O;i<length;i++)(sum=0.0;for(j=0;j<n;j++)sum+=h[j]*xl[i-j+n-l];xout[i]=(int)sum;)for(i=0;i<(n-l);i++)xl[n-i-2]=xin[length-l-i];/*主程序*/voidmain()(FILE*fpL*fp2;intframejndatallengthj^utdatatlength];fpl=fopen(insp.dat,"rb");/*輸入語音文件*/fp2=fopen(outsp.dat,"wb");/*濾波后語音文件*/frame=0;while(feof(fpl)==0)(frame++;printf("frame=%d\nHzframe);for(i=0;i<length;i++)indata[i]=getw(fpl);/*取一幀語音數(shù)據(jù)*/filter(indata,outdata,19,h);/*調(diào)用低通濾波子程序*/for(i=0;i<length;i++)putw(outdata[i],fp2);/*將濾波后的樣值寫入文件*/)fcloseall();/*關(guān)閉文件*/return(O);)例3.8語音信號800Hz19點(diǎn)FIR低通濾波C語言定點(diǎn)程序#include<stdio.h>constintlength=180;voidfilter(intxin[]Jntxout[]Jntnjnth[]);staticinth[19]={399,-296,-945,-1555,-1503,-285,2112,5061,7503,8450,7503,5061,2112,-285,-1503,-1555,-945,-296,399};/*Q15*/staticintxl[length+20];/*低通濾波定點(diǎn)子程序*/voidfilter(intxin[]Jntxout[]Jntnjnth[])(intij;longsum;for(i=0;i<length;i4-+)xl[n+i-l]=xin[i];for(i=O;i<length;i++)(sum=0;for(j=0;j<n;j++)sum+=(long)h[j]*xl[i-j+n-l];xout[i]=sum>>15;for(i=0;i<(n-l);i++)xl[n-i-2]=xin[length-i-l];)主程序與浮點(diǎn)的完全一樣。5.2編程中的心得通過上邊的例子,信任大家都大致明白了轉(zhuǎn)換的過程。一個函數(shù)模塊如此,一個大的軟件項(xiàng)目的轉(zhuǎn)換也無非如此。所不同的是,對于一個項(xiàng)目,很少有一個個單獨(dú)的模塊,一般都是幾個或數(shù)個模塊都有聯(lián)系,干一發(fā)而動全身,所以,再進(jìn)行轉(zhuǎn)換之前,最好理清各個軟件模塊之間的關(guān)系。協(xié)調(diào),協(xié)調(diào),再協(xié)調(diào)。寫到這里,與afreez一起學(xué)習(xí)DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算這個問題的爭論最終可以收筆To拖拖拉拉,拉了有3個月之久,現(xiàn)在最終可以了卻自己的愧疚了。從第三部分開頭,寫的有寫焦急,由于沒有足夠的時(shí)間來寫,還想把剩下的寫完,只能這么解決了。我想,文章只是給出學(xué)者一個思路,假如自己以后遇到了這樣的問題,還需要自己去探究的,沒有一勞永逸的文章,究竟問題都各個不同嗎。文章中難免有不妥之處,歡迎大家批判指正!此外,自從發(fā)了該系列文章中的前兩篇后,郵箱間續(xù)收到一些伴侶的email,我想,假如大家對這個問題感愛好,可以多多的回帖,一方面,我回帖便利(不是太常??从拖洌?一方面,也可以增加點(diǎn)這里的人氣,哈哈。(1)表示的精度與范圍不同例如,我們用4個十進(jìn)制數(shù)來表達(dá)一個數(shù)字。對于定點(diǎn)數(shù)(這里以定點(diǎn)整數(shù)為例),我們表示區(qū)間[0000,9999]中的任何一個數(shù)字,但是假如我們要想表示類似1234.3的數(shù)值就無能為力了,由于此時(shí)的表示精度為1/10°=1;假如采納浮點(diǎn)數(shù)來表示(以歸整的科學(xué)記數(shù)法,即小數(shù)點(diǎn)前有一位有效位,為例),則可以表示[0.000,9.999]之間的任何一個數(shù)字,表示的精度為1/103=0.001,精度比上一種方式提高了許多,但是表示的范圍卻小了許多。也就是說,一般的,定點(diǎn)數(shù)表示的精度較低,但表示的數(shù)值范圍較大;而浮點(diǎn)數(shù)恰恰相反。(2)計(jì)算機(jī)中運(yùn)算的效率不同一般說來,定點(diǎn)數(shù)的運(yùn)算在計(jì)算機(jī)中實(shí)現(xiàn)起來比較簡潔,效率較高;而浮點(diǎn)數(shù)的運(yùn)算在計(jì)算機(jī)中實(shí)現(xiàn)起來比較簡單,效率相對較低。(3)硬件依靠性一般說來,只要有硬件供應(yīng)運(yùn)算部件,就會供應(yīng)定點(diǎn)數(shù)運(yùn)算的支持(不知道說的準(zhǔn)確否,沒有聽說過不支持定點(diǎn)數(shù)運(yùn)算的硬件),但不肯定支持浮點(diǎn)數(shù)運(yùn)算,如有的許多嵌入式開發(fā)板就不供應(yīng)浮點(diǎn)運(yùn)算的支持。1.3與DSP的關(guān)系一般說來,DSP處理器可以分為兩大類:定點(diǎn)與浮點(diǎn)。兩者相比較而言,定點(diǎn)DSP處理器速度快,功耗低,價(jià)格也廉價(jià);而浮點(diǎn)DSP則計(jì)算精度高,動態(tài)范圍大。二:浮點(diǎn)數(shù)的存儲格式IEEEfloatingpointstandard上面我們說了,浮點(diǎn)數(shù)的小數(shù)點(diǎn)是不固定的,假如每個人都根據(jù)自己的愛好存儲在電腦里,那不就亂套了嗎?那么怎么在計(jì)算機(jī)中存儲這種類型的數(shù)字呢?象這類古老的問題前人早都為我們做好了相應(yīng)的法律規(guī)范,無法規(guī)不成方圓嗎。我們平常所說的浮點(diǎn)數(shù)的存儲法律規(guī)范,就是由IEEE指定的,具體的法律規(guī)范文件是:IEEEStandard754forBinaryFloating-PointArithmetic0大家可以很簡潔的從網(wǎng)絡(luò)上下載到這篇文檔。下面,偶就大致的描述一下,感爰好的"同志"們可以閱讀原文。在c語言中,單精度(float)數(shù)據(jù)類型為32bits,具體的如下圖所示:整個32bits分三部分,即Sign:符號位,1bit,0為正,1為負(fù);Exponent(bias):指數(shù)部分,8bits,存儲格式為移碼存儲(后面還會說明),偏移量為127;Mantissa(fraction):尾數(shù)部分。對應(yīng)的雙精度(double)類型的格式為:同樣,64位也被分為了三部分,對比單精度,不用我說就可以理解各個部分的含義了吧?是不是有點(diǎn)模糊了,不要怕,理論這個東西最能忽悠人了,看起來很高深,其實(shí)也就是個屁大的事,舉個例子就很簡潔明白了。舉例說明,如3.24x103,則對應(yīng)的部分為,Sign為0,3為指數(shù)部分(留意計(jì)算機(jī)里面存儲的不是3,這里僅僅為了說明),3.24為尾數(shù)。我們知道,計(jì)算機(jī)"笨"的要死,只熟識。和1,那么究竟一個浮點(diǎn)數(shù)值在計(jì)算機(jī)存儲介質(zhì)中是如何存儲的呢?例如,我們要想偷窺浮點(diǎn)類型的值4.25在計(jì)算機(jī)硬盤中存儲的廬山真面目,請跟我來:首先把4.25轉(zhuǎn)換成二進(jìn)制的表達(dá)方式,即100.01,在具體點(diǎn),變成1.0001x22,好了,對號入座把。Sign=0;Exponent(bias)=2+127=129(偏移量為127,就是直接加上個127T);Mantissa=1.0001-1.0=0001(規(guī)格化后,小數(shù)點(diǎn)前總是整數(shù)1,全世界人都知道前面是1不是0,所以省略不寫了,即尾數(shù)部分不包括整數(shù)部分;當(dāng)別人問你,為什么23bit的尾數(shù)部分可以表示24位的精度,知道怎么回答了吧???,什么,沒有看懂,再認(rèn)真讀兩便就知道了X2.2深化理解浮點(diǎn)存儲格式為了更深化的理解浮點(diǎn)數(shù)的格式。我們使用C語言來做一件事。在C語言的世界里,強(qiáng)制類型轉(zhuǎn)換,大家應(yīng)當(dāng)都很熟識了。例如:???floatf=4.6;inti;???i二(int)(f+0.5);//i=5??下面我們不使用強(qiáng)制類型轉(zhuǎn)化,我們自己來計(jì)算f轉(zhuǎn)換成整形應(yīng)當(dāng)?shù)扔趲祝堪阎饕a帖出來,如下:〃取23+1位的尾數(shù)部分intival=((*(int*)(&fval))&0x07fffff)|0x800000;//提取指數(shù)部分intexponent=150-(((*(int*)(&fval))>>23)&Oxff);if(exponent<0)ival二(ival<<-exponent);elseival=(ival>>exponent);〃假如小于0,則將結(jié)果取反if((*(int*)&fval)&0x80000000)ival=-ival;好好琢磨琢磨吧,看明白了,就說明你基本明白了浮點(diǎn)數(shù)的存儲格式,假如沒有看明白,接著看,知道明白為止。.定點(diǎn)數(shù)的加減乘除運(yùn)算簡潔的說,各種運(yùn)算的原則就是先把待運(yùn)算的數(shù)據(jù)放大肯定的倍數(shù),在運(yùn)算的過程中使用的放大的數(shù)據(jù),在最終需要輸出結(jié)果的時(shí)候再調(diào)整回去。舉個例來說,有如下運(yùn)算://coefsl=0.023423;coefs2=0.2131floatcoefsl,coefs2;intresult;result=34*coefsl+72*coefs2;代碼的意思是,該模塊需要輸出一個整型的結(jié)果,但計(jì)算的過程中有浮點(diǎn)的運(yùn)算。假如在定點(diǎn)的DSP中,這段代碼是無法運(yùn)行的。為了解決這個問題,我們可以這樣處理:首先,把coefsl,coefs2等類似的浮點(diǎn)數(shù)據(jù)擴(kuò)大肯定的倍數(shù)(具體擴(kuò)大多少倍,依據(jù)精度要求不同),我們暫且把小數(shù)點(diǎn)向右移動4位,也就是擴(kuò)大的倍數(shù)為:*10000,在最終的輸出的時(shí)候在縮小相同的倍數(shù)。修改后的代碼大致如下://coefsl=234;coefs2=2131intcoefsl,coefs2;intresult;result=34*coefsl+72*coefs2;resultI-10000;當(dāng)然,上面的例子為了大家好理解,寫的可能不是太正確,不過基本的精髓應(yīng)當(dāng)是這些了。具體的處理過程,大家可以在網(wǎng)上搜尋〃第3章DSP芯片的定點(diǎn)運(yùn)算.doc:〃這篇文章,寫的很具體,這里不再羅嗦了。.定點(diǎn)數(shù)模擬浮點(diǎn)數(shù)運(yùn)算及常見的策略信任大家到

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論