Show
Ignore:
Timestamp:
10/29/10 19:10:12 (14 years ago)
Author:
smidl
Message:

Choleski - covariance 0.01

Files:
1 modified

Legend:

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

    r1240 r1241  
    1616 
    1717#include "matrix_vs.h" 
     18#include <math.h> 
    1819 
    1920/* Matrix multiply Full matrix by upper diagonal matrix; */ 
     
    204205 
    205206/* square root of 0<a<1 using taylor at 0.5 in q15*/ 
    206 int int_sqrt(int x) { 
     207int16 int_sqrt(int16 x) { 
    207208        double xd(double(x)/32768.); 
    208209        return round(sqrt(xd)*32768); 
     
    213214#define k2 11585 //0.25*sqrt(2)*32768 
    214215 
    215     int tmp; 
     216    int16 tmp; 
    216217    if (x>6554) { 
    217         int xm05=x-16384; 
     218        int16 xm05=x-16384; 
    218219        tmp = ((long)k1*xm05)>>15; 
    219220        tmp-=(((long(k2)*xm05)>>15)*xm05)>>15; 
     
    226227} 
    227228 
    228 void householder(int *Ch /*= int *PSICh*/, int *Q, unsigned int dimx) { 
    229     int k,j,i; 
    230     int alpha,beta; 
    231     long sigma; 
    232     int B[25];//beware 
    233     int w[5]; 
    234     int v[5]; 
     229void householder(int16 *Ch /*= int16 *PSICh*/, int16 *Q, unsigned int16 dimx) { 
     230    int16 k,j,i; 
     231    int16 alpha,beta; 
     232    int32  sigma; // 2*qCh 
     233    int32  tmp_long; 
     234    int16 B[25];//Q in qCh 
     235    int16 w[5]; 
     236    int16 v[5]; 
    235237 
    236238    // copy Q to B 
    237239    for (i=0;i<dimx*dimx;i++) 
    238240    { 
    239         B[i]=Q[i]; 
     241        B[i]=Q[i]>>(15-qCh); 
    240242    } 
    241243 
     
    245247        for (j=0;j<dimx;j++) 
    246248        { 
    247             sigma+=(long)B[k*dimx+j]*B[k*dimx+j]; 
     249            sigma+=((long)B[k*dimx+j]*B[k*dimx+j]); 
    248250        } 
    249251        for (j=0;j<=k;j++) 
    250252        { 
    251             sigma+=(long)Ch[k*dimx+j]*Ch[k*dimx+j]; 
    252         } 
    253         /*               double sigf=double(sigma)/(1<<15); 
    254                          double alpf = sqrt(sigf);*/ 
    255 //              if (sigma>16384) sigma=16384; 
    256 //        alpha=int_sqrt(sigma); 
    257           alpha = (int)(sqrt((double)sigma)+0.5);   // predelat pro DSP 
    258         // alpha = alpf*(1<<15); 
    259         // 
    260         sigma=0; 
     253            sigma+=((long)Ch[k*dimx+j]*Ch[k*dimx+j]); 
     254        } 
     255         
     256        //alpha in qCh 
     257        alpha = (int)(sqrt((double)sigma)+0.5);   // predelat pro DSP 
     258 
     259                sigma=0; 
    261260        for (j=0;j<dimx;j++) { 
    262261            w[j]=B[k*dimx+j]; 
    263             sigma+=(long)w[j])*w[j]; 
     262            sigma+=(long)w[j]*w[j]; 
    264263        } 
    265264        for (j=0; j<=k;j++) { 
     
    272271        } 
    273272         
    274         alpha=sigma>>16; 
     273        alpha=sigma>>(qCh+1); // alpha = sigma /2; 
    275274        if (alpha==0) alpha =1; 
    276275 
     
    278277            sigma=0; 
    279278            for (j=0;j<dimx;j++) { 
    280                 sigma+=(long)B[i*dimx+j]*w[j]; 
     279                sigma+=((long)B[i*dimx+j]*w[j]); 
    281280            } 
    282281            for (j=0;j<=k;j++) { 
     
    285284 
    286285            sigma = sigma >> 15;               // navrat do Q15 
    287  
     286            if (sigma>32767)sigma=32767; 
     287                         
    288288            for (j=0;j<dimx;j++)  
    289289            { 
    290                 B[i*dimx+j]-=(sigma*w[j])/alpha; 
     290                                tmp_long=B[i*dimx+j]-(sigma*w[j])/alpha; 
     291                                if (tmp_long>32767) { 
     292                                        B[i*dimx+j]=32767; 
     293                                } else { 
     294                                        if (tmp_long<-32767){ 
     295                                                B[i*dimx+j]=-32767; 
     296                                        } else { 
     297                                                B[i*dimx+j]=tmp_long; 
     298                                        } 
     299                                }                        
    291300            }; 
    292301             
    293302            for (j=0;j<=k;j++) 
    294303            { 
    295                 Ch[i*dimx+j]-=(sigma*v[j])/alpha; 
    296             } 
    297         } 
    298     } 
    299  
    300 } 
    301  
    302 void carlson(int *difz, int *xp, int *Ch, int *R, unsigned int dimy, unsigned int dimx ) { 
    303     int alpha,beta,gamma; 
    304     int delta, eta,epsilon,zeta,sigma,tau; 
    305     int i,j,iy; 
    306     int w[5]; 
     304                tmp_long=Ch[i*dimx+j]-(sigma*v[j])/alpha; 
     305                                if (tmp_long>32767) { 
     306                                        Ch[i*dimx+j]=32767; 
     307                                } else { 
     308                                        if (tmp_long<-32767){ 
     309                                                Ch[i*dimx+j]=-32767; 
     310                                        } else { 
     311                                                Ch[i*dimx+j]=tmp_long; 
     312                                        } 
     313                                } 
     314                        } 
     315        } 
     316    } 
     317 
     318} 
     319 
     320void carlson(int16 *difz, int16 *xp, int16 *Ch, int16 *R, unsigned int16 dimy, unsigned int16 dimx ) { 
     321    int16 alpha,beta,gamma; 
     322    int16 delta, eta,epsilon,zeta,sigma,tau; 
     323    int16 i,j,iy; 
     324    int16 w[5]; 
     325        int32 tmp_long; 
    307326 
    308327    for (iy=0; iy<dimy; iy++) 
     
    325344            for (i=0;i<=j;i++) { 
    326345                tau=Ch[i*dimx+j]; 
    327                 Ch[i*dimx+j]=((long)beta*Ch[i*dimx+j] -(long)sigma*w[i])/gamma; 
     346                                tmp_long=((long)beta*Ch[i*dimx+j] -(long)sigma*w[i])/gamma; 
     347                                if (tmp_long>32767) { 
     348                                        Ch[i*dimx+j]=32767; 
     349                                } else { 
     350                                        if (tmp_long<-32767){ 
     351                                                Ch[i*dimx+j]=-32767; 
     352                                        } else { 
     353                                                Ch[i*dimx+j]=tmp_long; 
     354                                        } 
     355                                } 
     356                                 
    328357                w[i]+=((long)tau*sigma)>>15; 
    329358            } 
     
    338367 
    339368/* perform Householder update of Ch matrix using PSI*Ch , Q, */ 
    340 extern void givens(int *Ch /*= int *PSICh*/, int *Q, unsigned int dimx){ 
    341         int i,j,k; 
    342         int rho,s,c,tau; 
    343  
    344         int A[25];//beware 
     369extern void givens(int16 *Ch /*= int16 *PSICh*/, int16 *Q, unsigned int16 dimx){ 
     370        int16 i,j,k; 
     371        int16 rho,s,c,tau; 
     372        int32  tmp_long; 
     373 
     374        int16 A[25];//beware 
    345375        // copy Q to A 
    346376        for (i=0;i<dimx*dimx;i++) { 
    347                 A[i]=Q[i]; 
     377                A[i]=Q[i]>>(15-qCh); 
    348378        } 
    349379 
     
    351381        for (i=dimx-1; i>=0; i--){ 
    352382                for (j=0; j<dimx; j++) { 
    353                         rho=int_sqrt(((long)Ch[i*dimx+i]*Ch[i*dimx+i]+long(A[i*dimx+j])*A[i*dimx+j])>>15); 
    354                         if (rho==0) break; 
    355                         s=(long(A[i*dimx+j])<<15)/rho; 
    356                         c=(long(Ch[i*dimx+i])<<15)/rho; 
    357                         for (k=0;k<=i; k++){ 
    358                                 tau=(long(c)*A[k*dimx+j]-long(s)*Ch[k*dimx+i])>>15; 
    359                                 Ch[k*dimx +i]=(long(s)*A[k*dimx+j]+long(c)*Ch[k*dimx+i])>>15; 
    360                                 A[k*dimx +j]=tau; 
     383                        tmp_long=(long)Ch[i*dimx+i]*Ch[i*dimx+i]+long(A[i*dimx+j])*A[i*dimx+j]; 
     384                        if (tmp_long>0){ 
     385                                rho=sqrt(double(tmp_long)); 
     386                                s=(long(A[i*dimx+j])<<15)/rho; 
     387                                c=(long(Ch[i*dimx+i])<<15)/rho; 
     388                                for (k=0;k<=i; k++){ 
     389                                        tau=(long(c)*A[k*dimx+j]-long(s)*Ch[k*dimx+i])>>15; 
     390                                        Ch[k*dimx +i]=(long(s)*A[k*dimx+j]+long(c)*Ch[k*dimx+i])>>15; 
     391                                        A[k*dimx +j]=tau; 
     392                                } 
    361393                        } 
    362394                } 
    363395        } 
    364396        for (j=0; j<i; j++){ 
    365                 rho=int_sqrt((long(Ch[i*dimx+i])*Ch[i*dimx+i]+long(Ch[i*dimx+j])*Ch[i*dimx+j])>>15); 
    366                 if (rho==0) break;  
    367                 s=(long(Ch[i*dimx+j])<<15)/rho; 
    368                 c=(long(Ch[i*dimx+i])<<15)/rho; 
    369                 for (k=0; k<=i; k++){ 
    370                         tau=(long(c)*Ch[k*dimx+j]-long(s)*Ch[k*dimx+i])>>15; 
    371                         Ch[k*dimx+i]=(long(s)*Ch[k*dimx+j]+long(c)*Ch[k*dimx+i])>>15; 
    372                         Ch[k*dimx+j]=tau; 
     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; 
     406                        } 
    373407                } 
    374408        } 
    375409} 
     410 
     411/* Matrix multiply Full matrix by upper diagonal matrix; */ 
     412void mmultACh(int16 *m1, int16 *up, int16 *result, unsigned int16 rows, unsigned int16 columns) { 
     413        unsigned int16 i, j, k; 
     414        int32 tmp_sum=0L; 
     415        int16 *m2pom; 
     416        int16 *m1pom=m1; 
     417        int16 *respom=result; 
     418         
     419        for (i=0; i<rows; i++) //rows of result 
     420    { 
     421                for (j=0; j<columns; j++) //columns of result 
     422        { 
     423                        m2pom=up+j;//?? 
     424                         
     425                        for (k=0; k<=j; k++) //inner loop up to "j" - U(j,j)==1; 
     426            { 
     427                                tmp_sum+=(int32)(*(m1pom++))**m2pom; 
     428                                m2pom+=columns; 
     429                        } 
     430                        m1pom-=(j+1); // shift back to first element 
     431                         
     432                        *respom++=tmp_sum>>15; 
     433                         
     434                        tmp_sum=0; 
     435                } 
     436                m1pom+=(columns); 
     437        } 
     438}