目录
1、归一化概念:
就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。归一化的目的是为了我们后面数据处理的方便。
2、角度归一化:
2.1、角度都为正:
一个周期内的电角度是0~360°,那么可以把0~360°的值变到0~1这个区间里,具体归一化方式为:
归一化之后的值 = 实际的角度/360
比如30°,归一化之后就变为:30/360 = 1/12 = 0.0833333333
2.2、角度有正负:
如果角度的表示是±180°表示,那么归一化得到的值是-1~1这个区间,具体归一化方式为:
归一化之后的值 = 实际角度/180
比如60°,归一化之后就变为:60/180 = 1/3 = 0.33333333
3、正弦数据归一化:
在一个电周期内,正弦值数据有正有负,变化范围在-1~1之间。16位有符号数表示的范围是-32768~32767,即0x8000~0x7fff。那么这里-32768表示为-1,32767表示为0.9999999。
sin(-30°) = -0.5,这个值在正弦表中应该如何表示?(-1 / 2) * 32768 = -16384
sin(-60°) = 根号3/2,这个值在正弦表中应该如何表示? (1.732 / 2) * 32768 = 28377
4、定点小数格式
归一化将一个数变到0~1或者-1~1,但是在0~1和-1~1之间都是小数,对于没有浮点运算单元的单片机来说,对小数进行数学运算会耗费大量的时间。
归一化就是要将小数运算改成整数运算了,对于一般的单片机都内置了整数乘法单元,整数数学运算的速度会比小数数学运算快很多了。
定点小数格式概念:约定单片机中所有数据的小数点位置是固定不变的,数据的最高位表示符号位,小数点是隐含在符号位之后的,这种格式通常被称为1.15或Q15格式,1.15中的1表示数据整数部分的位数,15表示小数部分的位数。
如下图所示,对于一个16位的数来说,把最高位作为符号位,然后小数点是隐含在符号位后面的,剩余的15位作为数据位。
5、归一化总结
5.1、正小数
一个正的小数,可以用公式:16位有符号数表示的小数 = 对应的小数 * 32768
例:16384 = 0.5*32768
5.2、负小数
一个负的小数,可以用公式:16位有符号表示的小数 = 对应的小数 * 32768
例:-19661 = -0.6 * 32768
5.3、归一化在程序中表示
具体在程序里面角度的表示方法,可以用下列公式:
①、16位无符号数表示的角度 = (对应的角度数 / 360°)* 65535 无符号数的表示
例:90°表示 16384 = (90 / 360) * 65535
②、16位有符号数来表示角度的话,0°~180°,0°~-180°,可以用下式表示:
正数:16位有符号表示的角度 = (对应的角度数 / 180°) * 32767
例:90°表示 16384 = (90/180) * 32768
负数:16位有符号表示的角度 = (对应的角度数 / 180°) * 32768
例:-90°表示 -16384 = (-90/180) * 32768
6、两个小数相乘归一化举例
6.1、两个归一化小数相乘归一化(无符号小数 * 有符号小数 = 有符号小数)
两个归一化后的数,当成整数相乘后它的结果的归一化值就隐藏在结果的高16位部分。
无符号小数 * 有符号小数 = 结果取归一化的高16位(这个16位按有符号小数计算)
①、比如32767*32767,前面一个32767相当于0.5(无符号小数),后面一个32767相当于1(有符号小数)。
如果是小数相乘,那么得到的结果是0.5*1=0.5。
用归一化后数相乘32767*32767 = 1073676298 = 0x3FFF0001,取高16位 = 0x3FFF = 16383 = 0.5(有符号小数)
②、比如32767*16383,前面一个32767相当于0.5(无符号小数),后面一个16383相当于0.5(有符号小数)。
如果是小数相乘,那么得到的结果是0.5*0.5=0.25。
用归一化后数相乘32767*16383 = 536,821,761= 0x1FFF4001,取高16位 = 0x1FFF = 8191 = 0.25(有符号小数)