基于Scilab的数字信号处理(2)

系统可以用系统传输函数或者状态空间进行表示,在scilab中,提供了这两种表示方法及其转换,系统级联方法和频率响应图的绘制函数。
(1)syslin可以用于系统传输函数及状态空间表示法的线性系统建立,它提供了多种建立方式
[sl]=syslin(dom,A,B,C [,D [,x0] ])
[sl]=syslin(dom,N,D)
[sl]=syslin(dom,H)
dom可以为离散('d')、连续('c')或[]或一个标量n,它指定系统的时域,d为离散系统,c为连续系统,n表示采样周期为n(单位为秒),[]表示未定义。系统的状态空间表示法为:

其中为观测方程,x为状态量,f为输入量,y为输出量。输出结果sl为list数据类型,其格式为:sl=tlist(['lss','A','B','C','D','X0','dt'],A,B,C,D,x0,dom) ,D可以为一个多项式矩阵(非其次系统)。
输出结果sl为list数据类型,其格式为:sl=tlist(['lss','A','B','C','D','X0','dt'],A,B,C,D,x0,dom) ,D可以为一个多项式矩阵。

D为一个多项式矩阵,且p = degree(D(z))则
D(z)=D_0 + z D_1 + z^2 D_2 +..+ z^p D_p
y[t] = C x[t] + D_0 u[t] + D_1 u[t+1] +..+ D_[p] u[t+p]
[sl]=syslin(dom,N,D)
[sl]=syslin(dom,H)
定义传输函数,其中N,D用以定义传输函数的有理函数,而H为有理矩阵或线性状态空间表示法。输出结果格式为
sl=tlist(['r','num','den','dt'],N,D,dom)
或者
sl=tlist(['r','num','den','dt'],H(2),H(3),dom)
由syslin定义的传输函数表示或状态空间表示的线性系统可以如普通矩阵那样进行操作,即连接,提取,转置,相乘等等。大多数的状态空间控制函数都会接受syslin定义的系统表示方式。

实例1:

-->A=[0,1;0,0]         //定义矩阵A
A=
   0.    1. 
    0.    0. 
-->B=[1;1]               //定义矩阵B
B  = 
    1. 
    1.   
-->C=[1,1]           //定义矩阵C
C  =
    1.    1.   
-->S1=syslin('c',A,B,C)   //建立状态空间表示法的线性系统
S1  = 
       S1(1)   (state-space system:)                    //列表第一个元素,定义列表格式
!lss  A  B  C  D  X0  dt  ! 
       S1(2) = A matrix =                                    //列表第二个元素为矩阵A
    0.    1. 
    0.    0.   
       S1(3) = B matrix =                                    //列表第三个元素为矩阵B
    1. 
    1.  
       S1(4) = C matrix =                                      //列表第四个元素为矩阵C
    1.    1.   
       S1(5) = D matrix =                                  //列表第五个元素为矩阵D
    0.   
       S1(6) = X0 (initial state) =                    //列表第六个元素为初始状态
    0. 
    0.  
       S1(7) = Time domain =                        //列表第七个元素为时域类型
c  

-->S1("A")                                       //获取列表中名为A的元素,即矩阵A
ans  =
 
    0.    1. 
    0.    0. 

--> D=poly([1,2],'s')                    //定义多项式矩阵D
D  =
 
              2 
    2 - 3s + s  
 
-->S2=syslin('c',A,B,C,D)            //由四个矩阵建立线性系统
S2  =
 
 
       S2(1)   (state-space system:)
 
!lss  A  B  C  D  X0  dt  !
 
       S2(2) = A matrix =
 
    0.    1. 
    0.    0. 
 
       S2(3) = B matrix =
 
    1. 
    1. 
 
       S2(4) = C matrix =
 
    1.    1. 
 
       S2(5) = D matrix =
 
              2 
    2 - 3s + s  
 
       S2(6) = X0 (initial state) =
 
    0. 
    0. 
 
       S2(7) = Time domain =
 

--> S1+S2                   //线性系统相加,内部有四个状态
ans  = 
       ans(1)   (state-space system:) 
!lss  A  B  C  D  X0  dt  !
       ans(2) = A matrix =  
    0.    1.    0.    0. 
    0.    0.    0.    0. 
    0.    0.    0.    1. 
    0.    0.    0.    0.  
       ans(3) = B matrix = 
    1. 
    1. 
    1. 
    1.  
       ans(4) = C matrix = 
    1.    1.    1.    1.  
       ans(5) = D matrix = 
              2 
    2 - 3s + s   
       ans(6) = X0 (initial state) = 
    0. 
    0. 
    0. 
    0.  
       ans(7) = Time domain = 
c  

-->[S1 S2]   //两个系统并排
ans  = 
       ans(1)   (state-space system:)
!lss  A  B  C  D  X0  dt  !
       ans(2) = A matrix = 
    0.    1.    0.    0. 
    0.    0.    0.    0. 
    0.    0.    0.    1. 
    0.    0.    0.    0.  
       ans(3) = B matrix = 
    1.    0. 
    1.    0. 
    0.    1. 
    0.    1.  
       ans(4) = C matrix = 
    1.    1.    1.    1.  
       ans(5) = D matrix = 
                   2 
    0    2 - 3s + s   
       ans(6) = X0 (initial state) = 
    0. 
    0. 
    0. 
    0.  
       ans(7) = Time domain = 
c

(2)sl=tf2ss(h [,tol])用于把传输函数转换成状态空间表示,[Ds,NUM,chi]=ss2tf(sl)用于把状态空间表示法转换成传输函数
h为有理函数矩阵,tol为容差,可以是相对容差rtol或行向量[rtol atol]
sl为状态空间表示的线性系统
实例3:
-->s=poly(0,'s')       //定义符号变量
s  =
    s   
-->H=[2/s,(s+1)/(s^2-5)]  //定义传输函数的有理多项式
H  =
    2     1 + s  
    -     -----  
               2 
    s   - 5 + s  
-->Sys=tf2ss(H)             //转换成状态空间表示法
Sys  =
       Sys(1)   (state-space system:)
!lss  A  B  C  D  X0  dt  !
       Sys(2) = A matrix =
    1.           1.490712     5.551D-17 
    1.1925696    3.724D-16    1.3333333 
    0.2236068    1.6666667  - 1.         
       Sys(3) = B matrix = 
  - 1.3333333  - 0.6666667 
    0.8944272  - 9.252D-17 
    1.1925696  - 0.7453560  
       Sys(4) = C matrix =
  - 1.5  - 5.551D-17  - 2.220D-16  
       Sys(5) = D matrix = 
    0.    0.  
       Sys(6) = X0 (initial state) = 
    0. 
    0. 
    0.  
       Sys(7) = Time domain = 
     []
-->reva=ss2tf(Sys)            //再把状态空间表示的系统转成传输函数
reva  =
          2                 1 + s         
    -------------     -----------------   
                                        2 
  - 9.710D-16 + s   - 5 + 1.132D-15s + s  
-->clean(reva)                    //清除小值,结果与之前的传输函数法一致
ans  =
    2     1 + s  
    -     -----  
               2 
    s   - 5 + s  

 

(3)两个系统之间可以采用多种方式进行连接,主要有S1*S2,S1+S2,[S1;S2],[S1,S2]

(4)Scilab中用传输函数或状态空间表示的连续线性系统可以采用dscr函数转换成离散系统,其格式为[sld [,r]]=dscr(sl,dt [,m])
sl为由syslin定义的包含矩阵[A,B,C,D]的线性系统
dt实数表示采样率
m为输入噪声的协方差
r为输出噪声的协方差
sld为离散线性系统,采用状态空间表示法
实例4:

-->s=poly(0,'s')
s  =
     s    
-->Sys=syslin('c',[1,1/(s+1);2*s/(s^2+2),1/s])
Sys  = 
    1           1    
    -         -----  
    1         1 + s  
                     
     2s       1      
    ----      -      
         2           
    2 + s     s      
 
-->dscr(Sys,0.1)
ans  = 
       ans(1)   (state-space system:) 
!lss  A  B  C  D  X0  dt  !
 
       ans(2) = A matrix =  
    0.9048374  - 2.990D-17  - 1.960D-18  - 1.337D-17 
  - 0.042558     0.9920133  - 0.1782897  - 0.0039933 
  - 2.854D-17    0.0891449    0.9900167    0.0445724 
    0.0851160  - 0.0039933  - 0.0891449    0.9980033   
       ans(3) = B matrix =  
    1.259D-17  - 0.1345802 
    0.1260699    0.0030595 
    0.0070593    2.382D-17 
    0.0630349  - 0.0061189  
       ans(4) = C matrix = 
  - 0.7071068  - 1.570D-16    1.178D-16  - 6.674D-17 
  - 0.7071068    1.5811388    1.963D-16    4.428D-17  
       ans(5) = D matrix = 
    1.    0. 
    0.    0.  
       ans(6) = X0 (initial state) = 
    0. 
    0. 
    0. 
    0.  
       ans(7) = Time domain = 
    0.1 

(5)计算线性系统的时域响应

[y [,x]]=flts(u,sl [,x0])
[y]=flts(u,sl [,past])
用于计算离散时间或采样系统的时域响应,u为输入向量,sl为线性系统,,x0为初始状态值,默认值为0,past为过去值矩阵,默认值为0;x为输出状态值,y为输出值。

实例5:

-->clf;
-->z=poly(0,'z');
-->h=syslin('d',(1-2*z)/(z^2+0.3*z+1))
h  =
       1 - 2z     
    ------------  
                2 
    1 + 0.3z + z  
-->inputSignal=eye(1,30);
-->imprep=flts(inputSignal,h);
-->subplot(211);
-->plot2d3(inputSignal);
-->subplot(212);
-->plot2d3(imprep);

输出图形为

 

 

你可能感兴趣的:(c,list,System,domain,图形,Matrix)