關於IQMATH和浮點數在DSP的深入理解
使用了一段時間IQmath來處理浮點數,發現對其的理解還是不夠,只是限於根據其resolution/precison來選取不同的IQ形式來處理浮點數。今天就遇到了一個比較棘手的問題,如果我想把一個整數Uint16型賦給IQ15類型的,發現再轉換回整數的時候賦值已經不對了,我通過先將Uint16賦給FLOAT32型,再使用語句,temp=_IQ(float32);(此語句的作用是將浮點類型轉換為定點IQ15的格式)發現這樣處理后,再換回整數時賦值和原始賦值是相同的。可是,為了一個賦值運算,我將要多申請多少FLOAT32型的變量! 我想一定有辦法可以直接賦值,我深入理解了下float32型的構造,float和int都是固定長度的,4字節(32位機子)。int是精確的,超出范圍就溢出了。數據錯誤了。 而float並不是單純的101010這樣存儲,是把4個字節划分為 符號位,指數位,尾數位 比如1.123123*10^35;3個部分固定的,因為有指數,存儲的范圍當然比int大了。 但是3個部分也有范圍限制,所以當你精度值越大時,越不精確了。取了例子,眾所周知單精度浮點型的有效數字長度為7位(不知道的小朋友要好好復習C語言了),那么比如一個數字2.1234567891*10^14,那么賦給float后他就變成了2.1234567*10^14,后面都是精確的了,那么這個數字的無效范圍就變成了21345670000000---2134567999999999,可見其多么不精確了。 那么IQmath是不是可以用同樣的方法理解呢,答案是類似的,IQmath的IQ型不像FLOAT32分成3個部分,而是分成了2個部分,整數(符號位包括其中)位和小數位,我仔細看了下IQmath官方的手冊,其實每個IQ都是個LONG型,通過不同的位數的定標(其實就是定小數點的位置),來實現不同精度的小數和取值范圍,那么IQ15就是用低15位來表示小數位,用來表示整數的部分就是高(32-15)位了,那么照這個思路,我們要把一個整形Uint6直接賦給IQ15也是很容易的了,只要賦值后,再將IQ值向左移位15位就好了。經過實驗發現果然是這樣的。這樣的話,以后IQ和整型的轉換就變得非常簡單了,如果你願意的話,都可以替IQmath補充函數這類函數進去,這樣對各種數據的處理會變得更加游刃有余。