这个例子展示了如何通过测量MATLAB®最小/最大测井代码来设置定点数据类型,并使用工具来提出数据类型。
你将使用的函数是:
buildInstrumentedMex
-在启用了仪器的情况下构建MEX函数
showInstrumentationResults
-显示测量结果
clearInstrumentationResults
-清除仪器检测结果
在这个例子中,你转换到定点的函数是一个二阶直接形式的2转置滤波器。您可以用自己的函数代替这个函数,以便在您自己的工作中重现这些步骤。
函数[y, z] = fi_2nd_order_df2t_filter (b, a, x, y, z)为I =1:length(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
对象使用默认的round-to-nearest和饱和溢出设置,这使系数具有更好的准确性。
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®代码,您可以使用buildInstrumentedMex
命令。的输入buildInstrumentedMex
是否与输入相同fiaccel
,但buildInstrumentedMex
没有fi
对象的限制。的输出buildInstrumentedMex
是一个插入了仪器的MEX函数,因此当运行MEX函数时,将记录所有命名变量和中间值的模拟最小值和最大值。
使用“o”
选项来命名生成的MEX函数。如果你不使用“o”
选项,则MEX函数是MATLAB®函数的名称“_mex”
附加。你也可以名墨西哥人函数一样的MATLAB®函数,但你要记住,墨西哥人函数优先于MATLAB®函数,所以更改MATLAB®函数不会运行,直到墨西哥人功能重新生成,或者墨西哥人函数删除和清除。
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);%线性啁啾从0到Fs/ 2hz在1秒x (:) = xchirp;将啁啾投射到定点
必须运行带有仪器的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
具有Scaled Double数据类型的对象。
这个特殊的设计是针对DSP的,其中的字长度是固定的,所以使用proposeFL
标记以建议分数长度。
showInstrumentationResultsfilter_scaled_double-proposeFL
将鼠标悬停在检测代码生成报告中的表达式或变量上,以查看模拟的最小值和最大值。在这个设计中,输入在-1和+1之间,所有变量和中间结果的值也在-1和+1之间。这表明数据类型可以都是小数(小数长度比单词长度小一位)。然而,对于其他类型的输入,这个函数并不总是正确的,在设置最终的定点数据类型之前测试多种类型的输入是很重要的。
使用步骤输入运行下一个测试台。阶跃输入是一种很好的代表性输入,因为它经常被用来描述系统的行为。
xstep = [(N / 2,1);的(N / 2,1)];x (:) = xstep;
测量结果将被累积,直到它们被清除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);
通过使用定点输入和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 >