在使用MATLAB coder做定点化的时候,发现有时候的索引会变成0,比如如下的代码中的k
fm = get_fimath();
idx = fi(1,0,1,0,fm);
a = (idx+fi(2,0,2,0,fm))*fi(1/3,0,16,17,fm);
k = fi(a,0,17,0,fm)
function fm = get_fimath()
fm = fimath('RoundingMethod', 'floor',...
'OverflowAction', 'Wrap',...
'ProductMode','FullPrecision',...
'MaxProductWordLength', 128,...
'SumMode','FullPrecision',...
'MaxSumWordLength', 128);
end
后来发现错误的地方在于RoundingMethod设置为了floor,导致a是一个无限趋近于1但小于1的数,所以k在定点的时候会变成0。
之后在寻找错误的原因,感觉是对WordLength和FractionLength的理解上产生了偏差。
WordLength:代表了用于表示整数部分需要的bit数,而非定点数据总长度
FractionLength:代表了以2为底的幂数,也就是二进制中小数部分的长度。
例如上式中fi(1/3,0,16,17,fm),表示了这会被定点为一个小于0.5的数(0.33333)。
以上的内容均可以参考这篇回答