Changeset 1245 for applications/pmsm

Show
Ignore:
Timestamp:
11/02/10 21:20:26 (14 years ago)
Author:
smidl
Message:

fixes in UD + Chol

Location:
applications/pmsm/simulator_zdenek
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • applications/pmsm/simulator_zdenek/ekf_example/ekf_obj.cpp

    r1241 r1245  
    661661                 
    662662        // Tuning of matrix R 
    663         R[0]=prevod(0.05,15);         // 0.05 
     663        R[0]=prevod(0.1,15);         // 0.05 
    664664        R[3]=R[0]; 
    665665         
  • applications/pmsm/simulator_zdenek/ekf_example/matrix_vs.cpp

    r1241 r1245  
    114114} 
    115115 
    116  
     116// Thorton procedure - Kalman predictive variance in UD 
     117void thorton(int16 *U, int16 *D, int16 *PSIU, int16 *Q, int16 *G, int16 *Dold, unsigned int16 rows) { 
     118        thorton_fast(U, D, PSIU, Q, G, Dold, rows); 
     119} 
     120         
    117121// Thorton procedure - Kalman predictive variance in UD 
    118122void thorton_fast(int16 *U, int16 *D, int16 *PSIU, int16 *Q, int16 *G, int16 *Dold, unsigned int16 rows) { 
     
    284288 
    285289            sigma = sigma >> 15;               // navrat do Q15 
    286             if (sigma>32767)sigma=32767; 
     290          //  if (sigma>32767)sigma=32767; 
    287291                         
    288292            for (j=0;j<dimx;j++)  
     
    393397                        } 
    394398                } 
    395         } 
    396         for (j=0; j<i; j++){ 
    397                 tmp_long=(long(Ch[i*dimx+i])*Ch[i*dimx+i]+long(Ch[i*dimx+j])*Ch[i*dimx+j]); 
    398                 if (tmp_long>0){ 
    399                         rho=sqrt((double)(tmp_long)); 
    400                         s=(long(Ch[i*dimx+j])<<15)/rho; 
    401                         c=(long(Ch[i*dimx+i])<<15)/rho; 
    402                         for (k=0; k<=i; k++){ 
    403                                 tau=(long(c)*Ch[k*dimx+j]-long(s)*Ch[k*dimx+i])>>15; 
    404                                 Ch[k*dimx+i]=(long(s)*Ch[k*dimx+j]+long(c)*Ch[k*dimx+i])>>15; 
    405                                 Ch[k*dimx+j]=tau; 
     399 
     400                for (j=0; j<i; j++){ 
     401                        tmp_long=(long(Ch[i*dimx+i])*Ch[i*dimx+i]+long(Ch[i*dimx+j])*Ch[i*dimx+j]); 
     402                        if (tmp_long>0){ 
     403                                rho=sqrt((double)(tmp_long)); 
     404                                s=(long(Ch[i*dimx+j])<<15)/rho; 
     405                                c=(long(Ch[i*dimx+i])<<15)/rho; 
     406                                for (k=0; k<=i; k++){ 
     407                                        tau=(long(c)*Ch[k*dimx+j]-long(s)*Ch[k*dimx+i])>>15; 
     408                                        Ch[k*dimx+i]=(long(s)*Ch[k*dimx+j]+long(c)*Ch[k*dimx+i])>>15; 
     409                                        Ch[k*dimx+j]=tau; 
     410                                } 
    406411                        } 
    407412                } 
     413 
    408414        } 
    409415} 
  • applications/pmsm/simulator_zdenek/ekf_example/matrix_vs.h

    r1241 r1245  
    1313#define qAU 14 
    1414#define qD 14 
    15 #define qCh 15 
     15#define qCh 14 
    1616 
    17 #define int16 short int 
    18 #define int32 int 
     17#define int16 int 
     18#define int32 long 
    1919 
    2020/* Matrix multiply Full matrix by upper diagonal matrix with unit diagonal; */ 
  • applications/pmsm/simulator_zdenek/test_UD.cpp

    r1228 r1245  
    22#include "ekf_example/ekf_obj.h" 
    33int main(){ 
    4         int i; 
     4        int16 i; 
    55        mat A = 0.99*eye(5); 
    66        A(0.3) = 0.06; 
     
    1313         
    1414        mat U=eye(5); 
    15         for (int i=0; i<5;i++) { 
    16                 for (int j=i+1; j<5;j++) U(i,j)=2*randu(1)(0)-1; 
     15        for (int16 i=0; i<5;i++) { 
     16                for (int16 j=i+1; j<5;j++) U(i,j)=2*randu(1)(0)-1; 
    1717        } 
    1818        mat Q = diag(vec(" 0.2000 0.3000 0.4000 0.5000 0.6")); 
     
    2222                vec xref = ones(5); 
    2323 
    24                 int PSI[25]; 
    25                 int PSIU[25]={0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}; 
    26                 int Uf[25]={0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}; 
    27                 int Gf[25]={0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}; 
    28                 int Df[5]={0,0,0,0,0}; 
    29                 int Dfold[5]={0,0,0,0,0}; 
     24                int16 PSI[25]; 
     25                int16 PSIU[25]={0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}; 
     26                int16 Uf[25]={0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}; 
     27                int16 Gf[25]={0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0}; 
     28                int16 Df[5]={0,0,0,0,0}; 
     29                int16 Dfold[5]={0,0,0,0,0}; 
    3030                 
    31                 int multip=1<<15; 
     31                int16 multip=1<<15; 
    3232                 
    3333        /////////// COPY 
    3434        imat Af=round_i(A*multip); 
    35         mat_to_int(Af, PSI); 
    36         mat_to_int(round_i(U*multip),Uf);                
    37         vec_to_int(round_i(D*multip), Df);  
    38         int Qf[25]; 
    39         mat_to_int(round_i(Q*multip), Qf); 
    40         int Rf[2]; 
    41         vec_to_int(round_i(R*multip), Rf); 
     35        mat_to_int16(Af, PSI); 
     36        mat_to_int16(round_i(U*multip),Uf);              
     37        vec_to_int16(round_i(D*multip), Df);  
     38        int16 Qf[25]; 
     39        mat_to_int16(round_i(Q*multip), Qf); 
     40        int16 Rf[2]; 
     41        vec_to_int16(round_i(R*multip), Rf); 
    4242         
    4343         
     
    5252        cout << "Delta PSI: " << round_i(PhiU*multip-(1<<(15-qAU))*PUcmp) <<endl; 
    5353         
    54         mat_to_int(round_i(PhiU*multip/(1<<(15-qAU))),PSIU); //<< make is same 
     54        mat_to_int16(round_i(PhiU*multip/(1<<(15-qAU))),PSIU); //<< make is same 
    5555 
    5656/////////// Test Thorton: 
    57         int dim=5;double sigma; int j,k;  
     57        int16 dim=5;double sigma; int16 j,k;  
    5858        vec Din = D; 
    5959        mat G=eye(5); 
     
    102102         
    103103        // synchronize 
    104         mat_to_int(round_i(U*multip),Uf);                
    105         vec_to_int(round_i(D*multip), Df);  
     104        mat_to_int16(round_i(U*multip),Uf);              
     105        vec_to_int16(round_i(D*multip), Df);  
    106106         
    107107 
     
    109109        vec     xp = 2*randu(5)-1; 
    110110         
    111         int difz[2]; 
    112         vec_to_int(round_i(ydif*multip), difz); 
    113         int xf[5]; 
    114         vec_to_int(round_i(xp*multip), xf); 
     111        int16 difz[2]; 
     112        vec_to_int16(round_i(ydif*multip), difz); 
     113        int16 xf[5]; 
     114        vec_to_int16(round_i(xp*multip), xf); 
    115115 
    116116        cout << "x: "<< round_i(xp*multip) <<endl; 
     
    118118         
    119119         
    120         int xf_old[5]; 
    121         vec_to_int(ivec(xf,5),xf_old); 
     120        int16 xf_old[5]; 
     121        vec_to_int16(ivec(xf,5),xf_old); 
    122122         
    123123        /////// Test bierman 
     
    127127        mat C = zeros(2,5); 
    128128        C(0,0)=1.0;C(1,1)=1.0; 
    129         for (int iy=0; iy<2; iy++){ 
     129        for (int16 iy=0; iy<2; iy++){ 
    130130                a     = U.T()*C.get_row(iy);    // a is not modified, but  
    131131                b     = elem_mult(D,a);                          // b is modified to become unscaled Kalman gain.