这个例子展示了如何分析一个定点状态空间系统来检测极限环。
该示例侧重于检测由于零输入溢出而导致的大规模极限环,并强调了足以防止此类振荡的条件。
引用:
[1] Richard A. Roberts和Clifford T. Mullis,“数字信号处理”,Addison-Wesley, Reading, Massachusetts, 1987, ISBN 0-201-16350-0,第9.3节。
[2] S. K. Mitra,“数字信号处理:基于计算机的方法”,mcgraww - hill,纽约,1998,ISBN 0-07-042953-7。
通过观察状态转换矩阵A的特征值的大小小于1,我们观察到系统是稳定的。
originalFormat = get(0,“格式”);格式A = [0 1;-。5 1];B = [0;1);C = [10];D = 0;eig (A)
Ans = 0.5000 + 0.5000i 0.5000 - 0.5000i
类型(fullfile (matlabroot“工具箱”,“定点”,“fidemos”,' + fidemo ',“fisisostatespacefilter.m”))
function [y,z] = fisisostatespacefilter(A,B,C,D,x,z) % fisisostatespacefilter单输入单输出状态空间过滤器% [y, Zf] = fisisostatespacefilter(A,B,C,D,x, Zi)用%初始条件Zi过滤数据x,状态空间过滤器由矩阵% A,B,C,D定义,返回输出y和最终条件Zf。版权所有:The MathWorks, Inc. y = x;Z(:,2:长度(x)+1) = 0;for k=1:length(x) y(k) = C*z(:,k) + D*x(k);z(:,k+1) = A*z(:,k) + B*x(k);结束
创建一个浮点过滤器并观察状态的轨迹。
首先,我们在单位正方形内选择随机状态,并观察它们在与状态转换矩阵A相乘后的投影位置。
rng (“默认”);CLF x1 = [-1 1 1 -1];Y1 = [-1 -1 1 1 -1];情节(x1, y1,“c”)轴([-1.5 1.5 -1.5 1.5]);轴广场;网格;持有在画出正方形的投影p = A*[x1;y1];情节(p(1:)、p (2:)“r”) r = 2*rand(2,1000)-1;pr = A*r;情节(公关(1:),公关(2:)“。”)
以随机初始状态驱动滤波器,归一化到单元方块内,输入全为零,并运行滤波器。
注意,有些状态游离在单位方块之外,它们最终在原点z=[0;0]处趋近于零状态。
X = 0 (10,1);Zi = [0;0];Q =量化器([16 15]);为K =1:20 y = x;zi(:) = randquant(q,size(A,1),1);[y,zf] = fidemo.fisisostatespacfilter (A,B,C,D,x,zi);情节(zf (1:), zf (2:),“去,”,“markersize”8);结束标题(“双精度状态序列图”);包含(“z1”);ylabel (“z2”)
因为特征值的大小小于1,所以系统是稳定的,所有的初始状态都趋向于零输入的原点。然而,特征值并不能说明状态轨迹的全部情况,就像在这个例子中,在状态开始收缩之前,它们首先向外投射。
A的奇异值能更好地反映整体状态轨迹。最大奇异值约为1.46,这表明与相应奇异向量对齐的状态将从原点投射出去。
圣言(A)
Ans = 1.4604 0.3424
创建一个定点过滤器并检查极限环。
滤波器的MATLAB®代码保持不变。它变成了一个定点滤波器因为我们用定点输入来驱动它。
为了说明溢出振荡,我们选择将溢出的乘积和和数据类型。
rng (“默认”);F = fimath(“OverflowAction”,“包装”,...“ProductMode”,“SpecifyPrecision”,...“ProductWordLength”, 16岁,“ProductFractionLength”15岁的...“SumMode”,“SpecifyPrecision”,...“SumWordLength”, 16岁,“SumFractionLength”15);A = fi(A,“fimath”,F) B = fi(B,“fimath”,F) C = fi(C,“fimath”,F) D = fi(D,“fimath”F)
A = 0 1.0000 -0.5000 1.0000 DataTypeMode:定点:二进制点缩放signality: Signed WordLength: 16 FractionLength: 14 RoundingMethod: Nearest OverflowAction: Wrap ProductMode: speciyprecision ProductWordLength: 16 ProductFractionLength: 15 SumMode: speciyprecision SumWordLength: 16 SumFractionLength: 15 CastBeforeSum: true B = 0 1 DataTypeMode:定点:二进制点缩放signality: Signed WordLength: 16 FractionLength: 14 RoundingMethod: Nearest OverflowAction: WrapWrap ProductMode: speciyprecision ProductWordLength: 16 ProductFractionLength: 15 SumMode: speciyprecision SumWordLength: 16 SumFractionLength: 15 CastBeforeSum: true C = 1 0 DataTypeMode:定点:二进制点缩放signality: Signed WordLength: 16 FractionLength: 14 round method: Nearest OverflowAction: Wrap ProductMode: specificprecision ProductWordLength: 16 ProductFractionLength: 15 SumMode: specificprecision SumWordLength: 16 SumFractionLength: 15 CastBeforeSum:true D = 0 DataTypeMode:定点:二进制点缩放signdness: Signed WordLength: 16 FractionLength: 15 RoundingMethod: Nearest OverflowAction: Wrap ProductMode: specificprecision ProductWordLength: 16 ProductFractionLength: 15 SumMode: speciyprecision SumWordLength: 16 SumFractionLength: 15 CastBeforeSum: true
同样,我们在单位方框内选择随机状态,并观察它们在与状态转换矩阵A相乘一步后的投影位置。不同的是,这个时间矩阵A是定点的。
请注意,之前在浮点中投射出正方形的三角形,现在被包裹回正方形的内部。
CLF r = 2*rand(2,1000)-1;pr = A*r;图([-1 1 1 -1 -1],[-1 -1 1 1 -1],“c”)轴([-1.5 1.5 -1.5 1.5]);轴广场;网格;持有在情节(公关(1:),公关(2:)“。”)
这段代码与前面代码之间的唯一区别是,我们使用定点数据类型来驱动它。
X = fi(0 (10,1) 1,16,15,“fimath”F);Zi = fi([0;0],1,16,15,“fimath”F);Q =赋值量化器(zi);E = double(eps(zi));rng (“默认”);为K =1:20 y = x;zi(:) = randquant(q,size(A,1),1);[y,zf] = fidemo.fisisostatespacfilter (A,B,C,D,x,zi);如果abs(双(zf(结束)))> 0.5,c =“ro - - - - - -”;其他的c =“去,”;结束情节(zf (1:), zf (2:), c,“markersize”8);结束标题(“定点状态序列图”);包含(“z1”);ylabel (“z2”)
在其他随机选择的初始状态上尝试这个方法表明,一旦一个状态进入其中一个三角形区域,那么它就会投射到另一个三角形区域,来回往复,永远不会逃脱。
有两个充分条件可以防止系统中的溢流限制环:
系统稳定,即abs(eig(A))<1,
矩阵A是正规的,即A'*A = A*A'。
注意,对于当前的表示,第二个条件不成立。
现在,我们对原始系统应用相似变换,这将创建一个正常的状态转换矩阵A2。
T = [-2 0;-1 1];Tinv = [-]5 0; -。5 1];A2 = Tinv*A*T;B2 = Tinv*B;C2 = c * t;D2 = d;
相似变换保留特征值,使得变换后的系统传递函数保持不变。但是,变换后的状态变换矩阵A2是正常的。
现在单位正方形内随机初始状态的投影都一致地收缩。这是状态转移矩阵A2正常的结果。状态也逆时针旋转90度。
CLF r = 2*rand(2,1000)-1;pr = A2*r;图([-1 1 1 -1 -1],[-1 -1 1 1 -1],“c”)轴([-1.5 1.5 -1.5 1.5]);轴广场;网格;持有在情节(公关(1:),公关(2:)“。”)
再次为相同的初始状态绘制状态序列,我们看到输出现在螺旋向原点。
X = fi(0 (10,1) 1,16,15,“fimath”F);Zi = fi([0;0],1,16,15,“fimath”F);Q =赋值量化器(zi);E = double(eps(zi));rng (“默认”);为K =1:20 y = x;zi(:) = randquant(q,size(A,1),1);[y,zf] = fidemo.fisisostatespacfilter (A2,B2,C2,D2,x,zi);如果abs(双(zf(结束)))> 0.5,c =“ro - - - - - -”;其他的c =“去,”;结束情节(zf (1:), zf (2:), c,“markersize”8);结束标题(“标准形式定点状态序列图”);包含(“z1”);ylabel (“z2”)
对其他随机选择的初始状态尝试此方法表明,没有过滤器无法恢复的区域。
集(0,“格式”, originalFormat);% #好< * NASGU, * NOPTS >