lct_toa.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // 秒寻科技
  2. // TOA模块
  3. // zt
  4. // 2023-02-24
  5. #include "../../includes/includes.h"
  6. #include "./lct_public.h"
  7. // 根据距离计算所有基站的第一径偏移量
  8. // byFirstPathFlag:第一径类型,计算径或者跟踪径
  9. // pstFirstPathList:第一径队列
  10. // pstMeanLctCoordList:平滑定位坐标队列
  11. // dwAheadOffset:基站上一次偏移量
  12. // pdwBtsFirstPahtOffset:基站第一径偏移量
  13. void lct_toa_cal_bts_first_path_index_offset(uint8 byFirstPathFlag, LCT_FIRSTPATH_LIST_T *pstFirstPathList, LCT_COORDSEL_MEAN_COORD_T *pstMeanLctCoordList, uint32 dwAheadOffset, uint32 *pdwBtsFirstPahtOffset)
  14. {
  15. uint8 byMeanCoordNum = pstMeanLctCoordList->byListLen;
  16. COORD_T *pstAheadCoord = NULL; // 上一个定位点坐标
  17. uint8 byFirstPathNum = pstFirstPathList->byBtsNum;
  18. LCT_FIRSTPATH_T *pstFirstPathData = NULL;
  19. COORD_T stBtsCoord = {0}; // 基站坐标
  20. uint32 dwFirstPahtIndexDistance = 0; // 计算绝对距离计算的第一径索引
  21. uint32 dwOffset = 0; // 基站偏移量
  22. uint32 dwOffsetGap = 0; // 前后两次偏移量间隔
  23. uint32 dwOffsetSum = 0; // 累计偏移量
  24. uint32 dwAvarageOffset = 0; // 平均偏移量
  25. uint8 byCounter = 0;
  26. // 参数容错
  27. if (byMeanCoordNum <= 0 || byFirstPathNum <= 0)
  28. {
  29. return;
  30. }
  31. pstAheadCoord = &pstMeanLctCoordList->astCoordList[byMeanCoordNum - 1];
  32. // 遍历第一径队列,计算第一径偏移量综合
  33. for (uint8 i = 0; i < byFirstPathNum; i++)
  34. {
  35. pstFirstPathData = &pstFirstPathList->astFirstPath[i];
  36. // 基于距离计算第一径索引值
  37. stBtsCoord.dwX = pstFirstPathData->dwCoordX;
  38. stBtsCoord.dwY = pstFirstPathData->dwCoordY;
  39. stBtsCoord.dwZ = pstFirstPathData->dwCoordZ;
  40. dwFirstPahtIndexDistance = lct_toa_cal_one_bts_first_path_value(&stBtsCoord, pstAheadCoord);
  41. // 手机到基站间的距离距离有效
  42. if (byFirstPathFlag == CAL_PATH)
  43. {
  44. dwOffset = pstFirstPathData->dwCalPathIndex - dwFirstPahtIndexDistance; // 信号第一径与距离第一径之间的偏移量
  45. }
  46. else
  47. {
  48. dwOffset = pstFirstPathData->dwTrackPathIndex - dwFirstPahtIndexDistance; // 信号第一径与距离第一径之间的偏移量
  49. }
  50. // 基站上一次偏移量有效
  51. if (dwAheadOffset != 0)
  52. {
  53. dwOffsetGap = abs(dwOffset - dwAheadOffset);
  54. if (dwOffsetGap <= PUB_LCT_FP_OFFSET_VALID_THRES)
  55. {
  56. dwOffsetSum += dwOffset;
  57. byCounter++;
  58. }
  59. }
  60. else
  61. {
  62. dwOffsetSum += dwOffset;
  63. byCounter++;
  64. }
  65. }
  66. // 计算本次平均偏移量
  67. if (byCounter <= 0)
  68. {
  69. dwAvarageOffset = dwAheadOffset;
  70. }
  71. else
  72. {
  73. dwAvarageOffset = dwOffsetSum / byCounter;
  74. }
  75. // 保存偏移量
  76. if (byMeanCoordNum >= LCT_COORDSEL_MEAN_COORD_LIST_LEN)
  77. {
  78. // 移动队列
  79. if (pstMeanLctCoordList->adwFirstPathOffset[byMeanCoordNum - 1] <= 0)
  80. {
  81. pstMeanLctCoordList->adwFirstPathOffset[byMeanCoordNum - 1] = dwAvarageOffset;
  82. }
  83. else
  84. {
  85. memcpy(pstMeanLctCoordList->adwFirstPathOffset, &pstMeanLctCoordList->adwFirstPathOffset[1], sizeof(uint32) * (byMeanCoordNum - 1));
  86. pstMeanLctCoordList->adwFirstPathOffset[byMeanCoordNum - 1] = dwAvarageOffset;
  87. }
  88. }
  89. else
  90. {
  91. pstMeanLctCoordList->adwFirstPathOffset[byMeanCoordNum - 1] = dwAvarageOffset;
  92. }
  93. // 计算最终偏移量
  94. dwOffsetSum = 0;
  95. for (uint8 j = 0; j < byMeanCoordNum; j++)
  96. {
  97. dwOffsetSum += pstMeanLctCoordList->adwFirstPathOffset[j];
  98. }
  99. dwAvarageOffset = dwOffsetSum / byMeanCoordNum;
  100. *pdwBtsFirstPahtOffset = dwAvarageOffset;
  101. // printf("final offset:%d\r\n", dwAvarageOffset);
  102. return;
  103. }
  104. // 基于距离计算计算的第一径绝对值
  105. // pstBtsCoord:基站坐标
  106. // pstAheadCoord:上一个定位点坐标
  107. uint32 lct_toa_cal_one_bts_first_path_value(COORD_T *pstBtsCoord, COORD_T *pstAheadCoord)
  108. {
  109. uint32 dwFirstPathIndex = 0;
  110. flt32 fDistance = 0;
  111. uint32 dwXX = (pstBtsCoord->dwX - pstAheadCoord->dwX) * (pstBtsCoord->dwX - pstAheadCoord->dwX);
  112. uint32 dwYY = (pstBtsCoord->dwY - pstAheadCoord->dwY) * (pstBtsCoord->dwY - pstAheadCoord->dwY);
  113. uint32 dwZZ = (pstBtsCoord->dwZ - pstAheadCoord->dwZ) * (pstBtsCoord->dwZ - pstAheadCoord->dwZ);
  114. uint32 dwSum = dwXX + dwYY + dwZZ;
  115. fDistance = sqrt((flt64)dwSum) / 100;
  116. dwFirstPathIndex = (uint32)(fDistance * PUB_SIGNAL_SAMPLE_RATIO / PUB_AUDIO_SPEED);
  117. return dwFirstPathIndex;
  118. }