使用最小/最大检测设置数据类型
这个示例展示了如何通过对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 = get(fipref);重置(fipref)
数据类型由设计要求决定
在本例中,设计的需求决定输入的数据类型x
.这些需求是有符号的、16位的和分数的。
N = 256;x = fi(零(N,1),1,16,15);
设计的要求也决定了带有40位累加器的DSP目标的定点数学。本例使用舍入和换行溢出来生成高效的生成代码。
F = fimath(“RoundingMethod”,“地板”,...“OverflowAction”,“包装”,...“ProductMode”,“KeepLSB”,...“ProductWordLength”现年40岁的...“SumMode”,“KeepLSB”,...“SumWordLength”, 40);
下面的系数对应于由
[num,den] =黄油(2,0.125)
系数的值影响分配给过滤器输出和状态的值的范围。
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;A = fi(den,1,16);a.fimath = F;
类的常量,将筛选系数硬编码到此筛选器的实现中buildInstrumentedMex
命令。
B = code . constant (B);A = code . constant (A);
数据类型由系数和输入的值决定
系数的值和输入的值决定输出的数据类型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}
带有Chirp输入的试验台
建立了该系统的试验台,用于运行啁啾和阶跃信号。一般来说,系统的试验台应覆盖广泛的输入信号。
第一个试验台使用一个啁啾输入。啁啾信号是一种很好的代表性输入,因为它覆盖了很宽的频率范围。
t = linspace(0,1,N);%从0到1秒的时间向量f1 = N/2;%目标啁啾频率设置为奈奎斯特Xchirp = sin(π *f1*t.^2);%线性啁啾从0到Fs/ 2hz在1秒X (:) = xchirp;向定点施放啁啾
运行Instrumented 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 = [ones(N/2,1);-ones(N/2,1)];X (:) = xstep;
使用步进输入运行仪表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
从测试代码生成报告。
在工作流的这一点上,您使用了真正的定点类型(与前面确定数据类型的步骤中使用的缩放双精度类型相反)。
yi = fi(0 (N,1),1,16,14,“fimath”F);Zi = fi(0 (2,1) 1,16,14,“fimath”F);
仪器MATLAB®函数作为一个定点MEX函数
方法创建仪器化的定点MEX函数buildInstrumentedMex
命令。
buildInstrumentedMexfi_2nd_order_df2t_filter...- ofilter_fixed_point...arg游戏{B, A, x,咦,子}
验证定点算法
转换为定点输入后,再次使用定点输入运行测试台以验证设计。
用Chirp输入验证
运行带有chirp输入的定点算法来验证设计。
X (:) = xchirp;[y,z] = filter_fixed_point(x,yi,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,yi,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 >