主要内容

检测溢出

这个例子展示了如何检测溢出在命令行。在转换过程中数值测试阶段,使用缩放工具模拟了定点代码双打。然后报告表达式在生成的代码中产生溢出定点数据类型的值。

先决条件

完成这个例子中,您必须安装以下产品:下载188bet金宝搏

  • MATLAB®

  • MATLAB编码器™

  • 定点设计师™

在当地,可写的文件夹中,创建一个函数,溢出

函数y =溢出(b, x,重置)如果输入参数个数< 3,重置= true;结束持续的z p如果isempty (z) | |重置p = 0;z = 0(大小(b));结束(y, z, p) = fir_filter (b, x, z, p);结束函数(y, z, p) = fir_filter (b, x, z, p) y = 0(大小(x));nx =长度(x);nb =长度(b);n = 1: nx p = p + 1;如果p > nb, p = 1;结束z (p) = x (n);acc = 0;k = p;j = 1: nb acc = acc + b (j) * z (k);k = k - 1;如果k < 1, k =注;结束结束y (n) = acc;结束结束

创建一个测试文件,overflow_test.m行使溢出算法。

函数overflow_test%的滤波器系数计算使用FIR1函数%信号处理工具箱。0.25 b % = fir1(11日);b = (-0.004465461051254 - -0.004324228005260 + 0.012676739550326 + 0.074351188907780 + 0.172173206073645 + 0.249588554524763 + 0.249588554524763 + 0.172173206073645 + 0.074351188907780 + 0.012676739550326 -0.004324228005260 -0.004465461051254) ';%输入信号nx = 256;t = linspace(0, 10 *π,nx) ';%的冲动x_impulse = 0 (nx, 1);x_impulse (1) = 1;%最大增益%时,将发生的最大增益滤波器输入线了%的信号滤波器的脉冲响应。x_max_gain = (b)的迹象;x_max_gain = repmat (x_max_gain装天花板(nx /长度(b)), 1);x_max_gain = x_max_gain (1: nx);%的正弦f0 = 0.1;f1 = 2;x_sines =罪(2 *π* t * f0) + 0.1 *罪(2 *π* t * f1);%唧唧声f_chirp = 1/16;%的目标频率x_chirp =罪(π* f_chirp * t ^ 2);%线性啁啾x = [x_impulse x_max_gain、x_sines x_chirp);标题= {“冲动”,“马克斯增益”,正弦的总和,“唧唧喳喳”};y = 0(大小(x));i = 1:尺寸(x, 2)重置= true;y (:, i) =溢出(b, x (:, i),重置);结束test_plot(1、标题、t, x, y)结束函数test_plot(图、标题、t, x, y₁)图(图)clf sub_plot = 1;font_size = 10;i = 1:尺寸(x, 2)次要情节(4 1 sub_plot) sub_plot = sub_plot + 1;情节(t) x(:,我)“c”、t、y₁(:,我)“k”)轴(“紧”)包含(“t”,“字形大小”,font_size);标题(标题{},“字形大小”,font_size);甘氨胆酸ax =;斧子。字形大小= 10;结束图(gcf)结束

创建一个coder.FixptConfig对象,fixptcfg默认设置。

fixptcfg = coder.config (“fixpt”);

设置试验台的名字。在这个例子中,试验台函数名overflow_test

fixptcfg。TestBenchName =“overflow_test”;

设置默认字长为16。

fixptcfg。DefaultWordLength = 16;

使溢出检测。

fixptcfg。TestNumerics = true;fixptcfg。DetectFixptOverflows = true;

设置fimath产品模式和模式KeepLSB。这些设置模型C语言中的整数操作的行为。

fixptcfg。fimath =fimath (“RoundingMethod”,“地板”,“OverflowAction”,“包装”,“ProductMode”,“KeepLSB”、“SumMode”、“KeepLSB”)”;

创建一个C代码生成配置对象生成一个独立的静态库。

cfg = coder.config (“自由”);

将浮点MATLAB函数,溢出定点C代码。你不需要指定的输入类型codegen命令,因为它推断从测试文件类型。

codegen-float2fixedfixptcfg配置cfg溢出

了数值测试阶段报告溢出。

溢出错误表达的acc + b (j) * z (k)”。当前范围的比例= 104%。

确定这个表达式溢出的加法或乘法。设置fimathProductMode来FullPrecision所以乘法不会溢出,然后运行codegen再次命令。

fixptcfg。fimath =fimath (“RoundingMethod”,“地板”,“OverflowAction”,“包装”,“ProductMode”,“FullPrecision”、“SumMode”、“KeepLSB”)”;codegen-float2fixedfixptcfg配置cfg溢出

了数值测试阶段仍然报告溢出,表明它是满溢的表达式中。