service_20250421161905.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import json
  2. import uhd
  3. import numpy as np
  4. import threading
  5. from dto.response_dto import ResponseDTO
  6. from model.surveillance_radar import SurveillanceRadar
  7. from model.jammer_radar import JammerRadar
  8. from algo.jamming_signal_algo import JammingSignalAlgo
  9. from algo.anti_jamming_signal_algo import AntiJammingSignalAlgo
  10. # 定义一组通道常量
  11. CHANNEL_1 = 0
  12. CHANNEL_2 = 1
  13. CHANNEL_3 = 2
  14. CHANNEL_4 = 3
  15. # 定义干扰、抗干扰策略集合,确保集合中的元素为合法的字符串常量
  16. JAMMING_POLICY = {
  17. "噪声调频", "噪声调幅", "噪声直放", "速度多假目标", "距离多假目标"
  18. }
  19. ANTI_JAMMING_POLICY = {
  20. "频率捷变", "波形捷变",
  21. "自适应极化滤波"
  22. }
  23. class Service:
  24. usrp = None # 静态类变量
  25. status = 0 # 静态类变量
  26. surveillance_radar = None # 侦查雷达实例
  27. jammer_radar = None # 干扰雷达实例
  28. _rlock = threading.RLock() # 可重入锁
  29. @staticmethod
  30. def initialize_usrp():
  31. with Service._rlock:
  32. Service.get_sdr_status()
  33. if Service.status == 1:
  34. print('USRP设备已经初始化')
  35. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  36. try:
  37. Service.usrp = uhd.usrp.MultiUSRP()
  38. print('------SDR Devices initialize success!------')
  39. Service.surveillance_radar = SurveillanceRadar(Service.usrp, rx=CHANNEL_1, tx=CHANNEL_1)
  40. Service.jammer_radar = JammerRadar(Service.usrp, rx=CHANNEL_2, tx=CHANNEL_2)
  41. Service.status = 1
  42. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  43. except Exception as e:
  44. print('SDR设备异常', e)
  45. Service.status = 0 # 初始化失败,状态置为0
  46. return ResponseDTO.ERROR_MS_DATA('SDR设备异常', {"status": Service.status, "Error": str(e)}).to_json()
  47. @staticmethod
  48. def get_sdr_status():
  49. with Service._rlock:
  50. if Service.status == 0:
  51. return ResponseDTO.ERROR_MS_DATA('SDR设备异常',{"status": Service.status, "Error": "SDR设备未初始化"}).to_json()
  52. try:
  53. samples = Service.usrp.recv_num_samps(1, 100e6, 1e6, [0], 50)
  54. if samples is None:
  55. Service.status = 0 # 获取状态失败,状态置为0
  56. else:
  57. Service.status = 1
  58. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  59. except Exception as e:
  60. print('SDR设备异常', e)
  61. Service.status = 0 # 获取状态失败,状态置为0
  62. Service.usrp = None # 重置USRP对象
  63. return ResponseDTO.ERROR_MS_DATA('SDR设备异常', {"status": Service.status, "Error": str(e)}).to_json()
  64. @staticmethod
  65. def data(payload):
  66. # 使用已初始化的雷达实例
  67. surveillance_radar = Service.surveillance_radar
  68. jammer_radar = Service.jammer_radar
  69. jamming_policy = payload.get('jamming_policy')
  70. anti_jamming_policy = payload.get('anti_jamming_policy')
  71. # 判断策略是否合法
  72. if jamming_policy not in JAMMING_POLICY or anti_jamming_policy not in ANTI_JAMMING_POLICY:
  73. return ResponseDTO.ERROR_MS_DATA('策略不合法', {"status": Service.status, "Error": "策略不合法"}).to_json()
  74. # 打印对应策略
  75. print(' jamming_policy:', jamming_policy)
  76. print(' anti_jamming_policy:', anti_jamming_policy)
  77. # 根据策略选择算法
  78. jam_algorithm = Service._get_algorithm_mapping(jamming_policy)
  79. anti_jam_algorithm = Service._get_algorithm_mapping(anti_jamming_policy)
  80. # 1. 侦查雷达发送原始信号
  81. tx_signal = surveillance_radar.send_signal(
  82. tx_signal=np.random.randn(100),
  83. duration=0.1,
  84. center_freq=100e6,
  85. sample_rate=1e6,
  86. gain=20
  87. )
  88. # 2. 干扰雷达接收信号并生成干扰
  89. jammed_signal = jammer_radar.execute_jamming(
  90. rx_signal=tx_signal,
  91. algorithm=jam_algorithm,
  92. bandwidth=100e6,
  93. sample_rate=1e6
  94. ) if jam_algorithm else tx_signal
  95. # 3. 分阶段应用抗干扰算法
  96. # 发射端抗干扰(波形捷变等)
  97. tx_processed = surveillance_radar.execute_anti_jamming(
  98. rx_signal=tx_signal,
  99. algorithm=Service._get_tx_algorithm(anti_jamming_policy),
  100. sample_rate=1e6
  101. )
  102. # 接收端抗干扰(频率捷变等)
  103. processed_signal = surveillance_radar.execute_anti_jamming(
  104. rx_signal=jammed_signal,
  105. algorithm=anti_jam_algorithm,
  106. sample_rate=1e6
  107. ) if anti_jam_algorithm else jammed_signal
  108. # 类型检查并转换复数信号为实数
  109. if np.iscomplexobj(processed_signal):
  110. processed_signal = np.real(processed_signal)
  111. # 返回结果
  112. return ResponseDTO.SUCCESS({"jamming_signal": np.real(surveillance_signal).tolist(),
  113. "anti_jamming_signal": np.real(processed_signal).tolist(),
  114. "status": Service.status}).to_json()
  115. @staticmethod
  116. def send():
  117. try:
  118. # 设置中心频率、采样率和增益
  119. center_freq = 100e6 # 2.4 GHz
  120. sample_rate = 1e6 # 1 MS/s
  121. duration = 10 # 以秒为单位
  122. gain = 20 # [dB] 建议一开始设置小一点,按照实际情况调整
  123. # 生成发送信号
  124. num_samples = 100
  125. tx_signal = np.random.randn(num_samples) + 0.1j * np.random.randn(num_samples) # 修复部分
  126. # 发送信号
  127. Service.usrp.send_waveform(tx_signal, duration, center_freq, sample_rate, [0], gain)
  128. # 接收信号
  129. rx_signal = Service.usrp.recv_num_samps(num_samples, center_freq, sample_rate)
  130. print('信号已发送:')
  131. print(rx_signal)
  132. print('信号已接收')
  133. except Exception as e:
  134. print('发送或接收信号异常', e)
  135. Service.status = 0 # 发送或接收信号失败,状态置为0
  136. Service.usrp = None # 重置USRP对象
  137. @staticmethod
  138. def _get_algorithm_mapping(policy: str) -> callable:
  139. # 接收端抗干扰算法映射
  140. rx_algorithm_map = {
  141. "自适应极化滤波": AntiJammingSignalAlgo.polarization_filter
  142. }
  143. return rx_algorithm_map.get(policy)
  144. @staticmethod
  145. def _get_tx_algorithm(policy: str) -> callable:
  146. # 发射端抗干扰算法映射
  147. tx_algorithm_map = {
  148. "波形捷变": AntiJammingSignalAlgo.adaptive_filter,
  149. "频率捷变": AntiJammingSignalAlgo.time_frequency_filter
  150. }
  151. return tx_algorithm_map.get(policy)
  152. # main方法
  153. if __name__ == '__main__':
  154. Service.initialize_usrp()
  155. Service.data({"jamming_policy": "噪声调频", "anti_jamming_policy": "频率捷变"})