Matlab定点化

当要对于算法的硬件实现,使用Matlab进行定点化仿真非常重要,网上Matlab定点化仿真的资料比较少,下面是我总结的资料。
Matlab定点化三种方法:
1.使用round、floor等函数在每次运算后直接进行截断
各种截断方法:
ceil() 向上取整
fix() 向0取整
floor() 舍弃小数部分(向下取整)
round() 四舍五入取整
直接截断取整可能会出现高频噪声,最好使用四舍五入取整。

2.使用num2fixpt()函数进行截断
num2fixpt(19.875, sfix(8), 2^-2, 'Floor', 'on')  = 19.75
num2fixpt(19.875, sfix(8), 2^-3, 'Floor', 'on')  = 15.875
num2fixpt(19.875, sfix(9), 2^-3, 'Floor', 'on')  = 19.875

3.使用fi对象进行定点化:
(1)首先定义fimath对象和numerictype对象
fimath对象:定义运算模式和位数
numerictype对象:定义数据位数
numerictype中FractionLength可以大于WordLength-1,但是这样高位的小数位会被舍去,也可以用'Slope'属性指定。如:
F = fimath('CastBeforeSum', 0, 'OverflowMode', 'Saturate', ...
  'RoundMode', 'floor', 'ProductMode', 'SpecifyPrecision', 'SumMode', 'SpecifyPrecision', ...
  'ProductWordLength', 16, 'ProductFractionLength', 14, 'SumWordLength', 16, 'SumFractionLength', 14);
T = numerictype('WordLength', 16, 'FractionLength', 14);
(2)用fimath对象和numerictype对象定义浮点数的fi对象
如:fi( x, numerictype, fimath );
(3)利用定义好的fi对象进行运算
该方法对定点过程处理的细节定义的比较详细灵活,不需要每一步运算定点化一次,但是对很多函数不兼容,需要写一些基本函数
用double可以将fi对象变成普通的对象。
另外,还有专门CORDIC函数处理fi对象的运算问题。
isfimathlocal可以用来判断是否有local fimath对象。 使用isfi可以判断是否为fi对象。可以用F = a.fimath获得fimath对象,用T = a.numerictype获得numerictype对象。

为了确保运算过程不会出问题,比如需要检测定点运算过程中特有的溢出问题,方法如下:
使用fipref函数检测
如:
fipref('LoggingMode', 'on', 'DataTypeOverride', 'ForceOff');
......
fipref('LoggingMode', 'off');
可以检测运算过程溢出等问题,而溢出分为上溢和下溢:
上溢是数值太大,约化为最大值或变为负值等各种情况
下溢是数值接近0倍约为0


附注:
输出方法:
对于fi对象a,a.bin,a.dec和a.hex表示a的二进制,十进制和十六进制表示,还可以用a.int输出有符号数。
关于除法:
定点运算能不用除法就不用除法,除法容易出问题。对于fi对象的方法,它的小数点定标会发生改变,假设被除数和除数小数位一样,那么商的小数位长会变为0。如果被除数小数位更大,此时商才有小数位长,而当除数小数位更长时,商的小数位长(FractionLength)会变为负值。使用devide(numerictype, a, b)进行更精细的操作也许能避免这些错误,或者使用cordic函数。
关于cordic函数:
cordicangle(u)获得u的角度,范围在[-pi, pi]内,定点化时默认输出位长16位,小数位13。
cordicrotate(angle, u)将u旋转。
关于运算单元输出宽度:
累加器的输出和加法数量有关,对于等长的数宽W,加数为L,则最终宽度为W+log2(L)-1
滤波器定点化仿真:
使用filter函数对filter定点化的对象a和数据b直接处理,如:filter(a, b)
关于CIC滤波器等一些滤波器处理则比较复杂,使用的是dsp工具箱,在获得合适的CIC参数后,还要将数据处理成dsp对象,如:
hsr = dsp.SignalSource( ee.', length(ee) );  %变成工具箱能处理的数据对象
hcicint = dsp.CICInterpolator(l, 1, nsecs);
Tx = step( hcicint, step(hsr) );


运算精度控制:
使用digits和vpa函数可以控制Matlab运算的精度
其中digits指定了vpa处理变量的数值有效位数,该方法会大大降低运算速度,慎用

double 转化为双精度,一般的数值计算都是double型的
single 转化为单精度
eps可以得到与数轴上下一个数的数值差

猜你喜欢

转载自blog.csdn.net/truecrab/article/details/79486431
今日推荐