单片机编程中浮点数转定点数Q15查找表的设计方法

目录

1、Q格式

2、转换方法 

3、量化精度

4、SIN查找表


        大多数的MCU、DSP中的浮点数处理单元都是定点浮点数处理单元,处理定点数据会相当快,但是处理浮点数据就会非常慢。可以利用Q格式进行浮点数据到定点的转化,节约CPU时间。实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才能更好的处理运算。

1、Q格式

        Q格式表示为:Qm.n,表示数据用m比特表示整数部分位宽,n比特表示小数部分位宽,共需要m+n+1位来表示这个数据,多余的一位用作符合位。假设小数点在n位的左边(从右向左数),从而确定小数的精度。

        例如Q15表示小数部分有15位,一个short型数据,占2个字节,最高位是符号位,后面15位是小数位,就假设小数点在第15位左边,表示的范围是:-1<X<0.9999695 。

2、转换方法 

        浮点数在定点化时,小数点位置可以随意定。最常用的还是定点化为-1~1之间,即最高位是符号位,小数点,后面全是数据位。编程时要心中明确小数点的位置。

        浮点数据转化为Q15,将数据乘以2^15;Q15数据转化为浮点数据,将数据除以2^15。

        例如:假设数据存储空间为2个字节,0.333×2^15=10911=0x2A9F,0.333的所有运算就可以用0x2A9F表示,同理10911/2^(15)=0.332977294921875。可以看出浮点数据通过Q格式转化后是有误差的。

3、量化精度

        如果浮点数表示为Qm.n格式,那么:

  • 整数部分有m位,最大表示为十进制数2^m-1;
  • 小数部分有n位,可表示十进制数范围:0≤ɑ≤(2^n-1)/2^n,当n比较大时,ɑ≈1,负数同理;
  • 整数+小数最大能表示十进制数为:(2^m-1)+(2^n-1)/2^n;

  • n位二进制数最大能表示2^n;所以此种量化方式的精度为t=((2^m-1)+(2^n-1)/2^n)/2^(m+n);

  • 浮点数定点化为:浮点数/t,并取整。误差百分比为:偏差/取整后的整数值。

        举例:将十进制数2.918量化为16位的(3位整数位宽,12位小数位宽,1个符号位)

  • 整数部分有3位,最大为111,表示为十进制数:2^3-1=7;
  • 小数部分12位,表示范围(2^12-1)/2^12≈1;
  • 整数+小数最大能表示7+1 =8;而3+12=15位二进制数最大能表示32768,所以此种量化方式的精度为t=(7+1)/32768;
  • 2.918定点化为:2.918/t=11952.128≈11952,定点化为有0.128的误差。误差百分比为0.128/11952=1.0710e-05。近似可以忽略不计。

4、sin查找表

        为了减少MCU、DSP的运算负荷,可以与先把需要MCU浮点单元计算的结果制作成一个表格,实际以运用时查找并直接应用表格中的结果。

        这里举例说明Q15浮点数转定点数的查找表的设计方法,浮点数(-1,1)之间,用Sin(-1,1)表达,角度范围 [0,360] 度。0位整数位宽,15位小数位宽,1个符号位。

  • 整数部分有0位,只能表示为0;
  • 小数部分15位,表示范围0≤ɑ≤(2^15-1)/2^15≈1。
  • 整数+小数最大能表示0+1=1;而15位二进制数最大能表示2^15=32768;所以此种量化方式的精度为t=(0+1)/32768。
  • 例如,0.918定点化为:0.918/t=30081.024≈30081,定点化有0.024的误差,误差百分比为0.024/30081=7.9785e-07,忽略不计。
/* Includes ------------------------------------------------------------------*/


/*******************************************************************************
  变量名: SinTable[]
  描述: sin查找表,
        表长(No. Entries):256  ,
        角度范围(Angle Range):360 deg
        Sin数值定标(Number forma)t:Q15 with range -1 < N < +1
********************************************************************************/
const int16  SinTable[] = {				
							0 , 	//			0		0			0
							804 , 	//			1		1.41     	0.0245
							1608 , 	//			2    	2.81     	0.0491
							2410 , 	//			3      	4.22     	0.0736
							3212 , 	//			4     	5.63     	0.0980
							4011 , 	//			5     	7.03     	0.1224
							4808 , 	//			6     	8.44     	0.1467
							5602 , 	//			7     	9.84     	0.1710
							6393 , 	//			8      	11.25     	0.1951
							7179 , 	//			9      	12.66     	0.2191
							7962 ,	//			10    	14.06     	0.2430
							8739 ,	//			11     	15.47     	0.2667
							9512 , 	//			12     	16.88     	0.2903
							10278, 	//			13     	18.28     	0.3137
							11039, 	//			14     	19.69     	0.3369
							11793, 	//			15     	21.09     	0.3599
							12539, 	//			16    	22.50     	0.3827
							13279, 	//			17     	23.91     	0.4052
							14010, 	//			18    	25.31     	0.4276
							14732, 	//			19     	26.72     	0.4496
							15446, 	//			20     	28.13     	0.4714
							16151, 	//			21    	29.53     	0.4929
							16846, 	//			22     	30.94     	0.5141
							17530,  //         	23     	32.34     	0.5350
							18204,  //         	24    	33.75     	0.5556
							18868,  //         	25       35.16     0.5758
							19519,  //         	26       36.56     0.5957
							20159,  //         	27       37.97     0.6152
							20787,  //         	28       39.38     0.6344
							21403,  //         	29       40.78     0.6532
							22005,  //         	30       42.19     0.6716
							22594,  //         	31       43.59     0.6895
							23170,  //         	32       45.00     0.7071
							23731,  //         	33       46.41     0.7242
							24279,  //         	34       47.81     0.7410
							24811,  //         	35       49.22     0.7572
							25329,  //         	36       50.63     0.7730
							25832,  //         	37       52.03     0.7883
							26319,  //         	38       53.44     0.8032
							26790,  //         	39       54.84     0.8176
							27245,  //         	40       56.25     0.8315
							27683,  //         	41       57.66     0.8449
							28105,  //         	42       59.06     0.8577
							28510,  //         	43       60.47     0.8701
							28898,  //         	44       61.88     0.8819
							29268,  //         	45       63.28     0.8932
							29621,  //         	46       64.69     0.9040
							29956,  //         	47       66.09     0.9142
							30273,  //         	48       67.50     0.9239
							30571,  //         	49       68.91     0.9330
							30852,  //         	50       70.31     0.9415
							31113,  //         	51       71.72     0.9495
							31356,  //         	52       73.13     0.9569
							31580,  //         	53       74.53     0.9638
							31785,  //         	54       75.94     0.9700
							31971,	//         	55       77.34     0.9757
							32137,  //         	56       78.75     0.9808
							32285,  //         	57       80.16     0.9853
							32412,  //         	58       81.56     0.9892
							32521,  //         	59       82.97     0.9925
							32609,  //         	60       84.38     0.9952
							32678,  //         	61       85.78     0.9973
							32728,  //         	62       87.19     0.9988
							32757,  //         	63       88.59     0.9997
							32767,  //         	64       90.00     1.0000
							32757,  //         	65       91.41     0.9997
							32728,  //         	66       92.81     0.9988
							32678,  //         	67       94.22     0.9973
							32609,  //         	68       95.63     0.9952
							32521,  //         	69       97.03     0.9925
							32412,  //         	70       98.44     0.9892
							32285,  //         	71       99.84     0.9853
							32137,  //         	72       101.25    0.9808
							31971,  //         	73       102.66    0.9757
							31785,	//         	74       104.06    0.9700
							31580,  //         	75       105.47    0.9638
							31356,  //         	76       106.88    0.9569
							31113,  //         	77       108.28    0.9495
							30852,  //         	78       109.69    0.9415
							30571,  //         	79       111.09    0.9330
							30273,  //         	80       112.50    0.9239
							29956,  //         	81       113.91    0.9142
							29621,  //         	82       115.31    0.9040
							29268,  //         	83       116.72    0.8932
							28898,  //         	84       118.13    0.8819
							28510,  //         	85       119.53    0.8701
							28105,  //         	86       120.94    0.8577
							27683,  //         	87       122.34    0.8449
							27245,  //         	88       123.75    0.8315
							26790,  //         	89       125.16    0.8176
							26319,  //         	90       126.56    0.8032
							25832,  //         	91       127.97    0.7883
							25329,  //         	92       129.38    0.7730
							24811,  //         	93       130.78    0.7572
							24279,  //         	94       132.19    0.7410
							23731,  //         	95       133.59    0.7242
							23170,  //         	96       135.00    0.7071
							22594,  //         	97       136.41    0.6895
							22005,  //         	98       137.81    0.6716
							21403,  //         	99       139.22    0.6532
							20787,  //         	100      140.63    0.6344
							20159,  //         	101      142.03    0.6152
							19519,  //         	102      143.44    0.5957
							18868,  //         	103      144.84    0.5758
							18204,  //         	104      146.25    0.5556
							17530,  //         	105      147.66    0.5350
							16846,  //         	106      149.06    0.5141
							16151,  //         	107      150.47    0.4929
							15446,  //         	108      151.88    0.4714
							14732,  //         	109      153.28    0.4496
							14010,  //         	110      154.69    0.4276
							13279,  //         	111      156.09    0.4052
							12539,  //         	112      157.50    0.3827
							11793,  //         	113      158.91    0.3599
							11039,  //         	114      160.31    0.3369
							10278,  //         	115      161.72    0.3137
							9512 ,  //         	116      163.13    0.2903
							8739 ,  //         	117      164.53    0.2667
							7962 ,  //         	118      165.94    0.2430
							7179 ,  //         	119      167.34    0.2191
							6393 ,  //         	120      168.75    0.1951
							5602 ,  //         	121      170.16    0.1710
							4808 ,  //         	122      171.56    0.1467
							4011 ,  //         	123      172.97    0.1224
							3212 ,  //         	124      174.38    0.0980
							2410 ,	//         	125      175.78    0.0736
							1608 ,	//         	126      177.19    0.0491
							804 ,  	//         	127      178.59    0.0245
							0 ,		//         	128      180.00    0.0000
							-804 ,	//         	129      181.41   -0.0245
							-1608 ,	//         	130      182.81   -0.0491
							-2410 ,	//         	131      184.22   -0.0736
							-3212 ,	//         	132      185.63   -0.0980
							-4011 ,	//         	133      187.03   -0.1224
							-4808 ,	//         	134      188.44   -0.1467
							-5602 ,	//         	135      189.84   -0.1710
							-6393 ,	//         	136      191.25   -0.1951
							-7179 ,	//         	137      192.66   -0.2191
							-7962 ,	//         	138      194.06   -0.2430
							-8739 ,	//         	139      195.47   -0.2667
							-9512 ,	//         	140      196.88   -0.2903
							-10278,	//         	141      198.28   -0.3137
							-11039,	//         	142      199.69   -0.3369
							-11793,	//         	143      201.09   -0.3599
							-12539,	//         	144      202.50   -0.3827
							-13279,	//         	145      203.91   -0.4052
							-14010,	//         	146      205.31   -0.4276
							-14732,	//         	147      206.72   -0.4496
							-15446,	//         	148      208.13   -0.4714
							-16151,	//         	149      209.53   -0.4929
							-16846,	//         	150      210.94   -0.5141
							-17530,	//         	151      212.34   -0.5350
							-18204,	//         	152      213.75   -0.5556
							-18868,	//         	153      215.16   -0.5758
							-19519,	//         	154      216.56   -0.5957
							-20159,	//         	155      217.97   -0.6152
							-20787,	//         	156      219.38   -0.6344
							-21403,	//         	157      220.78   -0.6532
							-22005,	//         	158      222.19   -0.6716
							-22594,	//         	159      223.59   -0.6895
							-23170,	//         	160      225.00   -0.7071
							-23731,	//         	161      226.41   -0.7242
							-24279,	//         	162      227.81   -0.7410
							-24811,	//         	163      229.22   -0.7572
							-25329,	//         	164      230.63   -0.7730
							-25832,	//         	165      232.03   -0.7883
							-26319,	//         	166      233.44   -0.8032
							-26790,	//         	167      234.84   -0.8176
							-27245,	//         	168      236.25   -0.8315
							-27683,	//         	169      237.66   -0.8449
							-28105,	//         	170      239.06   -0.8577
							-28510,	//         	171      240.47   -0.8701
							-28898,	//         	172      241.88   -0.8819
							-29268,	//         	173      243.28   -0.8932
							-29621,	//         	174      244.69   -0.9040
							-29956,	//         	175      246.09   -0.9142
							-30273,	//         	176      247.50   -0.9239
							-30571,	//         	177      248.91   -0.9330
							-30852,	//         	178      250.31   -0.9415
							-31113,	//         	179      251.72   -0.9495
							-31356,	//         	180      253.13   -0.9569
							-31580,	//         	181      254.53   -0.9638
							-31785,	//         	182      255.94   -0.9700
							-31971,	//         	183      257.34   -0.9757
							-32137,	//         	184      258.75   -0.9808
							-32285,	//         	185      260.16   -0.9853
							-32412,	//         	186      261.56   -0.9892
							-32521,	//         	187      262.97   -0.9925
							-32609,	//         	188      264.38   -0.9952
							-32678,	//         	189      265.78   -0.9973
							-32728,	//         	190      267.19   -0.9988
							-32757,	//         	191      268.59   -0.9997
							-32767,	//         	192      270.00   -1.0000
							-32757,	//         	193      271.41   -0.9997
							-32728,	//         	194      272.81   -0.9988
							-32678,	//         	195      274.22   -0.9973
							-32609,	//         	196      275.63   -0.9952
							-32521,	//         	197      277.03   -0.9925
							-32412,	//         	198      278.44   -0.9892
							-32285,	//         	199      279.84   -0.9853
							-32137,	//         	200      281.25   -0.9808
							-31971,	//         	201      282.66   -0.9757
							-31785,	//         	202      284.06   -0.9700
							-31580,	//         	203      285.47   -0.9638
							-31356,	//         	204      286.88   -0.9569
							-31113,	//         	205      288.28   -0.9495
							-30852,	//         	206      289.69   -0.9415
							-30571,	//         	207      291.09   -0.9330
							-30273,	//         	208      292.50   -0.9239
							-29956,	//         	209      293.91   -0.9142
							-29621,	//         	210      295.31   -0.9040
							-29268,	//         	211      296.72   -0.8932
							-28898,	//         	212      298.13   -0.8819
							-28510,	//         	213      299.53   -0.8701
							-28105,	//         	214      300.94   -0.8577
							-27683,	//         	215      302.34   -0.8449
							-27245,	//         	216      303.75   -0.8315
							-26790,	//         	217      305.16   -0.8176
							-26319,	//         	218      306.56   -0.8032
							-25832,	//         	219      307.97   -0.7883
							-25329,	//         	220      309.38   -0.7730
							-24811,	//         	221      310.78   -0.7572
							-24279,	//         	222      312.19   -0.7410
							-23731,	//         	223      313.59   -0.7242
							-23170,	//         	224      315.00   -0.7071
							-22594, //         	225      316.41   -0.6895
							-22005,	//         	226      317.81   -0.6716
							-21403, //         	227      319.22   -0.6532
							-20787, //         	228      320.63   -0.6344
							-20159, //         	229      322.03   -0.6152
							-19519, //         	230      323.44   -0.5957
							-18868, //         	231      324.84   -0.5758
							-18204, //         	232      326.25   -0.5556
							-17530, //         	233      327.66   -0.5350
							-16846, //         	234      329.06   -0.5141
							-16151,	//         	235      330.47   -0.4929
							-15446, //         	236      331.88   -0.4714
							-14732, //         	237      333.28   -0.4496
							-14010, //         	238      334.69   -0.4276
							-13279, //         	239      336.09   -0.4052
							-12539, //         	240      337.50   -0.3827
							-11793, //         	241      338.91   -0.3599
							-11039, //         	242      340.31   -0.3369
							-10278,	//			243      341.72   -0.3137
							-9512 , //         	244      343.13   -0.2903
							-8739 ,	//         	245      344.53   -0.2667
							-7962 ,	//         	246      345.94   -0.2430
							-7179 ,	//         	247      347.34   -0.2191
							-6393 ,	//         	248      348.75   -0.1951
							-5602 ,	//         	249      350.16   -0.1710
							-4808 ,	//         	250      351.56   -0.1467
							-4011 ,	//         	251      352.97   -0.1224
							-3212 ,	//         	252      354.38   -0.0980
							-2410 ,	//         	253      355.78   -0.0736
							-1608 ,	//         	254      357.19   -0.0491
							-804 ,	//         	255      358.59   -0.0245
							0    	//         	256      360.00    0.0000
};