使用最小/最大仪表设置数据类型
这个例子展示了如何设置定点数据类型通过测量MATLAB®代码的最小/最大日志记录和使用工具提出数据类型。
你将使用的函数是:
buildInstrumentedMex
-建立MEX功能,并启用检测showInstrumentationResults
-显示仪表结果clearInstrumentationResults
-明确的仪器检测结果
被测单元
在这个例子中转换为定点的函数是一个二阶直接形式的2转置滤波器。您可以用您自己的函数来代替这个函数,从而在您自己的工作中再现这些步骤。
函数[y, z] = fi_2nd_order_df2t_filter (b, a, x, y, z)为I =1:长度(x) y(I) = b(1)*x(I) + z(1);Z (1) = b(2)*x(i) + Z (2) - a(2) * y(i);Z (2) = b(3)*x(i) - a(3) * y(i);结束结束
对于一个要被仪器化的MATLAB函数,它必须适合代码生成。有关代码生成的信息,请参见参考页buildInstrumentedMex
.不需要使用MATLAB®Coder™许可证buildInstrumentedMex
.
在这个函数中,变量y
而且z
用作输入和输出。这是一个重要的模式,因为:
的数据类型
y
而且z
在函数外部,从而允许对定点和浮点类型重用函数。生成的C代码将创建
y
而且z
作为函数参数列表中的引用。有关此模式的更多信息,请参阅MATLAB®>用户指南中的代码生成>生成高效和可重用的代码>生成高效的代码>消除函数输入的冗余副本。
运行以下代码将测试函数复制到一个临时目录中,这样这个示例就不会影响到您自己的工作。
tempdirObj = fidemo.fiTempdir (“fi_instrumentation_fixed_point_filter_demo”);
拷贝文件(fullfile (matlabroot,“工具箱”,“定点”,“fidemos”,' + fidemo ',...“fi_2nd_order_df2t_filter.m”),“。”,“f”);
运行以下代码以捕获当前状态,并重置全局状态。
FIPREF_STATE = (fipref);重置(fipref)
数据类型由设计要求确定
在本例中,设计的需求决定了输入的数据类型x
.这些要求是有符号的、16位的和分数的。
N = 256;x = fi (0 (N, 1), 1, 16日15);
设计的要求还决定了具有40位累加器的DSP目标的定点数学。这个示例使用舍入和换行溢出来生成有效的生成代码。
F = fimath (“RoundingMethod”,“地板”,...“OverflowAction”,“包装”,...“ProductMode”,“KeepLSB”,...“ProductWordLength”现年40岁的...“SumMode”,“KeepLSB”,...“SumWordLength”, 40);
下面的系数对应于创建的二阶低通滤波器
(num窝]=黄油(0.125 2,)
系数的值影响将分配给过滤器输出和状态的值的范围。
Num = [0.0299545822080925 0.0599091644161849 0.0299545822080925];Den = [1 -1.4542435862515900 0.5740619150839550];
系数的数据类型由设计的要求决定,被指定为16位字长,并缩放到最佳精度。用于创建的模式fi
常系数的对象为:
1.将系数转换为fi
使用默认的四舍五入到最近和饱和溢出设置的对象,这使系数具有更好的准确性。
2.附加fimath
使用舍入和换行溢出设置来控制算术,这导致了更高效的C代码。
b = fi (num 1 16);b.fimath = F;一个= fi(窝,1 16);a.fimath = F;
方法将筛选器系数作为常量传递给buildInstrumentedMex
命令。
B = coder.Constant (B);= coder.Constant ();
由系数和输入值确定的数据类型
系数的值和输入的值决定了输出的数据类型y
和状态向量z
.使用缩放的双数据类型创建它们,这样它们的值将达到完整的范围,您可以识别潜在的溢出并提出数据类型。
yisd = fi (0 (N, 1), 1, 16日15日“数据类型”,“ScaledDouble”,“fimath”F);zisd = fi(0(2, 1), 1, 16日15日“数据类型”,“ScaledDouble”,“fimath”F);
测量MATLAB®函数作为缩放双MEX函数
方法从MATLAB®函数中创建MEX函数来检测MATLAB®代码buildInstrumentedMex
命令。的输入buildInstrumentedMex
和的输入相同吗fiaccel
,但buildInstrumentedMex
没有fi
对象的限制。的输出buildInstrumentedMex
是一个插入插装的MEX函数,因此当MEX函数运行时,将记录所有命名变量和中间值的模拟最小值和最大值。
使用“o”
选项,为生成的MEX函数命名。如果不使用“o”
选项,那么MEX函数就是MATLAB®函数的名称“_mex”
附加。您也可以将MEX函数命名为与MATLAB®函数相同的名称,但您需要记住,MEX函数优先于MATLAB®函数,因此对MATLAB®函数的更改将不会运行,直到重新生成MEX函数,或删除并清除MEX函数。
buildInstrumentedMexfi_2nd_order_df2t_filter...- ofilter_scaled_double...arg游戏{B, A, x, yisd zisd}
带有啁啾输入的试验台
建立了该系统的测试台架,可运行啁啾和阶跃信号。一般来说,系统的测试台架应该覆盖广泛的输入信号。
第一个试验台使用啁啾输入。啁啾信号是一个很好的代表性输入,因为它涵盖了很宽的频率范围。
t = linspace (0, 1, N);从0到1秒的时间向量f1 = N / 2;%目标啁啾频率设置为奈奎斯特xchirp =罪(π* f1 * t ^ 2);1秒内从0到Fs/ 2hz的线性啁啾x (:) = xchirp;将啁啾设置为定点
运行仪表MEX函数记录最小/最大值
必须运行仪表MEX函数来记录模拟运行的最小值和最大值。后续运行累积检测结果,直到它们被清除clearInstrumentationResults
.
注意,分子和分母系数被编译为常数,因此它们不会作为输入提供给生成的MEX函数。
ychirp = filter_scaled_double (x, yisd zisd);
经过滤波的啁啾信号的曲线显示了具有这些特殊系数的滤波器的低通行为。低频通过,高频衰减。
clf情节(t x,“c”t ychirp“bo - - - - - -”)标题(“唧唧喳喳”)传说(“输入”,“Scaled-double输出”)图(gcf);drawnow;
显示测量结果与建议的啁啾分数长度
的showInstrumentationResults
命令显示带有测试值的代码生成报告。的输入showInstrumentationResults
是您希望显示结果的仪表化MEX函数的名称。
的选项列表showInstrumentationResults
命令:
-defaultDT T
建议使用双精度值的默认数据类型,其中T
是一个numerictype
对象,或者其中一个字符串{remainFloat, double, single, int8, int16, int32, int64, uint8, uint16, uint32, uint64}
.默认值是remainFloat
.-nocode
不要在可打印的报告中显示MATLAB代码。只显示记录了日志的变量表。此选项仅与-printable选项结合使用才有效。-optimizeWholeNumbers
优化仿真最小/最大日志总是整数的变量的字长。-percentSafetyMargin N
模拟最小/最大安全裕量,其中N
表示百分比值。可打印的
创建一个可打印的报告并在系统浏览器中打开。-proposeFL
为指定的字长提议分数长度。-proposeWL
建议指定分数长度的字长。
显示潜在的溢出fi
具有缩放双数据类型的对象。
这个特殊的设计是针对DSP的,其中字的长度是固定的,因此使用proposeFL
标志来提议分数长度。
showInstrumentationResultsfilter_scaled_double-proposeFL
将鼠标悬停在测试代码生成报告中的表达式或变量上,可以看到模拟的最小值和最大值。在本设计中,输入在-1到+1之间,所有变量和中间结果的值也在-1到+1之间。这表明数据类型都可以是小数(小数长度比单词长度小1位)。然而,对于其他类型的输入,这个函数并不总是如此,在设置最终的定点数据类型之前,测试多种类型的输入是很重要的。
有步进输入的测试台架
下一个测试台架使用步进输入运行。步进输入是一个很好的代表性输入,因为它经常被用来描述系统的行为。
xstep = [(N / 2,1);的(N / 2,1)];x (:) = xstep;
使用步进输入运行instrumentation MEX函数
检测结果不断累积,直到用clearInstrumentationResults
.
ystep = filter_scaled_double (x, yisd zisd);clf情节(t x,“c”t ystep“bo - - - - - -”)标题(“步骤”)传说(“输入”,“Scaled-double输出”)图(gcf);drawnow;
显示累计检测结果
即使阶跃和啁啾的输入都是全量程的,如所示x
在仪表化代码生成报告的100%当前范围下,步进输入导致溢出,而啁啾输入则不会。这说明了为您的测试台架提供许多不同输入的必要性。对于本例的目的,只使用了两个输入,但是真正的测试台架应该更全面。
showInstrumentationResultsfilter_scaled_double-proposeFL
应用建议的定点属性
为防止溢出,根据14位的建议分数长度设置建议的不动点属性y
而且z
来自仪器化的代码生成报告。
在工作流的这一点上,您使用的是真正的定点类型(与在确定数据类型的前面步骤中使用的伸缩双类型相反)。
易= fi (0 (N, 1), 1, 16日14日“fimath”F);子= fi(0(2, 1), 1, 16日14日“fimath”F);
仪器MATLAB®函数作为定点MEX函数
通过使用定点输入和buildInstrumentedMex
命令。
buildInstrumentedMexfi_2nd_order_df2t_filter...- ofilter_fixed_point...arg游戏{B, A, x,咦,子}
验证定点算法
转换为定点输入后,再次运行具有定点输入的测试台架,以验证设计。
验证与啁啾输入
运行带有啁啾输入的定点算法来验证设计。
x (:) = xchirp;[y, z] = filter_fixed_point (x,咦,zi);[ysd, zsd] = filter_scaled_double (x, yisd zisd);Err = double(y) - double(ysd);
将定点输出与缩放双输出进行比较,以验证它们是否符合设计标准。
clf次要情节(211);情节(t, x,“c”t ysd“bo - - - - - -”、t、y,“mx”)包含(“时间(s)”);ylabel (“振幅”)传说(“输入”,“Scaled-double输出”,“定点输出”);标题(定点唧唧喳喳的)次要情节(212);情节(t,呃,“r”)、标题(“错误”),包含(“t”);ylabel (“呃”);图(gcf);drawnow;
检查变量和中间结果,以确保最小/最大值在范围内。
showInstrumentationResultsfilter_fixed_point
用步进输入验证
运行带步进输入的定点算法来验证设计。
运行以下代码以清除之前的插装结果,只查看运行步骤输入的效果。
clearInstrumentationResultsfilter_fixed_point
将阶跃输入通过定点滤波器,并与缩放双滤波器的输出进行比较。
x (:) = xstep;[y, z] = filter_fixed_point (x,咦,zi);[ysd, zsd] = filter_scaled_double (x, yisd zisd);Err = double(y) - double(ysd);
绘制定点输出与缩放双输出的对比图,以验证它们满足您的设计标准。
clf次要情节(211);情节(t, x,“c”t ysd“bo - - - - - -”、t、y,“mx”)标题(“定点一步”);传奇(“输入”,“Scaled-double输出”,“定点输出”)次要情节(212);情节(t,呃,“r”)、标题(“错误”),包含(“t”);ylabel (“呃”);图(gcf);drawnow;
检查变量和中间结果,以确保最小/最大值在范围内。
showInstrumentationResultsfilter_fixed_point
运行以下代码恢复全局状态。
fipref (FIPREF_STATE);clearInstrumentationResultsfilter_fixed_pointclearInstrumentationResultsfilter_scaled_double清晰的fi_2nd_order_df2t_filter_fixed_instrumented清晰的fi_2nd_order_df2t_filter_float_instrumented
运行以下代码删除临时目录。
tempdirObj.cleanUp;% #好< * ASGLU >