设置定点数学属性

此示例演示如何在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使用了 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

函数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);
        %删除y与其他fimaths的fimath冲突
        z(1)=(b(2)* x(j)+ z(2)) -  a(2)* removefimath(y(j));
        z(2)= b(3)* x(j) -  a(3)* removefimath(y(j));
    结束
    %清理:从输出中删除fimath
    y = removefimath(y);
    z = removefimath(z);
结束

代码生成说明

如果您有matlab编码器软件,则可以使用以下命令生成具有指定硬件特征的c代码。

N = 256;
t = 1:N;
xstep = [ones(N / 2,1);  -  ones(N / 2,1)];
num = [0.0299545822080925 0.0599091644161849 0.0299545822080925];
den = [1 -1.4542435862515900 0.5740619150839550];
b = fi(num,true,16);
a = fi(den,true,16);
x = fi(xstep,true,16,15);
zi = fi(零(2,1),真,16,14);
B = coder.Constant(b);
A = coder.Constant(a);
config_obj = coder.config(‘lib‘);
config_obj.GenerateReport = true;
config_obj.LaunchReport = true;
config_obj.TargetLang = ‘C‘ ;
config_obj.GenerateComments = true;
config_obj.GenCodeOnly = true;
config_obj.HardwareImplementation.ProdBitPerChar = 8;
config_obj.HardwareImplementation.ProdBitPerShort = 16;
config_obj.HardwareImplementation.ProdBitPerInt = 32;
config_obj.HardwareImplementation.ProdBitPerLong = 40;
代码生成-config  config_obj  setfimath_removefimath_in_a_loop  -args  {B,A,X,滋}  -launchreport

生成的c代码

函数fimathsetfimathremovefimath定点数学,但变量中包含的基础数据不会更改,因此生成的c代码不会生成任何数据副本。

void setfimath_removefimath_in_a_loop(const int16_T x [256],int16_T z [2],
  int16_T y [256])
{
  int32_T j;
  int40_T i0;
  int16_T b_y;
  /* 建立 */
  / *设置此函数的本地fimath * /
  / *用最近的舍入创建y * /
  / *算法* /
  for(j = 0; j <256; j ++){
    / *最近的分配到y * /
    i0 = 15705 * x [j] +((int40_T)z [0] << 20);
    b_y =(int16_T)((int32_T)(i0 >> 20)+((i0&524288L)!= 0L));
    / *删除y与其他fimaths的fimath冲突* /
    z [0] =(int16_T)(((31410 * x [j] +((int40_T)z [1] << 20)) - ((int40_T)( -  23826
      * b_y)<< 6))>> 20);
    z [1] =(int16_T)((15705 * x [j]  - ((int40_T)(9405 * b_y)<< 6))>> 20);
    y [j] = b_y;
  }
  / *清理:从输出中删除fimath * /
}

多态性代码

您可以编写matlab代码,这些代码可用于浮点和定点类型,使用setfimath setfimathremovefimath

function y = user_written_function(u)
     %Setup
    F = fimath(‘RoundingMethod‘,‘Floor‘,......
        ‘OverflowAction‘,‘Wrap‘,...
        ‘SumMode‘,‘KeepLSB‘);
    u = setfimath(u,F);
    %算法
    y = u + u;
    % 清理
    y = removefimath(y);
结束

定点输入

当使用定点输入调用该函数时,fimath F将用于算术,并且输出没有附加fimath

>> u = fi(pi / 8,true,16,15,‘RoundingMethod‘,‘Convergent‘);
>> y = user_written_function(u)
y =
             0.785400390625
           DataTypeMode:定点:二进制点缩放
             签名:签名
             WordLength:32
         分数长度:15

为固定点生成c代码

如果您有matlab编码器软件,则可以使用以下命令生成c代码。

>> u = fi(pi / 8,true,16,15,‘RoundingMethod‘,‘Convergent‘);
>> codegen user_written_function -args  {u}  -config:lib  -launchreport

函数fimathsetfimathremovefimath定点数学,但变量中包含的基础数据不会更改,因此生成的c代码不会生成任何数据副本。

int32_T user_written_function(int16_T u)
{
  /* 建立 */
  / *算法* /
  /* 清理 */
  回报你+你;
}

双输入

由于setfimath状语从句:removefimath的英文浮点类型的传递,user_written_function示例也适用于浮点类型。

function y = user_written_function(u)
     %Setup
    F = fimath(‘RoundingMethod‘,‘Floor‘,......
        ‘OverflowAction‘,‘Wrap‘,...
        ‘SumMode‘,‘KeepLSB‘);
    u = setfimath(u,F);
    %算法
    y = u + u;
    % 清理
    y = removefimath(y);
结束

为双精度生成的c代码

当使用浮点输入编译时,您将获得以下生成的c代码。

>> codegen user_written_function -args  {0}  -config:lib  -launchreport
real_T user_written_function(real_T u)
{
  回报你+你;
}

其中real_T类型被定义为double

typedef double real_T;

更多多态代码

编写此函数时,可以将输出创建为与输入的类型相同,因此浮点和定点都可以与输入一起使用。

function y = user_written_sum_polymorphic(u)
     %Setup
    F = fimath(‘RoundingMethod‘,‘Floor‘,...
        ‘OverflowAction‘,‘Wrap‘,...
        ‘SumMode‘,‘KeepLSB‘,...
        ‘SumWordLength‘, 32);
     u = setfimath(u,F);
     如果是isfi(你)
         y = fi(0,true,32,get(u,‘FractionLength‘),F);
     其他
         y =零(1,1,class(u));
     结束
     %算法
     对于i = 1:长度(u)
         y(:) = y + u(i);
     结束
     % 清理
     y = removefimath(y);
结束

固定点生成的c代码

如果您有matlab编码器软件,则可以使用以下命令生成定点c代码。

>> u = fi(1:10,true,16,11);
>> codegen user_written_sum_polymorphic -args  {u}  -config:lib  -launchreport

函数fimathsetfimathremovefimath定点数学,但变量中包含的基础数据不会更改,因此生成的c代码不会生成任何数据副本。

int32_T user_written_sum_polymorphic(const int16_T u [10])
{
  int32_T y;
  int32_T i;
  /* 建立 */
  y = 0;
  / *算法* /
  for(i = 0; i <10; i ++){
    y + = u [i];
  }
  /* 清理 */
  回归y;
}

生成的浮点c代码

如果您有matlab编码器软件,则可以使用以下命令生成浮点c代码。

>> u = 1:10;
>> codegen user_written_sum_polymorphic -args  {u}  -config:lib  -launchreport
real_T user_written_sum_polymorphic(const real_T u [10])
{
  real_T y;
  int32_T i;
  /* 建立 */
  y = 0.0;
  / *算法* /
  for(i = 0; i <10; i ++){
    y + = u [i];
  }
  /* 清理 */
  回归y;
}

其中real_T类型被定义为double

typedef double real_T;

整数类型上的setimath

按照既定的模式处理内置整数(fi对象),setfimath将整数输入转换为具有附加fimath的等效fi

>> u = int8(5);
>> codegen user_written_u_plus_u -args  {u}  -config:lib  -launchreport
function y = user_written_u_plus_u(u)
     %Setup
    F = fimath(‘RoundingMethod‘,‘Floor‘,...
        ‘OverflowAction‘,‘Wrap‘,...
        ‘SumMode‘,‘KeepLSB‘,...
        ‘SumWordLength‘, 32);
    u = setfimath(u,F);
    %算法
    y = u + u;
    % 清理
    y = removefimath(y);
结束

类型输出由fimath指定为32位。

int32_T user_written_u_plus_u(int8_T u)
{
  /* 建立 */
  / *算法* /
  /* 清理 */
  回报你+你;
}

关注公众号: MATLAB基于模型的设计 (ID:xaxymaker) ,每天推送MATLAB学习最常见的问题,每天进步一点点,业精于勤荒于嬉

打开微信扫一扫哦!

原文地址:https://www.cnblogs.com/52geek/p/10447850.html

时间: 2024-11-04 15:24:21

设置定点数学属性的相关文章

jQuery学习笔记(4)-设置元素的属性和样式

一.前言 本篇主要讲解如何使用jQuery获取和操作元素的属性和css样式 二."DOM属性"与元素属性 1.运行一下代码 <img src="/images/logo_small.gif" class="img_logo" /> 2.分析代码 元素属性src:/images/logo_small.gif 元素属性class:img_logo DOM属性currentSrc:http://localhost/images/logo_s

jQuery 设置内容和属性

设置内容 - text().html() 以及 val() 我们将使用前一章中的三个相同的方法来设置内容: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - 设置或返回表单字段的值 下面的例子演示如何通过 text().html() 以及 val() 方法来设置内容: 实例 $("#btn1").click(function(){  $("#test1").text("Hel

为什么设置的margin-top属性不管用

为什么设置的margin-top属性不管用:建议:尽可能的手写代码,可以有效的提高学习效率和深度.有时候大家可能会遇到奇怪的现象,尽管没有任何的语法错误,但是设置的margin-top属性不会起作用,下面就就结合代码实例介绍一下产生此现象的原因和解决方法.原因一:外边距合并margin-top属性失效.代码实例如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" co

ZeroMQ接口函数之 :zmq_ctx_set - 设置环境上下文属性

ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_ctx_set zmq_ctx_set(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ctx_set - 设置环境上下文属性 Synopsis int zmq_ctx_set (void *context, int option_name, int option_value); Description 函数 zmq_ctx_set() 将参数option_name指定的属性设置为参数op

C# - 设置DLL的属性Embed Interop Type 设为False

错误: Error msg: A reference was created to embedded interop assembly. because of an indirect reference to that assembly created by assembly. Consider changing the 'Embed Interop Types' property on either assembly. 解决方法: 将DLL的属性Embed Interop Type 设为Fal

有了这个,再也不用每次连新机器都要设置secure crt属性了

我连服务器用的是secure crt,每次ssh新服务器的时候都得手动设置字符编码和背景颜色,今天问了旁边的开发原来可以全局设置,以后连服务器的时候就再也不用手动设置相关属性了.步骤如下: 一开始点击Options--->Global Options--->Edit Default Settings 这里设置好你想要的属性,一般都是设置字符编码为utf8,把背景调为linux,就是背景为黑色的 接着点击Change ALL sessions保存后,以后连主机的时候就是你上一步你设置好的属性,这

设置表的属性值自动增加

设置表的属性值自动增加,比如插入第一条记录时 id 为 1,插入第二条记录时 id 为 2,以此类推,没增加一条记录,字段值自动加 1 mysql> CREATE TABLE tb_emp8    -> (    -> id INT(11) PRIMARY KEY AUTO_INCREMENT,   # 指定员工的编号自动递增    -> name VARCHAR(25) NOT NULL,    -> deptId INT(11),    -> salary FLOA

给li设置float浮动属性之后,无法撑开外层ul的问题。

最近在项目中有好几次遇到这个问题,感觉是浮动引起的,虽然用<div style="clear:both"></div>解决了,但自己不是特别明白,又在网上查了相关内容,是因为给li设置了浮动之后它就脱离当前正常的文档流,所以没办法撑开外层ul的高度. 以下面代码为例,其实有好几种解决方法,我用的这种并不是最简单的. <!DOCTYPE html ><html ><head><meta charset="utf-

如何为要被打印的内容设置CSS样式属性

如何为要被打印的内容设置CSS样式属性:有时候我们要打印的内容也是需要美观度的,并不希望太原汁原味了,所以要对其进行一下样式设置,本章节就简单介绍一下,如何利用CSS设置要被打印内容的样式,方式有多种,下面一一做一下简单介绍.一.使用link引入外部样式表: <link rel="stylesheet" href="css/style.css" media="screen" /> 以上代码的CSS样式用于屏幕显示效果,对于打印无效.关