主要内容

开发定点算法

这个例子展示了如何开发和验证一个简单的定点算法。

算法开发简单示例

这个例子展示了一个简单的定点滤波算法的发展和验证。我们将采取以下步骤:

1)实现二阶滤波算法,并在双精度浮点上进行仿真。

2)仪表代码可视化输出和状态的动态范围。

3)通过改变变量的数据类型,将算法转换为不动点。算法本身不会改变。

4)比较并绘制定点和浮点结果。

浮点变量定义

我们开发了双精度浮点算法。我们将使用一个二阶低通滤波器来去除输入信号中的高频。

B = [0.25 0.5 0.25];%分子系数A = [1 0.09375 0.28125];%分母系数%同时具有高频和低频的随机输入。S = rng;rng (0,“v5uniform”);X = randn(1000,1);rng(年代);%恢复RNG状态为速度预分配输出和状态。Y = 0(大小(x));Z = [0;0];

Data-Type-Independent算法

这是一个实现标准差分方程的二阶滤波器:

y (n) = b (1) * (2) x (n) + b * x (n - 1) + b (3) * x y (n - 2)——(2)* (n - 1) - (3) * y (n - 2)
K =1:长度(x) y(K) = b(1)*x(K) + z(1);Z (1) = (b(2)*x(k) + Z (2)) - a(2)*y(k);Z (2) = b(3)*x(k) - a(3)*y(k);结束保存浮点结果Ydouble = y;

可视化动态范围

为了转换成不动点,我们需要知道变量的值域。根据算法的复杂性,这个任务可以很简单,也可以相当具有挑战性。在本例中,输入值的范围是已知的,因此选择适当的定点数据类型很简单。我们将专注于输出(y)和状态(z),因为它们的范围是未知的。为了查看输出和状态的动态范围,我们将稍微修改代码以显示它。我们将创建两个NumericTypeScope对象,并同时查看输出(y)和状态(z)的动态范围。

仪器浮点码

%重置状态Z = [0;0];hscope1 = NumericTypeScope;hscope2 = NumericTypeScope;K =1:长度(x) y(K) = b(1)*x(K) + z(1);Z (1) = (b(2)*x(k) + Z (2)) - a(2)*y(k);Z (2) = b(3)*x(k) - a(3)*y(k);%处理数据和更新可视化。步骤(hscope1, z);结束步骤(hscope2, y);

分析范围内的信息

让我们首先分析变量z(状态)显示的信息。从直方图中我们可以看到动态范围位于(2美元^ {1}$2美元^ {-12}$]。

默认情况下,作用域使用16位的字长,允许的溢出为零。这将导致数值类型的数据类型(true, 16,14),因为我们至少需要2个整数位来避免溢出。您可以从输入数据和结果类型面板获得有关统计数据的更多信息。从Input Data面板中,我们可以看到数据有正数和负数,因此有符号量反映在建议的数字类型中。此外,最大数据值为1.51,可以用建议的类型表示。

接下来,让我们看看变量y(输出)。从直方图中我们可以看到动态范围位于(2美元^ {1}$2美元^ {-13}$]。

默认情况下,作用域使用16位的字长,允许的溢出为零。这将导致数值类型的数据类型(true, 16,14),因为我们至少需要2个整数位来避免溢出。使用这个建议的类型,您不会看到溢出或下溢。

定点变量定义

我们将变量转换为定点,并再次运行算法。我们将打开日志记录,以查看所选数据类型引入的溢出和下溢。

打开日志记录以查看溢出/下溢。FIPREF_STATE = get(fipref);Reset (fipref) fp = fipref;default_loggingmode = fp.LoggingMode;《外交政策》。LoggingMode =“上”捕获的当前状态并将全局fimath重置为工厂%设置。globalFimathAtStart = fimath;resetglobalfimath;定义变量的定点类型,格式如下:% fi(Data, Signed, WordLength, FractionLength)B = fi(B, 1,8,6);A = fi(A, 1,8,6);X = fi(X, 1,16,13);Y = fi(零(大小(x)), 1,16,13);Z = fi([0;0], 1,16,14);

相同的数据类型独立算法

K =1:长度(x) y(K) = b(1)*x(K) + z(1);Z (1) = (b(2)*x(k) + Z (2)) - a(2)*y(k);Z (2) = b(3)*x(k) - a(3)*y(k);结束重置日志记录模式。《外交政策》。LoggingMode = default_loggingmode;

在本例中,我们重新定义了具有与浮点数相同名称的定点变量,以便能够内联算法代码以提高清晰度。但是,更好的做法是将算法代码包含在MATLAB®文件函数中,该函数可以用浮点或定点变量调用。看到filimitcycledemo.m这是一个编写和使用数据类型不可知算法的示例。

比较和绘制浮点和定点结果

现在,我们将绘制浮点和定点结果的大小响应以及过滤器的响应,以查看过滤器在转换为定点时的行为是否符合预期。

N =长度(x)F = linspace(0,0.5,n/2);X_response = 20*log10(abs(fft(double(x))));Ydouble_response = 20*log10(abs(fft(ydouble)));Y_response = 20*log10(abs(fft(double(y))));情节(f, x_response (1: n / 2),“c -”...f, ydouble_response (1: n / 2),“bo - - - - - -”...f, y_response (1: n / 2),“gs - - - - - -”);ylabel (“以分贝为单位的幅度”);包含(归一化频率的);传奇(“输入”“浮点输出”“定点输出”“位置”“最佳”);标题(浮点和定点结果的幅度响应);

H = fft(double(b),n)./fft(double(a),n);H = H (1:end/2);CLF hax =轴;情节(hax, f, 20 * log10 (abs (h)));集(hax,“YLim”, -40年[0]);标题(“滤波器的幅度响应”);ylabel (“以分贝为单位的幅度”)包含(“频率”);

请注意,输入信号中的高频被低通滤波器衰减,这是预期的行为。

绘制误差图

CLF n =(0:长度(y)-1)';E = double(lsb(y));情节(n、双-ydouble (y),“。r”...[n(1) n(end)],[e/2 e/2],“c”...[n(1) n(end)],[-e/2 -e/2],“c”)文本(n(结束),e / 2,+ 1/2 LSB的“HorizontalAlignment”“对”“VerticalAlignment”“底”)文本(n(结束)- e / 2,“1/2 LSB”“HorizontalAlignment”“对”“VerticalAlignment”“高级”)包含(' n(样本));ylabel (“错误”

金宝app仿真软件®

如果您有Simulink金宝app®和Fixed-Point Designer™,您可以运行这个模型,它相当于上面的算法。输出y_sim是一个定点变量,等于上面用MATLAB代码计算的变量y。

与MATLAB代码一样,可以修改块中的定点参数以匹配实际系统;这些已经被设置为与上面例子中的MATLAB代码相匹配。双击方块查看设置。

如果fidemo.has金宝appSimulinkLicense设置From Workspace变量x_sim。时间= n;x_sim.signals。值= x;x_sim.signals。尺寸= 1;%运行模拟Out_sim = sim(“fitdf2filter_demo”“SaveOutput”“上”...“SrcWorkspace”“当前”);打开模型fitdf2filter_demo%验证Simulink结果与MATL金宝appAB文件相同isequal (y, out_sim.get (“y_sim”))结束
Ans =逻辑1

本例的假设

为了简化这个例子,我们采用了默认的数学参数:四舍五入、溢出饱和、全精度积和。下载188bet金宝搏我们可以修改所有这些参数以匹配实际系统。

这些设置被选为算法开发的起点。保存这个MATLAB文件的副本,开始处理参数,看看它们对输出有什么影响。对于不同的输入,算法如何表现?有关如何设置其他参数(如舍入模式和溢出模式)的信息,请参阅fi、fimath和numerictype的帮助。

关闭所有;bdclose所有重置全局fimathglobalfimath (globalFimathAtStart);fipref (FIPREF_STATE);