自动定点转换的最佳实践
创建一个测试文件
构建代码的一个最佳实践是将从其他代码,你使用你的核心算法测试和验证结果。创建一个测试文件调用原始的MATLAB®算法和算法的定点版本。例如,如下表所示,您可以设置一些输入数据融入到你的算法,然后,在你处理这些数据,创建一些情节来验证结果。因为你只需要转换不动点算法部分,结构是更高效的代码,这样你有一个测试文件,你创造你的输入,打电话给你的算法,和阴谋的结果,和一个(或更多)算法的文件,在你的核心处理。
原始代码 | 最佳实践 | 修改后的代码 |
---|---|---|
%测试输入x = randn (100 1);%算法y = 0(大小(x));y = x (1) (1);长度为n = 2: y (n) (x) = y (n - 1) + x (n);结束%验证结果yExpected = cumsum (x);情节(y-yExpected)标题(“错误”) |
问题 生成测试输入和验证的结果是混合算法的代码。 修复 创建一个测试文件分开你的算法。把算法的函数。 |
测试文件 %测试输入x = randn (100 1);%算法y = cumulative_sum (x);%验证结果yExpected = cumsum (x);情节(y-yExpected)标题(“错误”) 算法的功能 函数y = cumulative_sum (x) y = 0(大小(x));y = x (1) (1);长度为n = 2: y (n) (x) = y (n - 1) + x (n);结束结束 |
您可以使用测试文件:
验证您的浮点算法表现如你希望在你想把它转换成固定。浮点算法行为的基线,你比较你的算法的定点版本的行为。
提出定点数据类型。
比较的行为定点算法浮点基线版本。
帮助您确定初始值静态范围。
默认情况下,MATLAB编码器™应用程序显示了代码覆盖率结果。你的测试文件应该行使算法对其完整的操作范围,以便模拟范围是准确的。例如,对于一个过滤器,现实的输入是脉冲,大笔的正弦曲线,线性调频信号。这些输入,使用线性理论,可以验证输出是正确的。信号产生最大输出可用于验证您的系统不溢出。提出的质量定点数据类型取决于算法的测试文件覆盖操作范围的准确性。审查代码覆盖率结果帮助你验证测试文件充分行使算法。评审代码标记为红色的代码覆盖酒吧因为这段代码不执行。如果代码覆盖率不足,修改测试文件或添加更多的测试文件增加覆盖范围。看到代码覆盖率。
准备加速算法代码或代码生成
自动转换过程工具代码,并提供数据类型建议帮助你转换算法定点。
MATLAB算法,您想要转换为定点自动代码生成必须符合要求和规则。查看子集的MATLAB语言支持代码生成金宝app函数和对象支持C / c++代码生成金宝app。
帮助你识别在MATLAB代码中不支持的功能或结金宝app构,添加% # codegen
MATLAB文件编译指示的。MATLAB代码分析器旗帜函数和构造在MATLAB语言的子集支持代码生成。金宝app这个建议实时出现在当你在MATLAB中编辑您的代码编辑器。有关更多信息,请参见检查代码的代码分析器。该软件提供了一个链接到一个报告,该报告将调用函数和使用不支持的数据类型代码生成。金宝app有关更多信息,请参见检查代码通过使用代码生成工具。
检查定点支持函数中使用的算法金宝app
应用程序标记不受支持的函数调用中金宝app发现你的算法函数替换选项卡。例如,如果您使用fft
函数,它不支持定点,该工具将一个条目添加到表选金宝app项卡并表明你需要指定一个替代函数用于定点操作。
您可以指定额外的替代功能。例如,函数罪
,因为
,√6
可能支持定点金宝app,但为了更好的效率,您可能想要考虑另一个实现一个查找表或CORDIC-based算法。这个应用程序提供了一个选项来生成的查找表近似连续和无状态输入,对于功能在原来的MATLAB代码。看到使用查找表替换函数近似。
管理数据类型和控制增长
自动转换过程定点自动管理数据类型和控制增长。它控制增长使用下标赋值,也就是说,使用冒号(:)操作员的作业,在生成的代码。当你使用下标作业,MATLAB覆盖左边的论点,但是保留了现有的数据类型和数组的大小。除了防止一些增长,下标赋值减少了投射在定点生成代码的数量,使代码更加可读。
转换为定点
你的目标转换成固定的点是什么?
在你开始转换之前,考虑你的目标转换成固定的点。你实现你的算法用C或HDL ?你的目标约束是什么?这些问题的答案确定等定点属性可用的字长,部分长度,和数学模式,以及可用的数学库。
要设置这些属性,可以使用先进的设置。
有关更多信息,请参见指定类型的建议选项。
运行与定点类型和比较结果
创建一个测试文件验证浮点算法是将它转换为定点之前预期。您可以使用相同的测试文件提出定点数据类型,并比较定点结果后的浮点基准转换。有关更多信息,请参见运行一个仿真和日志数据的直方图。
使用直方图来调整数据类型设置
调整定点类型设置,使用直方图。日志数据的直方图,在应用程序,单击分析箭头并选择日志数据的直方图
。
经过仿真和静态分析:
把一个变量的直方图,在变量选项卡上,单击建议类型字段的变量。
您可以查看更改的影响提出了数据类型通过拖动的边界框的边缘直方图窗口改变拟议中的数据类型和选择或清除签署选择。
如果值溢出和不能适应范围提出了类型,提出类型表显示为红色。
当工具适用于数据类型,它生成一个html报告,提供溢出信息用红色和高光溢出。检查该数据类型。
优化算法
使用fimath获得最佳类型C或高密度脂蛋白
fimath
属性定义的规则执行算术运算fi
对象,包括数学、舍入和溢出的属性。您可以使用fimath
ProductMode
和SumMode
保留最优属性的数据类型C或高密度脂蛋白。高密度脂蛋白可以任意单词长度类型生成的HDL代码而C需要容器类型(uint8
,uint16
,uint32
)。使用先进的设置,请参阅指定类型的建议选项。
C。的KeepLSB
设置ProductMode
和SumMode
模型的行为整数操作在C语言中,KeepMSB
许多DSP设备的行为模型。不同的舍入方法代码需要不同数量的开销。设置RoundingMethod
财产地板上
,相当于二进制补码截断,提供最有效的舍入的实现。同样,标准的方法来处理溢出是包装使用模运算。其他溢出处理方法创建昂贵的逻辑。只要有可能,集OverflowAction
来包装
。
MATLAB代码 | 最佳实践 | 生成的C代码 | |
---|---|---|---|
代码被编译 函数y =加法器(a, b) y = a + b;结束 请注意 的应用,集默认字长来 |
问题 使用默认字长16和默认 |
整数加法器(短,短b) {int y;int我;int i1;int i2;int i3;我=;i1 = b;如果((& 65536)! = 0){i2 =我| -65536;其他}{i2 =我& 65535;}如果((i1 & 65536) ! = 0) {i3 = i1 | -65536; } else { i3 = i1 & 65535; } i = i2 + i3; if ((i & 65536) != 0) { y = i | -65536; } else { y = i & 65535; } return y; } |
|
修复 使生成的C代码更高效,选择定点数学设置匹配您的处理器类型。 定制定点类型建议,使用应用程序设置。选择fimath然后设置: |
整数加法器(短,短b){返回a + b;} |
||
舍入方法 | 地板上 | ||
溢出的行动 | 包装 | ||
产品模式 | KeepLSB | ||
和模式 | KeepLSB | ||
产品字长 | 32 | ||
和字长 | 32 |
高密度脂蛋白。设置为HDL代码生成:
ProductMode
和SumMode
来FullPrecision
溢出的行动
来包装
舍入方法
来地板上
用更有效的定点实现替换内置函数
一些MATLAB内置函数可以更高效的为定点实现。例如,你可以换一个内置函数与一个查找表实现,或CORDIC的实现,只需要迭代shift-add操作。有关更多信息,请参见函数替换。
在可能的情况下重装师操作
通常,部门不完全支持硬件和可能导致缓慢的处理。金宝app当你的算法需要一个部门,考虑换成以下选项之一:
使用移位当分母是2的幂。例如,
bitsra (x, 3)
而不是x / 8
。乘以逆当分母是恒定的。例如,
x * 0.2
而不是x / 5
。如果除数不是常数,用一个临时变量。这样做的结果在一个更高效的数据类型的提议,如果发生溢出,使它更容易看到这表情是满溢的。
消除浮点变量
更高效的代码,自动定点转换过程消除浮点变量。一个例外是循环指数,因为他们通常成为整数类型。是一种很好的做法检查定点代码转换后确认没有浮点变量在代码生成的定点。
避免显式和单投下的两倍
自动化工作流,不要使用显式双或单投在你的MATLAB算法使功能不支持定点数据类型。金宝app自动转换工具不支持这些类型强制转换。金宝app
而不是使用强制类型转换,提供一个替代函数。有关更多信息,请参见函数替换。