Q格式 TI的dsp的IQmath學習

2021-10-24 02:30:49 字數 3348 閱讀 7275

接觸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...