Show
Ignore:
Timestamp:
04/04/11 14:15:18 (13 years ago)
Author:
smidl
Message:

Carlson fast with C + test

Files:
1 modified

Legend:

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

    r1313 r1321  
    1919#include "matrix.h" 
    2020 
     21#include <stdio.h> 
    2122/* Matrix multiply Full matrix by upper diagonal matrix; */ 
    2223void mmultAU(int16 *m1, int16 *up, int16 *result, unsigned int16 rows, unsigned int16 columns) { 
     
    204205                                //                *U_ij +=  ((int32)lambda*(*b_i))>>15;         // puvodni reseni 
    205206                                *U_ij -=  ((int32)(*a_j)*(*b_i))/lambda;         // pozadovane optimalni reseni 
    206                                 //                *U_ij -=  ((int32)((int16)((int32)(*a_j)<<15)/lambda)**b_i)>>15;      // tohle funguje - problem je s tim pretypovanim na (int16) 
    207                                 //                              *U_ij -= (int16)((int32)(*a_j)*(*b_i))/lambda; 
    208                                 //                              z_pom = (((int32)(*a_j)*(*b_i))/lambda); 
    209                                 /*                          z_pom = (int32)(*U_ij)-(int16)((int32)(*a_j)*(*b_i))/lambda; 
    210                                  *                              if (z_pom > 32767) z_pom = 32767; 
    211                                  *                              if (z_pom < - 32768) z_pom = -32768; 
    212                                  *U_ij = z_pom;                      /**/ 
    213                                  //                *U_ij +=  ((int32)z_pom_int16*(*b_i))>>15;           // puvodni reseni - jen jina konstanta 
    214207                                 *b_i  +=  ((int32)beta*(*b_j))>>15; 
     208                                 printf("%d, %d, %d\n", ((int32)(*a_j)*(*b_i))/lambda, *b_i, beta); 
    215209                        } 
    216210                } 
     
    218212                for (i=0,x_i=xp,b_i=b; i<dimx; i++,x_i++,b_i++) { 
    219213                        *x_i  += ((int32)difz[iy]*(*b_i))/alpha; // multiply by unscaled Kalman gain 
    220                          
    221214                } 
    222215        } 
     
    700693} 
    701694 
     695void carlson_fastC(int16 *difz, int16 *xp, int16 *Ch, int16 *C, int16 *R, unsigned int16 dimy, unsigned int16 dimx ) { 
     696        int16 alpha,beta,gamma; 
     697        int16 delta, eta,epsilon,zeta,sigma,tau; 
     698        int16 i,j,iy; 
     699        int16 w[5]; 
     700        int32 tmp_long; 
     701         
     702        int16 *Ch_ij, *w_i, *x_i, *C_yi; 
     703         
     704         
     705        for (iy=0; iy<dimy; iy++) 
     706        { 
     707                alpha=R[iy]; 
     708                delta = difz[iy]; 
     709                 
     710                for (j=0;j<dimx;j++) 
     711                { 
     712                        C_yi = C+iy*dimx;  
     713                        sigma = 0; 
     714                        Ch_ij=Ch+j; 
     715                        for (i=0;i<=j;i++){ 
     716                                sigma += ((int32)*Ch_ij**C_yi)>>15; //sigma in qCh   
     717                                Ch_ij+=dimx; 
     718                                C_yi++; 
     719                        } 
     720                         
     721                        //sigma=Ch[iy*dimx+j]; 
     722                        beta=alpha; 
     723                        //            alpha+=((long)sigma*sigma)>>15; 
     724                        alpha=(((int32)alpha<<15)+(int32)sigma*sigma)>>15;                              // vyssi presnost 
     725                        //            gamma= qsqrt(((long)alpha*beta));                          // verze pro DSP 
     726                        gamma= (int16)(sqrt((double)((int32)alpha*beta)));              // verze pro PC 
     727                         
     728                        w[j]=0; 
     729                         
     730                        Ch_ij=Ch+j; 
     731                        w_i=w; 
     732                         
     733                        for (i=0;i<=j;i++) 
     734                        { 
     735                                //                tau=Ch[i*dimx+j]; 
     736                                tau=*Ch_ij; 
     737                                //                              tmp_long=((long)beta*Ch[i*dimx+j] -(long)sigma*w[i])/gamma; 
     738                                tmp_long=((int32)beta**Ch_ij -(int32)sigma**w_i)/gamma; 
     739                                 
     740                                if (tmp_long>32767) 
     741                                        tmp_long=32767; 
     742                                if (tmp_long<-32768) 
     743                                        tmp_long=-32768; 
     744                                *Ch_ij=tmp_long; 
     745                                 
     746                                //                w_i+=((long)tau*sigma)>>15; 
     747                                *w_i=(((int32)*w_i<<15)+(int32)tau*sigma)>>15; 
     748                                 
     749                                w_i++; 
     750                                Ch_ij+=dimx; 
     751                        } 
     752                } 
     753                 
     754                x_i=xp; 
     755                w_i=w; 
     756                for (i=0;i<dimx;i++) { 
     757                        //            xp[i]+=((long)w[i]*delta)/alpha; 
     758                        //            *x_i+=((long)*w_i*delta)/alpha; 
     759                        *x_i=((int32)*x_i*alpha+(int32)*w_i*delta)/alpha;               // vyssi presnost 
     760                        x_i++; 
     761                        w_i++; 
     762                } 
     763        } 
     764} 
     765