设为首页 加入收藏

TOP

设置定点数学属性(一)
2019-08-27 07:33:32 】 浏览:76
Tags:设置 定点 数学 属性

此示例演示如何在matlab®代码中设置固定点数学属性。

您可以使用 fimath 对象控制赋值,加法,减法和乘法的定点数学属性。可以使用fimathfimath对象附加到 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使用了 setfimathsetfimath

>> 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

函数fimathsetfimathremovefimath定点数学,但变量中包含的基础数据不会更改,因此生成的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本身,并使用附加到fimathB计算产品

>> 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);
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇ARM与FPGA通过spi通信设计1.spi基.. 下一篇Lcd(一)显示原理

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目