/************************************ Extended Kalman Filter Matrix operations V. Smidl, Z. Peroutka Rev. 28.10.2010 (ZP) 26.10.2010 Prvni verze (VS) 26.10.2010 Upravena chyba v Thorton_fast - spatne shiftovani o vypoctu SIGMA. 27.10.2010 Pokus o odstraneni problemu v Thorton_fast - potize dela omezovani (orezavani) varianci. 28.10.2010 Drobne upravy v kodu. *************************************/ #include "matrix_vs.h" #include "qmath.h" #define HIGH_PRECISION 1 void householder(int16 *Ch, int16 *Q, unsigned int16 dimx) { int16 k,j,i; int16 alpha,beta; int32 sigma; // 2*qCh int32 tmp_long; int16 B[25];//Q in qCh int16 w[5]; int16 v[5]; int16 *B_ij, *Q_i, *B_kj, *Ch_kj, *Ch_ij, *w_j, *v_j; B_ij=B; Q_i=Q; // copy Q to B for (i=0;i>(15-qCh); } for (k=dimx-1; k>=0; k--) { sigma=0; B_kj=B+k*dimx+k; Ch_kj=Ch+k*dimx; for (j=k;j>(qCh+1); // alpha = sigma /2; if (alpha==0) alpha =1; for (i=0;i<=k;i++) { sigma=0; B_ij=B+i*dimx+i; w_j=w+i; for (j=i;j> 15; // navrat do Q15 if (sigma>32767) sigma=32767; B_ij=B+i*dimx+i; w_j=w+i; for (j=i;j32767) tmp_long=32767; if (tmp_long<-32768) tmp_long=-32768; *B_ij++=tmp_long; w_j++; }; Ch_ij=Ch+i*dimx; v_j=v; for (j=0;j<=k;j++) { tmp_long=((long)*Ch_ij*alpha-sigma**v_j)/alpha; if (tmp_long>32767) tmp_long=32767; if (tmp_long<-32768) tmp_long=-32768; *Ch_ij++=tmp_long; v_j++; } } } } void carlson(int16 *difz, int16 *xp, int16 *Ch, int16 *R, unsigned int16 dimy, unsigned int16 dimx ) { int16 alpha,beta,gamma; int16 delta, eta,epsilon,zeta,sigma,tau; int16 i,j,iy; int16 w[5]; int32 tmp_long; int16 *Ch_ij, *w_i, *x_i, *Ch_iyj; for (iy=0; iy>15; alpha=(((long)alpha<<15)+(long)sigma*sigma)>>15; // vyssi presnost gamma= qsqrt(((long)alpha*beta)); // predelat v DSP w[j]=0; Ch_ij=Ch+j; w_i=w; for (i=0;i<=j;i++) { tau=*Ch_ij; tmp_long=((long)beta**Ch_ij -(long)sigma**w_i)/gamma; /* *Ch_ij=tmp_long; if (tmp_long>32767) *Ch_ij=32767; if (tmp_long<-32768) *Ch_ij=-32768; /**/ if (tmp_long>32767) tmp_long=32767; if (tmp_long<-32768) tmp_long=-32768; *Ch_ij=tmp_long; // w_i+=((long)tau*sigma)>>15; *w_i=(((long)*w_i<<15)+(long)tau*sigma)>>15; w_i++; Ch_ij+=dimx; } } x_i=xp; w_i=w; for (i=0;i>15; tmp_sum=0; } m1pom+=(columns); } } void givens(int16 *Ch, int16 *Q, unsigned int16 dimx) { int16 i,j,k; int16 rho,s,c,tau; int32 tmp_long; int16 A[25];//beware int16 *A_ij, *Q_i, *Ch_ki, *Ch_kj, *Ch_ii, *Ch_ij, *A_kj; A_ij=A; Q_i=Q; // copy Q to A for (i=0;i>(15-qCh); } for (i=dimx-1; i>=0; i--) { Ch_ii=Ch+i*dimx+i; A_ij=A+i*dimx; for (j=0; j>15; *Ch_ki=((long)s**A_kj+(long)c**Ch_ki)>>15; *A_kj=tau; Ch_ki+=dimx; A_kj+=dimx; } } A_ij++; } Ch_ij = Ch+i*dimx; for (j=0; j>15; *Ch_ki =((long)s**Ch_kj+(long)c**Ch_ki)>>15; *Ch_kj=tau; Ch_kj += dimx; Ch_ki += dimx; } } Ch_ij++; } } }