bts_ampl.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. // 秒寻科技
  2. // 计算各基站幅度
  3. // 2023-03-12
  4. #include "../../includes/includes.h"
  5. // 导出全局变量定义
  6. extern flt32 gg_afOneFrameLocationData[PUB_SLOT_FRAME_LEN];
  7. // 计算频点幅度主控函数,负责输出基站幅度镜像数据队列和基站最强幅度数据队列
  8. // pstLocationDataList:定位数据队列
  9. // pstBtsAmplMirrorDataList:基站幅度镜像数据队列(返回参数)
  10. // pstAmplDataList:基站最强幅度数据队列(返回参数)
  11. void bts_ampl_main(PUB_LOCATION_DATA_T *pstLocationDataList, BTS_AMPL_MIRROR_DATA_T *pstBtsAmplMirrorDataList, BTS_MAX_AMPL_DATA_T *pstBtsMaxAmplDataList)
  12. {
  13. PUB_LOCATION_DATA_T *pstLocationData = NULL; // 一帧定位数据
  14. BTS_AMPL_MIRROR_DATA_T *pstBtsAmplMirrorData = NULL; // 一帧镜像数据
  15. BTS_MAX_AMPL_DATA_T *pstBtsMaxAmplData = NULL; // 基站最强幅度数据
  16. uint32 dwFrameNo = 0; // 当前帧号
  17. uint8 byRemainder = 0; // 取模余数
  18. uint8 bySlotIndex = 0; // 时隙索引
  19. uint32 dwStartIndex = 0;
  20. flt32 *pfOneDataHead = NULL;
  21. flt32 *pfMultiDataHead = NULL;
  22. flt32 *pfDataHead = NULL;
  23. uint32 dwTmpIndex = 0;
  24. flt32 fMaxValue = 0;
  25. uint16 wMaxValueIndex = 0;
  26. flt32 fSnr = 0;
  27. //// 遍历基站,镜像数据(包括一秒数据和多秒数据)
  28. for (uint8 i = 0; i < PUB_SYS_CARRIER_NUM; i++)
  29. {
  30. pstLocationData = &pstLocationDataList[i]; // 基站定位数据
  31. pstBtsAmplMirrorData = &pstBtsAmplMirrorDataList[i]; // 基站信号幅度镜像数据
  32. // 计算前一帧的帧号(帧号从1开始,第2帧时镜像第1帧)
  33. dwFrameNo = pstLocationData->dwFrameNo - 1;
  34. if (dwFrameNo > 0)
  35. {
  36. // 1秒缓存队列重置
  37. byRemainder = dwFrameNo % PUB_SYS_SLOT_NUM;
  38. if (byRemainder == 1)
  39. {
  40. memset(pstBtsAmplMirrorData->afOneSecondData, 0, sizeof(flt32) * PUB_SIGNAL_SAMPLE_RATIO);
  41. }
  42. // 多秒缓存队列重置
  43. byRemainder = dwFrameNo % BTS_AMPL_MIRROR_FRAMES;
  44. if (byRemainder == 1)
  45. {
  46. memset(pstBtsAmplMirrorData->afMultiSecondData, 0, sizeof(flt32) * PUB_SIGNAL_SAMPLE_RATIO);
  47. pstBtsAmplMirrorData->byAmplValidTimes = 0;
  48. }
  49. // 获取当前帧的前一帧数据
  50. util_looplist_get_flt32(pstLocationData->afData, PUB_LCT_DATA_LIST_LEN, pstLocationData->dwFourthLocationIndex, gg_afOneFrameLocationData, PUB_SLOT_FRAME_LEN, &dwTmpIndex);
  51. pfDataHead = gg_afOneFrameLocationData;
  52. // 镜像数据
  53. bySlotIndex = (pstLocationData->dwFrameNo - 2) % PUB_SYS_SLOT_NUM; // 该帧所在时隙索引
  54. dwStartIndex = bySlotIndex * PUB_SLOT_FRAME_LEN; // 开始索引
  55. pfOneDataHead = &pstBtsAmplMirrorData->afOneSecondData[dwStartIndex];
  56. pfMultiDataHead = &pstBtsAmplMirrorData->afMultiSecondData[dwStartIndex];
  57. for (uint16 j = 0; j < PUB_SLOT_FRAME_LEN; j++)
  58. {
  59. *pfOneDataHead = *pfDataHead;
  60. *pfMultiDataHead += *pfDataHead / BTS_AMPL_MIRROR_SECONDS;
  61. pfDataHead++;
  62. pfOneDataHead++;
  63. pfMultiDataHead++;
  64. }
  65. // 检查当前一秒频点的有效性
  66. if ((bySlotIndex % PUB_SYS_SLOT_NUM) == 3)
  67. {
  68. // 检查当前一秒频点的有效性
  69. bts_ampl_check_freq_valid(pstLocationData, pstBtsAmplMirrorData);
  70. }
  71. // 计算4秒镜像数据的最大值和最大值索引
  72. byRemainder = dwFrameNo % BTS_AMPL_MIRROR_FRAMES;
  73. if (byRemainder == 0)
  74. {
  75. wMaxValueIndex = util_looplist_find_max_value_index_flt32(pstBtsAmplMirrorData->afMultiSecondData, PUB_SIGNAL_SAMPLE_RATIO);
  76. fMaxValue = pstBtsAmplMirrorData->afMultiSecondData[wMaxValueIndex];
  77. // 保存最前幅度数据
  78. pstBtsMaxAmplData = &pstBtsMaxAmplDataList[i];
  79. pstBtsMaxAmplData->byFreqIndex = i;
  80. pstBtsMaxAmplData->fMaxValue = fMaxValue;
  81. pstBtsMaxAmplData->wMaxValueIndex = wMaxValueIndex;
  82. // 判断基站是否有效
  83. pstLocationData->byBtsValidFlag = 0;
  84. if (pstBtsAmplMirrorData->byAmplValidTimes > 1) // 两次有效
  85. {
  86. pstLocationData->byBtsValidFlag = 1;
  87. }
  88. }
  89. }
  90. }
  91. // 当前帧需要对基站幅度进行排序
  92. byRemainder = dwFrameNo % BTS_AMPL_MIRROR_FRAMES;
  93. if (byRemainder == 0)
  94. {
  95. // 对基站幅度进行排序,最强排在前面
  96. bts_ampl_sort_max_ampl_list(pstBtsMaxAmplDataList);
  97. }
  98. return;
  99. }
  100. // 检查当前一秒频点的有效性
  101. // pstLocationData:定位数据
  102. // pstBtsAmplMirrorData:镜像数据
  103. void bts_ampl_check_freq_valid(PUB_LOCATION_DATA_T *pstLocationData, BTS_AMPL_MIRROR_DATA_T *pstBtsAmplMirrorData)
  104. {
  105. uint16 wStartIndex = 0;
  106. uint16 wMeanStartIndex = 0; // 计算均值
  107. flt32 fTmpValue = 0; // 临时变量
  108. flt32 *pfOneSecondData = NULL;
  109. flt32 fMaxValue = FLT_MIN; // FLT_MAX在系统库中有定义,最小值
  110. uint16 wMaxValueIndex = 0;
  111. int16 wIndexOffset = 0;
  112. flt32 fMinValue = FLT_MAX; // FLT_MAX在系统库中有定义,最大值
  113. uint16 wMinValueIndex = 0;
  114. flt32 fMeanValue = 0; // 均值
  115. flt32 afDataNoiseList[1500] = {0}; // 计算噪声的队列
  116. flt32 fMiddleValue = 0; // 中位数
  117. flt32 fFrameNoise = 0; // 帧内噪声
  118. flt32 fSnr = 0;
  119. flt32 fAheadAmpl = pstLocationData->fCurrentMaxAmpl; // 前一次幅度
  120. ////1、计算1秒帧内最大值和最大值索引
  121. pfOneSecondData = pstBtsAmplMirrorData->afOneSecondData;
  122. wMaxValueIndex = util_looplist_find_max_value_index_flt32(pfOneSecondData, PUB_SIGNAL_SAMPLE_RATIO);
  123. fMaxValue = pfOneSecondData[wMaxValueIndex];
  124. pstBtsAmplMirrorData->fOneSecondMaxValue = fMaxValue;
  125. pstBtsAmplMirrorData->wOneSecondMaxValueIndex = wMaxValueIndex;
  126. ////2、在最大值索引左侧5000点内找一个最小值
  127. // 计算开始索引
  128. wIndexOffset = wMaxValueIndex - PUB_SYNC_INDEX_OFFSET_NUM;
  129. if (wIndexOffset >= 0)
  130. {
  131. wStartIndex = wIndexOffset;
  132. }
  133. else
  134. {
  135. wStartIndex = PUB_SIGNAL_SAMPLE_RATIO + wIndexOffset;
  136. }
  137. // 查找一个最小值,并镜像当前值
  138. for (uint16 j = 0; j < PUB_SYNC_INDEX_OFFSET_NUM; j++)
  139. {
  140. if (wStartIndex >= PUB_SIGNAL_SAMPLE_RATIO)
  141. {
  142. wStartIndex = 0;
  143. }
  144. fTmpValue = pstBtsAmplMirrorData->afOneSecondData[wStartIndex];
  145. if (fTmpValue < fMinValue)
  146. {
  147. fMinValue = fTmpValue;
  148. wMinValueIndex = wStartIndex;
  149. }
  150. wStartIndex++;
  151. }
  152. fMinValue *= 5; // 最小值放大5倍
  153. ////3、 计算最小值左侧1000点右侧500点的均值
  154. // 计算开始索引
  155. wIndexOffset = wMinValueIndex - 1000;
  156. if (wIndexOffset >= 0)
  157. {
  158. wStartIndex = wIndexOffset;
  159. }
  160. else
  161. {
  162. wStartIndex = PUB_SIGNAL_SAMPLE_RATIO + wIndexOffset;
  163. }
  164. // 计算均值
  165. fFrameNoise = 0;
  166. for (int16 k = 0; k < 1500; k++)
  167. {
  168. if (wStartIndex >= PUB_SIGNAL_SAMPLE_RATIO)
  169. {
  170. wStartIndex = 0;
  171. }
  172. // 计算均值
  173. fTmpValue = pstBtsAmplMirrorData->afOneSecondData[wStartIndex];
  174. fMeanValue += fTmpValue / 1500;
  175. wStartIndex++;
  176. // 保存当前值
  177. afDataNoiseList[k] = fTmpValue;
  178. }
  179. //// 计算中位数
  180. util_sort_flt32_asc(afDataNoiseList, 1500);
  181. fMiddleValue = afDataNoiseList[900]; // 6/10
  182. //// 4、计算帧内噪声
  183. fFrameNoise = fMeanValue > fMinValue ? fMeanValue : fMinValue;
  184. fFrameNoise = fFrameNoise > fMiddleValue ? fFrameNoise : fMiddleValue;
  185. fSnr = fMaxValue / fFrameNoise;
  186. ////5、检查频点有效性
  187. // 上一秒信号有效,则判断大值索引差值来检验当前信号是否有效
  188. if (pstLocationData->byCurrentAmplValidFlag)
  189. {
  190. if (fMaxValue > BTS_AMPL_BTS_AMPL_VALID_THRESHOLD && fMaxValue > (0.10 * fAheadAmpl) && fSnr > BTS_AMPL_BTS_SNR_VALID_THRESHOLD)
  191. {
  192. pstLocationData->byCurrentAmplValidFlag = 1;
  193. pstBtsAmplMirrorData->byAmplValidTimes++;
  194. }
  195. else
  196. {
  197. pstLocationData->byCurrentAmplValidFlag = 0;
  198. }
  199. }
  200. // 上一秒信号无效,则通过判断当前信号大值来检验当前信号是否有效
  201. else
  202. {
  203. // 通过幅度判断基站是否有效,信号幅度绝对值大于500
  204. if (fMaxValue > BTS_AMPL_BTS_AMPL_VALID_THRESHOLD && fSnr > BTS_AMPL_BTS_SNR_VALID_THRESHOLD)
  205. {
  206. pstLocationData->byCurrentAmplValidFlag = 1;
  207. pstBtsAmplMirrorData->byAmplValidTimes++;
  208. }
  209. else
  210. {
  211. pstLocationData->byCurrentAmplValidFlag = 0;
  212. }
  213. }
  214. // 更新上一次最大值和最大值索引
  215. pstLocationData->fCurrentMaxAmpl = fMaxValue;
  216. return;
  217. }
  218. // 对最强频点队列按照幅度大小倒排序
  219. // pstBtsMaxAmplDataList:最强幅度队列
  220. void bts_ampl_sort_max_ampl_list(BTS_MAX_AMPL_DATA_T *pstBtsMaxAmplDataList)
  221. {
  222. BTS_MAX_AMPL_DATA_T stTmp = {0};
  223. // 按照信幅度倒排序,信噪比最大的站为主站
  224. for (uint8 i = 0; i < PUB_SYS_CARRIER_NUM; i++)
  225. {
  226. for (uint8 j = (i + 1); j < PUB_SYS_CARRIER_NUM; j++)
  227. {
  228. if (pstBtsMaxAmplDataList[i].fMaxValue < pstBtsMaxAmplDataList[j].fMaxValue)
  229. {
  230. stTmp = pstBtsMaxAmplDataList[i];
  231. pstBtsMaxAmplDataList[i] = pstBtsMaxAmplDataList[j]; // 数据交换
  232. pstBtsMaxAmplDataList[j] = stTmp;
  233. }
  234. }
  235. }
  236. return;
  237. }