主要内容

使用最小/最大检测设置数据类型

这个示例展示了如何通过对MATLAB®代码进行最小/最大日志记录并使用工具提出数据类型来设置定点数据类型。

您将使用的函数是:

被测单元

在这个例子中,要转换为定点的函数是一个二阶直接式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 >