接觸dsp和無刷電機原始碼時,對於計算的要求比較高。對q格式做一下了解,當然也解答了我以前的疑問。
1.什麼是定點數?
2.印象中的dsp不是應該支援浮點數的運算麼?
在看st的變換原始碼時,本沒了解什麼是q格式,不過當時的理解是將sin(theta)在0-90度的值[0-1]區間做了放大,即為0-32768。下一步計算完後再右移15位縮小。
做為較為底層的c程式設計師,或者說計算機的常識,我們對於乙個數如何在計算機中儲存的。不管是什麼型別的數,有無符號,整數小數,到最後都是01010的二進位制。整數還好理解,一般的float浮點型數,一位符號位,8位指數字,23位尾數部分,在訪問時會多出計算開銷。
物理量時間、電壓等等,都是模擬的、連續的。數字系統,訊號是在不連續的時間點取樣,物理量或訊號的大小也不再是連續,而是被量化(quantized)。在數字系統中,只能用有限字元長度的數字去表示數量的大小,而不能以無限精確的數值(實數)去表示。使用了定點數與浮點數的表示法。
1.定點數(fixed point number):指乙個數字的表示,其小數點是在固定的位置(位元)。
2.浮點數(floating point number):使用假數以及指數兩部分來表示數值。
q格式是二進位制的定點數格式,指定了相應的小數字數和整數字數,q格式表示為:qm.n,表示資料用m位元表示整數部分,n位元表示小數部分,共需要m+n+1位來表示這個資料,多餘的一位用作符合位。
目的:在沒有浮點運算的平台上,更快的處理浮點資料。
在兩個位元組下,q15表示小數字有15位,最高位表示符號位。則表示的範圍:[-115位即為2的15次方為32768.所以我們將1放大了32768倍。其精度即為1/32768=0.000030517578125。
因為0x7fff為32767,所以正數最大就是0.9999695。
在四個位元組下的,第一位表示符號位,16位表示整數為,15位表示小數字。q15的範圍則為[-65536,65535.9999695]
#define iq7(a) ((int16_t)((a)*128))
#define fq7(a) ((int16_t)((a)*128.0f))
#define q7i(a) ((int16_t)((a)>>7))
#define q7f(a) ((a)*7.8125000e-03)
#define q7_mul(a,b) ((a)*(b)>>7)
(考慮安全的話,需要考慮溢位的情況)
#define q7_squ(a) ((a)*(a)>>7)
(考慮安全的話,需要考慮溢位的情況)
定點加減法:須轉換成相同的q格式才能加減
定點乘法:不同q格式的資料相乘,相當於q值相加,即q15資料乘以q10資料後的結果是q25格式的資料
定點除法:不同q格式的資料相除,相當於q值相減
定點左移:左移相當於q值增加
定點右移:右移相當於q減少
ti的sdp總提供的庫。iqmath一共提供了30種q格式,具體選擇格式要兼顧精度和值.提供了相應的轉換和很多數學計算的庫
long _iqmpyi32int(a, b) //n*long iq乘long 返回整數部分
long _iqmpyi32frac(a, b)//n*long iq乘long 返回小數部分
_iqmpy(a, b) //n*n乘法
_iqrmpy(a, b) //n*n四捨五入的乘法最後儲存結果前(四捨五入)
_iqrsmpy(a, b) //n*n四捨五入的飽和處理乘法(如果q26[-32,+32],如果相乘結果超過也會限制到這個範圍)
_iqmpyi32(a, b) //n*long iq乘long
_iqmpyiqx(a, a1, b, b1) //n1*n2兩個不同的q格式乘法,返回全域性q格式
_iqdiv(a, b) // n/n iq除法
三角函式
_iqsin(a)
_iqsinpu(a) //正弦函式(標么值),你佔這個圓周的幾分之幾為單位如果sin((0.25*pi)/(2*pi))
_iqcos(a)
_iqcospu(a)
_iqatan2(a, b) //第四象限反正切 tan-1(sin, cos)
_iqatan2pu(a, b) //第四象限反正切 tan-1(sin, cos)
_iqatan(a, b) //定點反正切 tan-1(1),,1=sin/cos
_iqnsin(a)
_iqnsinpu(a) //正弦函式(標么值),你佔這個圓周的幾分之幾為單位如果sin((0.25*pi)/(2*pi))
_iqncos(a)
_iqncospu(a)
_iqnatan2(_iqa, b) //第四象限反正切 tan-1(sin, cos)
_iqnatan2pu(_iqa, b) //第四象限反正切 tan-1(sin, cos)
_iqnatan(a, b) //定點反正切 tan-1(1),,1=sin/cos
數學函式
_iqnsqrt(a) //平方根 a^0.5
_iqnisqrt(a) //平方根倒數 1/a^0.5
_iqnmag(a, b) //求模運算(sqrt(a^2 + b^2)
_iqsqrt(a) //平方根 a^0.5
_iqisqrt(a) //平方根倒數 1/a^0.5
_iqmag(a, b) //求模運算(sqrt(a^2 + b^2)
其它函式
_iqsat(a, long p, long n)//iq數值的限幅函式 把a限制到[n p]之間
_iqnabs(a) //iq資料的絕對值 |a|
_iqabs(a) //iq資料的絕對值 |a|
參考:
基於c語言的q格式使用詳解
關於q格式資料總結
q格式數
q格式(q15)dsp上浮點資料定點化處理
iqmath的使用方法
TI的tms320系列DSP對比
三種新型tms320 dsp系列的特點 1.tms320c2000 作控制用的最佳dsp,可以替代老的 c1x和 c2x。現在有趨勢集中在以下兩個方向上 1 c20x 16位定點dsp,速度為20mips,主要用途是 數字相機 售貨機等,其中 f206帶有閃速儲存器,售價從5 17美元。2 c24x...
Q格式(Q15)DSP上浮點資料定點化處理
許多dsp都是定點dsp,處理定點資料會相當快,但是處理浮點資料就會非常慢。可以利用q格式進行浮點資料到定點的轉化,節約cpu時間。實際應用中,浮點運算大都時候都是既有整數部分,也有小數部分的。所以要選擇乙個適當的定標格式才能更好的處理運算。q格式表示為 qm.n,表示資料用m位元表示整數部分,n位...
定點dsp與浮點dsp的比較
定點運算dsp在應用中已取得了極大的成功,而且仍然是dsp應用的主體。然而,隨著對dsp處理速度與精度 儲存器容量 程式設計的靈活性和方便性要求的不斷提高 自80年代中後期以來,各dsp生產廠家陸續推出了各自的32bit浮點運算dsp。和定點運算dsp相比,浮點運算dsp具有許多優越性 浮點運算ds...