40 for (i = 0; i < (MAGBUFFSIZEX - 1); i++)
41 pthisMagBuffer->
tanarray[i] = (
int16) (100.0F * tanf(
PI * (-0.5F + (
float) (i + 1) / MAGBUFFSIZEX)));
48 if (*((
uint32 *) pFlash++) == 0x12345678)
52 for (i =
CHX; i <=
CHZ; i++) pthisMagCal->
fV[i] = *(pFlash++);
53 for (i =
CHX; i <=
CHZ; i++)
54 for (j =
CHX; j <=
CHZ; j++)
55 pthisMagCal->
finvW[i][j] = *(pFlash++);
56 pthisMagCal->
fB = *(pFlash++);
57 pthisMagCal->
fBSq = *(pFlash++);
66 pthisMagCal->
fV[
CHX] = pthisMagCal->
fV[
CHY] = pthisMagCal->
fV[
CHZ] = 0.0F;
106 if (pthisMag->
iBc[
CHZ] == 0)
return;
123 (pthisMagBuffer->
index[j][k] != -1))
126 for (i =
CHX; i <=
CHZ; i++)
128 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
131 pthisMagBuffer->
index[j][k] = loopcounter;
138 (pthisMagBuffer->
index[j][k] == -1))
141 for (i =
CHX; i <=
CHZ; i++)
143 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
146 pthisMagBuffer->
index[j][k] = loopcounter;
156 if (pthisMagBuffer->
index[j][k] < i)
159 if (pthisMagBuffer->
index[j][k] != -1)
166 i = pthisMagBuffer->
index[l][m];
173 pthisMagBuffer->
index[l][m] = -1;
179 (pthisMagBuffer->
index[j][k] == -1))
182 for (i =
CHX; i <=
CHZ; i++)
184 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
187 pthisMagBuffer->
index[j][k] = loopcounter;
195 (pthisMagBuffer->
index[j][k] != -1))
199 for (i =
CHX; i <=
CHZ; i++)
201 idelta += abs((
int32) pthisMag->
iBs[i] -
202 (
int32) pthisMagBuffer->
iBs[i][j][k]);
209 for (i =
CHX; i <=
CHZ; i++)
211 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
214 pthisMagBuffer->
index[j][k] = loopcounter;
233 if (pthisMagBuffer->
index[j][k] != -1)
237 for (i =
CHX; i <=
CHZ; i++)
239 idelta += abs((
int32) pthisMag->
iBs[i] -
240 (
int32) pthisMagBuffer->
iBs[i][j][k]);
267 for (i =
CHX; i <=
CHZ; i++)
269 pthisMagBuffer->
iBs[i][l][m] = pthisMag->
iBs[i];
272 pthisMagBuffer->
index[l][m] = loopcounter;
292 for (i =
CHX; i <=
CHZ; i++)
294 ftmp[i] = pthisMag->
fBs[i] - pthisMagCal->
fV[i];
298 for (i =
CHX; i <=
CHZ; i++)
408 pthisMagCal->
fB = pthisMagCal->
ftrB;
409 pthisMagCal->
fBSq = pthisMagCal->
fB * pthisMagCal->
fB;
410 for (i =
CHX; i <=
CHZ; i++)
412 pthisMagCal->
fV[i] = pthisMagCal->
ftrV[i];
413 for (j =
CHX; j <=
CHZ; j++)
424 pthisMagBuffer->
index[i][j] = -1;
472 pthisMagCal->
fYTY = 0.0F;
473 for (i = 0; i < 4; i++)
475 pthisMagCal->
fvecA[i] = 0.0F;
476 for (j = i; j < 4; j++) pthisMagCal->
fmatA[i][j] = 0.0F;
481 for (i = 0; i < 3; i++) pthisMagCal->
iSumBs[i] = 0;
488 if (pthisMagBuffer->
index[i][j] != -1)
491 for (k = 0; k < 3; k++)
498 for (i = 0; i < 3; i++)
500 if (pthisMagCal->
iSumBs[i] >= 0)
529 int32 iBsZeroMean[3];
535 if (pthisMagBuffer->
index[i][j] != -1)
538 for (k = 0; k < 3; k++)
542 pthisMagCal->
fmatA[0][0] += (
float) (iBsZeroMean[0] * iBsZeroMean[0]);
543 pthisMagCal->
fmatA[0][1] += (float) (iBsZeroMean[0] * iBsZeroMean[1]);
544 pthisMagCal->
fmatA[0][2] += (float) (iBsZeroMean[0] * iBsZeroMean[2]);
545 pthisMagCal->
fmatA[1][1] += (float) (iBsZeroMean[1] * iBsZeroMean[1]);
546 pthisMagCal->
fmatA[1][2] += (float) (iBsZeroMean[1] * iBsZeroMean[2]);
547 pthisMagCal->
fmatA[2][2] += (float) (iBsZeroMean[2] * iBsZeroMean[2]);
550 fBsZeroMeanSq = (float)
559 for (k = 0; k < 3; k++)
560 pthisMagCal->
fvecA[k] += (
float) iBsZeroMean[k] * fBsZeroMeanSq;
561 pthisMagCal->
fvecA[3] += fBsZeroMeanSq;
564 pthisMagCal->
fYTY += fBsZeroMeanSq * fBsZeroMeanSq;
585 for (i = 0; i < 4; i++)
587 for (j = 0; j <= i; j++)
588 pthisMagCal->
fmatB[i][j] = pthisMagCal->
fmatB[j][i] = pthisMagCal->
fmatA[i][j] = pthisMagCal->
fmatA[j][i];
592 for (i = 0; i < 4; i++) pfRows[i] = pthisMagCal->
fmatB[i];
610 for (i = 0; i < 4; i++)
612 pthisMagCal->
fvecB[i] = pthisMagCal->
fmatB[i][0] * pthisMagCal->
fvecA[0];
613 for (j = 1; j < 4; j++)
614 pthisMagCal->
fvecB[i] += pthisMagCal->
fmatB[i][j] * pthisMagCal->
fvecA[j];
619 for (i =
CHX; i <=
CHZ; i++)
620 pthisMagCal->
ftrV[i] = ftmp * pthisMagCal->
fvecB[i];
623 pthisMagCal->
ftrB = pthisMagCal->
fvecB[3] *
626 for (i =
CHX; i <=
CHZ; i++)
627 pthisMagCal->
ftrB += pthisMagCal->
ftrV[i] * pthisMagCal->
ftrV[i];
628 pthisMagCal->
ftrB = sqrtf(fabs(pthisMagCal->
ftrB));
632 for (i =
CHX; i <=
CHZ; i++)
633 pthisMagCal->
ftrV[i] += (
float) pthisMagCal->
iSumBs[i] * ftmp;
637 fE = pthisMagCal->
fvecB[0] * pthisMagCal->
fvecA[0];
638 for (i = 1; i < 4; i++)
639 fE += pthisMagCal->
fvecB[i] * pthisMagCal->
fvecA[i];
642 fE = pthisMagCal->
fYTY - 2.0F * fE;
645 for (i = 0; i < 4; i++)
647 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][0] * pthisMagCal->
fvecB[0];
648 for (j = 1; j < 4; j++)
649 pthisMagCal->
fvecA[i] += pthisMagCal->
fmatA[i][j] * pthisMagCal->
fvecB[j];
653 for (i = 0; i < 4; i++)
654 fE += pthisMagCal->
fvecB[i] * pthisMagCal->
fvecA[i];
684 #define MATRIX_7_SIZE 7 702 pthisMagCal->
fmatA[i][j] = 0.0F;
706 for (i = 0; i < 3; i++) pthisMagCal->
iSumBs[i] = 0;
711 if (pthisMagBuffer->
index[i][j] != -1)
714 for (k = 0; k < 3; k++)
721 for (i = 0; i < 3; i++)
723 if (pthisMagCal->
iSumBs[i] >= 0)
753 if (pthisMagBuffer->
index[i][j] != -1)
756 for (k = 0; k < 3; k++)
758 pthisMagCal->
fvecA[k + 3] = (float)
760 (
int32) pthisMagBuffer->
iBs[k][i][j] -
763 pthisMagCal->
fvecA[k] = pthisMagCal->
fvecA[k + 3] * pthisMagCal->
fvecA[k + 3];
768 for (k = 0; k < 3; k++)
769 pthisMagCal->
fmatA[k][6] += pthisMagCal->
fvecA[k];
775 pthisMagCal->
fmatA[k][l] += pthisMagCal->
fvecA[k] * pthisMagCal->
fvecA[l];
795 for (j = 0; j < i; j++)
796 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fmatA[j][i];
802 pthisMagCal->
fmatB[i][j] = 0.0F;
803 pthisMagCal->
fmatB[i][i] = 1.0F;
804 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
852 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
868 fresidue += fabsf(pthisMagCal->
fmatA[i][j]);
889 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[imin]) imin = i;
894 fdetA = pthisMagCal->
fmatB[
CHX][imin] *
901 pthisMagCal->
fmatB[i][imin] = -pthisMagCal->
fmatB[i][imin];
907 for (i =
CHX; i <=
CHZ; i++)
908 pthisMagCal->
ftrV[i] = -0.5F *
909 pthisMagCal->
fmatB[i + 3][imin] /
910 pthisMagCal->
fmatB[i][imin];
913 ftmp = -pthisMagCal->
fmatB[6][imin];
914 for (i =
CHX; i <=
CHZ; i++)
915 ftmp += pthisMagCal->
fmatB[i][imin] *
916 pthisMagCal->
ftrV[i] *
917 pthisMagCal->
ftrV[i];
927 ftmp = powf(fabs(fdetA), -(
ONETHIRD));
928 for (i =
CHX; i <=
CHZ; i++)
930 pthisMagCal->
fA[i][i] = pthisMagCal->
fmatB[i][imin] * ftmp;
931 pthisMagCal->
ftrinvW[i][i] = sqrtf(fabsf(pthisMagCal->
fA[i][i]));
940 pthisMagCal->
ftrB *= sqrt(fabs(ftmp));
943 for (i =
CHX; i <=
CHZ; i++)
944 pthisMagCal->
ftrV[i] =
946 pthisMagCal->
ftrV[i] +
947 (
float) pthisMagCal->
iMeanBs[i]
971 #define MATRIX_10_SIZE 10 989 pthisMagCal->
fmatA[i][j] = 0.0F;
993 for (i = 0; i < 3; i++) pthisMagCal->
iSumBs[i] = 0;
998 if (pthisMagBuffer->
index[i][j] != -1)
1001 for (k = 0; k < 3; k++)
1008 for (i = 0; i < 3; i++)
1010 if (pthisMagCal->
iSumBs[i] >= 0)
1041 if (pthisMagBuffer->
index[i][j] != -1)
1044 for (k = 0; k < 3; k++)
1045 pthisMagCal->
fvecA[k + 6] = (
float)
1047 (
int32) pthisMagBuffer->
iBs[k][i][j] -
1052 pthisMagCal->
fvecA[0] = pthisMagCal->
fvecA[6] * pthisMagCal->
fvecA[6];
1053 pthisMagCal->
fvecA[1] = 2.0F *
1054 pthisMagCal->
fvecA[6] *
1055 pthisMagCal->
fvecA[7];
1056 pthisMagCal->
fvecA[2] = 2.0F *
1057 pthisMagCal->
fvecA[6] *
1058 pthisMagCal->
fvecA[8];
1059 pthisMagCal->
fvecA[3] = pthisMagCal->
fvecA[7] * pthisMagCal->
fvecA[7];
1060 pthisMagCal->
fvecA[4] = 2.0F *
1061 pthisMagCal->
fvecA[7] *
1062 pthisMagCal->
fvecA[8];
1063 pthisMagCal->
fvecA[5] = pthisMagCal->
fvecA[8] * pthisMagCal->
fvecA[8];
1067 for (k = 0; k < 6; k++)
1068 pthisMagCal->
fmatA[k][9] += pthisMagCal->
fvecA[k];
1074 pthisMagCal->
fmatA[k][l] += pthisMagCal->
fvecA[k] * pthisMagCal->
fvecA[l];
1094 for (j = 0; j < i; j++)
1095 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fmatA[j][i];
1101 pthisMagCal->
fmatB[i][j] = 0.0F;
1102 pthisMagCal->
fmatB[i][i] = 1.0F;
1103 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
1166 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
1182 fresidue += fabsf(pthisMagCal->
fmatA[i][j]);
1185 if (fresidue > 0.0F)
1203 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[imin]) imin = i;
1218 fdetA = fabs(fdetA);
1220 pthisMagCal->
fmatB[i][imin] = -pthisMagCal->
fmatB[i][imin];
1227 for (i =
CHX; i <=
CHZ; i++)
1229 pthisMagCal->
ftrV[i] = pthisMagCal->
finvA[i][0] *
1230 pthisMagCal->
fmatB[6][imin] +
1231 pthisMagCal->
finvA[i][1] *
1232 pthisMagCal->
fmatB[7][imin] +
1233 pthisMagCal->
finvA[i][2] *
1234 pthisMagCal->
fmatB[8][imin];
1235 pthisMagCal->
ftrV[i] *= -0.5F;
1249 ftmp -= pthisMagCal->
fmatB[9][imin];
1250 ftmp += pthisMagCal->
fA[
CHX][
CHX] *
1253 ftmp += pthisMagCal->
fA[
CHY][
CHY] *
1256 ftmp += pthisMagCal->
fA[
CHZ][
CHZ] *
1259 pthisMagCal->
ftrB = sqrtf(fabsf(ftmp));
1263 pthisMagCal->
fvecA[imin] /
1265 )) / (pthisMagCal->
ftrB * pthisMagCal->
ftrB);
1271 for (i =
CHX; i <=
CHZ; i++)
1272 pthisMagCal->
ftrV[i] =
1274 pthisMagCal->
ftrV[i] +
1275 (
float) pthisMagCal->
iMeanBs[i]
1280 ftmp = powf(fabs(fdetA), -(
ONETHIRD));
1286 pthisMagCal->
ftrB *= sqrt(fabs(ftmp));
1291 for (i = 0; i < 3; i++)
1293 for (j = 0; j < 3; j++)
1295 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fA[i][j];
1296 pthisMagCal->
fmatB[i][j] = 0.0F;
1299 pthisMagCal->
fmatB[i][i] = 1.0F;
1300 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
1332 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
1334 pthisMagCal->
fvecA, i, j, 3);
1346 fresidue = fabsf(pthisMagCal->
fmatA[0][1]) + fabsf(pthisMagCal->
fmatA[0][2]) + fabsf(pthisMagCal->
fmatA[1][2]);
1347 if (fresidue > 0.0F)
1360 for (j = 0; j < 3; j++)
1362 ftmp = sqrtf(sqrtf(fabsf(pthisMagCal->
fvecA[j])));
1363 for (i = 0; i < 3; i++)
1364 pthisMagCal->
fmatB[i][j] *= ftmp;
1370 for (i = 0; i < 3; i++)
1372 for (j = i; j < 3; j++)
1375 pthisMagCal->
fmatB[i][0] *
1376 pthisMagCal->
fmatB[j][0] +
1377 pthisMagCal->
fmatB[i][1] *
1378 pthisMagCal->
fmatB[j][1] +
1379 pthisMagCal->
fmatB[i][2] *
1380 pthisMagCal->
fmatB[j][2];
1424 for (i = 0; i < 4; i++)
1426 pthisMagCal->
fvecB[i] = 0.0F;
1427 for (j = i; j < 4; j++)
1429 pthisMagCal->
fmatA[i][j] = 0.0F;
1434 iOffset[
CHX] = iOffset[
CHY] = iOffset[
CHZ] = 0;
1442 if (pthisMagBuffer->
index[j][k] != -1)
1447 for (l =
CHX; l <=
CHZ; l++)
1449 iOffset[l] = pthisMagBuffer->
iBs[l][j][k];
1454 for (l =
CHX; l <=
CHZ; l++)
1456 pthisMagCal->
fvecA[l] = (float)
1458 (
int32) pthisMagBuffer->
iBs[l][j][k] -
1461 pthisMagCal->
fvecA[l + 3] = pthisMagCal->
fvecA[l] * pthisMagCal->
fvecA[l];
1465 fBs2 = pthisMagCal->
fvecA[3] +
1466 pthisMagCal->
fvecA[4] +
1467 pthisMagCal->
fvecA[5];
1470 fSumBs4 += fBs2 * fBs2;
1473 for (l =
CHX; l <=
CHZ; l++)
1475 pthisMagCal->
fvecB[l] += pthisMagCal->
fvecA[l] * fBs2;
1479 pthisMagCal->
fvecB[3] += fBs2;
1499 pthisMagCal->
fmatA[3][3] = (float) iCount;
1505 for (i = 0; i < 4; i++)
1507 for (j = i; j < 4; j++)
1509 pthisMagCal->
fmatB[i][j] = pthisMagCal->
fmatB[j][i] = pthisMagCal->
fmatA[j][i] = pthisMagCal->
fmatA[i][j];
1514 for (i = 0; i < 4; i++)
1516 pfRows[i] = pthisMagCal->
fmatB[i];
1522 for (i = 0; i < 4; i++)
1524 pthisMagCal->
fvecA[i] = 0.0F;
1525 for (k = 0; k < 4; k++)
1527 pthisMagCal->
fvecA[i] += pthisMagCal->
fmatB[i][k] * pthisMagCal->
fvecB[k];
1535 for (i = 0; i < 4; i++)
1537 fE += pthisMagCal->
fvecA[i] * pthisMagCal->
fvecB[i];
1540 fE = fSumBs4 - 2.0F * fE;
1543 for (i = 0; i < 4; i++)
1545 pthisMagCal->
fvecB[i] = 0.0F;
1546 for (k = 0; k < 4; k++)
1548 pthisMagCal->
fvecB[i] += pthisMagCal->
fmatA[i][k] * pthisMagCal->
fvecA[k];
1553 for (i = 0; i < 4; i++)
1555 fE += pthisMagCal->
fvecB[i] * pthisMagCal->
fvecA[i];
1559 for (l =
CHX; l <=
CHZ; l++)
1561 pthisMagCal->
ftrV[l] = 0.5F * pthisMagCal->
fvecA[l];
1574 for (l =
CHX; l <=
CHZ; l++)
1576 pthisMagCal->
ftrV[l] = pthisMagCal->
ftrV[l] *
1578 (float) iOffset[l] *
1609 iOffset[
CHX] = iOffset[
CHY] = iOffset[
CHZ] = 0;
1612 for (m = 0; m < 7; m++)
1614 for (n = m; n < 7; n++)
1616 pthisMagCal->
fmatA[m][n] = 0.0F;
1626 if (pthisMagBuffer->
index[j][k] != -1)
1631 for (l =
CHX; l <=
CHZ; l++)
1633 iOffset[l] = pthisMagBuffer->
iBs[l][j][k];
1638 for (l =
CHX; l <=
CHZ; l++)
1640 pthisMagCal->
fvecA[l + 3] = (float)
1642 (
int32) pthisMagBuffer->
iBs[l][j][k] -
1645 pthisMagCal->
fvecA[l] = pthisMagCal->
fvecA[l + 3] * pthisMagCal->
fvecA[l + 3];
1652 for (m = 0; m < 6; m++)
1654 pthisMagCal->
fmatA[m][6] += pthisMagCal->
fvecA[m];
1658 for (m = 0; m < 6; m++)
1660 for (n = m; n < 6; n++)
1662 pthisMagCal->
fmatA[m][n] += pthisMagCal->
fvecA[m] * pthisMagCal->
fvecA[n];
1673 pthisMagCal->
fmatA[6][6] = (float) iCount;
1679 for (m = 1; m < 7; m++)
1681 for (n = 0; n < m; n++)
1683 pthisMagCal->
fmatA[m][n] = pthisMagCal->
fmatA[n][m];
1693 for (i = 1; i < 7; i++)
1695 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[j])
1705 for (l =
CHX; l <=
CHZ; l++)
1707 pthisMagCal->
fA[l][l] = pthisMagCal->
fmatB[l][j];
1708 det *= pthisMagCal->
fA[l][l];
1709 pthisMagCal->
ftrV[l] = -0.5F *
1710 pthisMagCal->
fmatB[l + 3][j] /
1711 pthisMagCal->
fA[l][l];
1718 pthisMagCal->
fmatB[6][j] = -pthisMagCal->
fmatB[6][j];
1723 ftmp = -pthisMagCal->
fmatB[6][j];
1724 for (l =
CHX; l <=
CHZ; l++)
1726 ftmp += pthisMagCal->
fA[l][l] *
1727 pthisMagCal->
ftrV[l] *
1728 pthisMagCal->
ftrV[l];
1739 for (l =
CHX; l <=
CHZ; l++)
1741 pthisMagCal->
ftrinvW[l][l] = sqrtf(fabsf(pthisMagCal->
fA[l][l]));
1742 pthisMagCal->
ftrV[l] = pthisMagCal->
ftrV[l] *
1744 (float) iOffset[l] *
1772 iOffset[
CHX] = iOffset[
CHY] = iOffset[
CHZ] = 0;
1775 for (m = 0; m < 10; m++)
1777 for (n = m; n < 10; n++)
1779 pthisMagCal->
fmatA[m][n] = 0.0F;
1789 if (pthisMagBuffer->
index[j][k] != -1)
1794 for (l =
CHX; l <=
CHZ; l++)
1796 iOffset[l] = pthisMagBuffer->
iBs[l][j][k];
1801 for (l =
CHX; l <=
CHZ; l++)
1803 pthisMagCal->
fvecA[l + 6] = (float)
1805 (
int32) pthisMagBuffer->
iBs[l][j][k] -
1811 pthisMagCal->
fvecA[0] = pthisMagCal->
fvecA[6] * pthisMagCal->
fvecA[6];
1812 pthisMagCal->
fvecA[1] = 2.0F *
1813 pthisMagCal->
fvecA[6] *
1814 pthisMagCal->
fvecA[7];
1815 pthisMagCal->
fvecA[2] = 2.0F *
1816 pthisMagCal->
fvecA[6] *
1817 pthisMagCal->
fvecA[8];
1818 pthisMagCal->
fvecA[3] = pthisMagCal->
fvecA[7] * pthisMagCal->
fvecA[7];
1819 pthisMagCal->
fvecA[4] = 2.0F *
1820 pthisMagCal->
fvecA[7] *
1821 pthisMagCal->
fvecA[8];
1822 pthisMagCal->
fvecA[5] = pthisMagCal->
fvecA[8] * pthisMagCal->
fvecA[8];
1827 for (m = 0; m < 9; m++)
1829 pthisMagCal->
fmatA[m][9] += pthisMagCal->
fvecA[m];
1833 for (m = 0; m < 9; m++)
1835 for (n = m; n < 9; n++)
1837 pthisMagCal->
fmatA[m][n] += pthisMagCal->
fvecA[m] * pthisMagCal->
fvecA[n];
1848 pthisMagCal->
fmatA[9][9] = (float) iCount;
1854 for (m = 1; m < 10; m++)
1856 for (n = 0; n < m; n++)
1858 pthisMagCal->
fmatA[m][n] = pthisMagCal->
fmatA[n][m];
1868 for (i = 1; i < 10; i++)
1870 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[j])
1876 pthisMagCal->
fA[0][0] = pthisMagCal->
fmatB[0][j];
1877 pthisMagCal->
fA[0][1] = pthisMagCal->
fA[1][0] = pthisMagCal->
fmatB[1][j];
1878 pthisMagCal->
fA[0][2] = pthisMagCal->
fA[2][0] = pthisMagCal->
fmatB[2][j];
1879 pthisMagCal->
fA[1][1] = pthisMagCal->
fmatB[3][j];
1880 pthisMagCal->
fA[1][2] = pthisMagCal->
fA[2][1] = pthisMagCal->
fmatB[4][j];
1881 pthisMagCal->
fA[2][2] = pthisMagCal->
fmatB[5][j];
1888 pthisMagCal->
fmatB[6][j] = -pthisMagCal->
fmatB[6][j];
1889 pthisMagCal->
fmatB[7][j] = -pthisMagCal->
fmatB[7][j];
1890 pthisMagCal->
fmatB[8][j] = -pthisMagCal->
fmatB[8][j];
1891 pthisMagCal->
fmatB[9][j] = -pthisMagCal->
fmatB[9][j];
1899 for (l =
CHX; l <=
CHZ; l++)
1901 pthisMagCal->
ftrV[l] = 0.0F;
1902 for (m =
CHX; m <=
CHZ; m++)
1904 pthisMagCal->
ftrV[l] += pthisMagCal->
finvA[l][m] * pthisMagCal->
fmatB[m + 6][j];
1907 pthisMagCal->
ftrV[l] *= -0.5F;
1911 pthisMagCal->
ftrB = sqrtf(fabsf(pthisMagCal->
fA[0][0] *
1913 2.0F * pthisMagCal->
fA[0][1] *
1915 2.0F * pthisMagCal->
fA[0][2] *
1917 pthisMagCal->
fA[1][1] * pthisMagCal->
ftrV[
CHY] *
1918 pthisMagCal->
ftrV[
CHY] + 2.0F *
1919 pthisMagCal->
fA[1][2] * pthisMagCal->
ftrV[
CHY] *
1920 pthisMagCal->
ftrV[
CHZ] + pthisMagCal->
fA[2][2] *
1922 pthisMagCal->
fmatB[9][j]));
1929 for (l =
CHX; l <=
CHZ; l++)
1931 pthisMagCal->
ftrV[l] = pthisMagCal->
ftrV[l] *
1933 (float) iOffset[l] *
1947 for (i = 0; i < 3; i++)
1949 for (j = 0; j < 3; j++)
1951 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fA[i][j];
1959 for (j = 0; j < 3; j++)
1961 ftmp = sqrtf(sqrtf(fabsf(pthisMagCal->
fvecA[j])));
1962 for (i = 0; i < 3; i++)
1964 pthisMagCal->
fmatB[i][j] *= ftmp;
1971 for (i = 0; i < 3; i++)
1974 for (j = i; j < 3; j++)
1976 pthisMagCal->
ftrinvW[i][j] = 0.0F;
1979 for (k = 0; k < 3; k++)
1981 pthisMagCal->
ftrinvW[i][j] += pthisMagCal->
fmatB[i][k] * pthisMagCal->
fmatB[j][k];
float fvecA[10]
scratch 10x1 vector used by calibration algorithms
float fmatA[10][10]
scratch 10x10 float matrix used by calibration algorithms
void f3x3matrixAeqScalar(float A[][3], float Scalar)
function sets every entry in the 3x3 matrix A to a constant scalar
float fFitErrorpc
current fit error %
void fComputeEigSlice(float fmatA[10][10], float fmatB[10][10], float fvecA[10], int8 i, int8 j, int8 iMatrixSize)
int16_t iMagBufferCount
number of magnetometer readings
#define CAL_INTERVAL_SECS
300s or 5min interval for regular calibration checks
void f3x3matrixAeqAxScalar(float A[][3], float Scalar)
function multiplies all elements of 3x3 matrix A by the specified scalar
void iUpdateMagBuffer(struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag, int32 loopcounter)
#define CALIBRATION_NVM_ADDR
start of final 4K (sector size) of 1M flash
void f3x3matrixAeqMinusA(float A[][3])
function negates all elements of 3x3 matrix A
float finvW[3][3]
current inverse soft iron matrix
void fmatrixAeqInvA(float *A[], int8 iColInd[], int8 iRowInd[], int8 iPivot[], int8 isize, int8 *pierror)
int32_t iValidMagCal
solver used: 0 (no calibration) or 4, 7, 10 element
#define MESHDELTACOUNTS
magnetic buffer mesh spacing in counts (here 5uT)
#define MAGBUFFSIZEX
x dimension in magnetometer buffer (12x24 equals 288 elements)
int32_t index[MAGBUFFSIZEX][MAGBUFFSIZEY]
array of time indices
#define CHZ
Used to access Z-channel entries in various data data structures.
The MagSensor structure stores raw and processed measurements for a 3-axis magnetic sensor...
#define ONETHIRD
one third
void fComputeMagCalibration4(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
#define ONESIXTH
one sixth
int8_t i10ElementSolverTried
flag to denote at least one attempt made with 4 element calibration
#define MINMEASUREMENTS4CAL
minimum number of measurements for 4 element calibration
float fBc[3]
averaged calibrated measurement (uT)
void fEigenCompute10(float A[][10], float eigval[], float eigvec[][10], int8 n)
#define CHY
Used to access Y-channel entries in various data data structures.
float ftrV[3]
trial value of hard iron offset z, y, z (uT)
float fCountsPeruT
counts per uT
int16_t tanarray[MAGBUFFSIZEX - 1]
array of tangents of (100 * angle)
#define MAGBUFFSIZEY
y dimension in magnetometer buffer (12x24 equals 288 elements)
float fYTY
Y^T.Y for 4 element calibration = (iB^2)^2.
float ftrinvW[3][3]
trial inverse soft iron matrix size
float ftrFitErrorpc
trial value of fit error %
float fV[3]
current hard iron offset x, y, z, (uT)
int16_t iBs[3]
averaged uncalibrated measurement (counts)
int16_t iBs[3][MAGBUFFSIZEX][MAGBUFFSIZEY]
uncalibrated magnetometer readings
void fRunMagCalibration(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag, int32 loopcounter)
#define DEFAULTB
default geomagnetic field (uT)
#define MAXBFITUT
maximum acceptable geomagnetic field B (uT) for valid calibration
int32_t iMeanBs[3]
average magnetic measurement (counts)
float ftrB
trial value of geomagnetic field magnitude in uT
The sensor_fusion.h file implements the top level programming interface.
Magnetic Calibration Structure.
void fComputeMagCalibration7(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
float fA[3][3]
ellipsoid matrix A
int8_t iInitiateMagCal
flag to start a new magnetic calibration
void f3x3matrixAeqI(float A[][3])
function sets the 3x3 matrix A to the identity matrix
int32_t iSumBs[3]
sum of measurements in buffer (counts)
#define MAXMEASUREMENTS
maximum number of measurements used for calibration
void fUpdateMagCalibration7Slice(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
void fInitializeMagCalibration(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer)
#define FUSION_HZ
(int) actual rate of fusion algorithm execution and sensor FIFO reads
float fuTPerCount
uT per count
#define MINMEASUREMENTS10CAL
minimum number of measurements for 10 element calibration
int8_t iNewCalibrationAvailable
flag denoting that a new calibration has been computed
int8_t i4ElementSolverTried
flag to denote at least one attempt made with 4 element calibration
void fComputeMagCalibration10(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
#define MINMEASUREMENTS7CAL
minimum number of measurements for 7 element calibration
#define MINBFITUT
minimum acceptable geomagnetic field B (uT) for valid calibration
int32_t itimeslice
counter for tine slicing magnetic calibration calculations
#define CHX
Used to access X-channel entries in various data data structures.
float fBs[3]
averaged un-calibrated measurement (uT)
int8_t i7ElementSolverTried
flag to denote at least one attempt made with 4 element calibration
void fUpdateMagCalibration4Slice(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
float f3x3matrixDetA(float A[][3])
function calculates the determinant of a 3x3 matrix
int8_t iMagBufferReadOnly
flag to denote that the magnetic measurement buffer is temporarily read only
float fB
current geomagnetic field magnitude (uT)
float fmatB[10][10]
scratch 10x10 float matrix used by calibration algorithms
int16_t iBc[3]
averaged calibrated measurement (counts)
void fUpdateMagCalibration10Slice(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
float fvecB[4]
scratch 4x1 vector used by calibration algorithms
float finvA[3][3]
inverse of ellipsoid matrix A
int8_t iCalInProgress
flag denoting that a calibration is in progress
void fInvertMagCal(struct MagSensor *pthisMag, struct MagCalibration *pthisMagCal)
float fBSq
square of fB (uT^2)
void f3x3matrixAeqInvSymB(float A[][3], float B[][3])
#define FITERRORAGINGSECS
24 hours: time (s) for fit error to increase (age) by e=2.718