此示例演示如何在matlab®代码中设置固定点数学属性。
您可以使用 fimath 对象控制赋值,加法,减法和乘法的定点数学属性。可以使用fimath
将fimath对象附加到 fi 对象。您可以使用从网络对象中删除fimath对象。
如果您有matlab编解码器?软件,则可以从示例中生成c代码。
设置和删除不动点数学属性
使用通过状语从句: fimath
删除函数 ,可以将定点操作与全局和本地 fimath 设置隔离开来。您还可以从没有附加到输出变量的函数返回。这使您可以对定点数学设置进行本地控制,而不会干扰其他函数中的设置。
matlab代码
function y = user_written_sum(u) %Setup F = fimath('RoundingMethod','Floor',... 'OverflowAction','Wrap',... 'SumMode','KeepLSB',... 'SumWordLength', 32); u = setfimath(u,F); y = fi(0,true,32,get(u,'FractionLength'),F); %算法 为 I = 1:长度(U) y(:) = y + u(i); 结束 %清理 y = removefimath(y); 结束
输出没有附加的fimath
当你运行代码时,fimath
控制函数内的算术,但返回值没有附加fimath
。这是由于在函数removefimath
使用了 setfimath和setfimath
。
>> u = fi(1:10,true,16,11); >> y = user_written_sum(u)
y = 55 DataTypeMode:定点:二进制点缩放 签名:签名 WordLength:32 分数长度:11
生成的c代码
如果您有matlab编码器软件,则可以使用以下命令生成c代码。
>> u = fi(1:10,true,16,11); >> codegen user_written_sum -args {u} -config:lib -launchreport
函数fimath
,setfimath
和removefimath
定点数学,但变量中包含的基础数据不会更改,因此生成的c代码不会生成任何数据副本。
int32_T user_written_sum(const int16_T u [10]) { int32_T y; int32_T i; /* 建立 */ y = 0; / *算法* / for(i = 0; i <10; i ++){ y + = u [i]; } /* 清理 */ 回归y; }
不匹配的菲马特
当您对fi
对象进行操作时,它们fimath
属性必须相等,否则您会收到错误。
>> A = fi(pi,'ProductMode','KeepLSB'); >> B = fi(2,'ProductMode','SpecifyPrecision'); >> C = A * B.
使用embedded.fi/mtimes时出错 两个操作数的embedded.fimath必须相等。
若要避免此错误,可以从表达式中的一个变量中删除fimath
。在本例中,表达式在上下文的中从fimath
中删除fimath,而不修改B
本身,并使用附加到fimath
的B
计算产品。
>> C = A * removefimath(B)
C =
6.283203125
DataTypeMode:定点:二进制点缩放 签名:签名 WordLength:32 分数长度:26
RoundingMethod:最近的 溢出动作:饱和 ProductMode:KeepLSB ProductWordLength:32 SumMode:FullPrecision
在临时变量上更改himath
如果您有没有附加fimath
的变量,但您想要控制特定的操作,则可以在表达式的上下文中附加fimath
,而无需修改变量。
例如,产品是用F
定义的fimath
计算的。
>> F = fimath('ProductMode','KeepLSB','OverflowAction','Wrap','RoundingMethod','Floor'); >> A = fi(pi); >> B = fi(2); >> C = A * setfimath(B,F)
C =
6.2832
DataTypeMode:定点:二进制点缩放 签名:签名 WordLength:32 分数长度:26
RoundingMethod:地板 OverflowAction:Wrap ProductMode:KeepLSB ProductWordLength:32 SumMode:FullPrecision MaxSumWordLength:128
请注意,变量B
不会更改。
>> B
B =
2
DataTypeMode:定点:二进制点缩放 签名:签名 WordLength:16 分数长度:13
消除循环中的fimath冲突
您可以计算产品和总和,使用dsp的累加器与地板舍入和包装溢出相匹配,并在输出上使用最近的舍入和饱和溢出。为了避免不匹配的fimath错误,可以在与其他变量一起计算时删除输出变量上的fimath
。
matlab代码
在本例中,产品为32位,累加器为40位,使最小位与地板舍入和包装溢出,就像c的本机整数规则一样。输出使用最近的舍入和饱和溢出。
function [y,z] = setfimath_removefimath_in_a_loop(b,a,x,z) %Setup F_floor = fimath('RoundingMethod','Floor',... 'OverflowAction','Wrap',... 'ProductMode',' KeepLSB',... 'ProductWordLength',32,... 'SumMode','KeepLSB',...... 'SumWordLength',40); F_nearest = fimath('RoundingMethod','最近',...... 'OverflowAction','Wrap'); %设置此函数的本地fimath b = setfimath(b,F_floor); a = setfimath(a,F_floor); x = setfimath(x,F_floor); z = setfimath(z,F_floor); %使用最近的舍入创建y y = coder.nullcopy(fi(zeros(size(x)),true,16,14,F_nearest)); %算法 为长度(X):J = 1 %最近分配成Y y(j)= b(1)* x(j)+ z(1);