surveillance_radar.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. from math import e
  2. from pickletools import read_string1
  3. from socket import timeout
  4. import numpy as np
  5. import numpy as np
  6. from scipy.signal import find_peaks
  7. from algo import anti_jamming_signal_algo
  8. from algo.anti_jamming_signal_algo import AntiJammingSignalAlgo
  9. from threading import Thread, Event
  10. import queue
  11. import threading
  12. import time
  13. import uhd
  14. # ==================== 侦查雷达类 ====================
  15. class SurveillanceRadar:
  16. SAMPLING_RATE = 10e6
  17. CENTER_FREQ = 6e9
  18. GAIN = 50
  19. def __init__(self, usrp, rx_channel=0, tx_channel=0):
  20. self.usrp = usrp
  21. self.stop_event = Event()
  22. self.tx_buffer = queue.Queue(maxsize=300)
  23. self.rx_buffer = queue.Queue(maxsize=300)
  24. # 流配置参数(与demo.py保持一致)
  25. tx_stream_args = uhd.usrp.StreamArgs('fc32', 'sc16')
  26. tx_stream_args.channels = [tx_channel]
  27. self.tx_stream = self.usrp.get_tx_stream(tx_stream_args)
  28. rx_stream_args = uhd.usrp.StreamArgs('fc32','sc16')
  29. rx_stream_args.channels = [rx_channel]
  30. self.rx_stream = self.usrp.get_rx_stream(rx_stream_args)
  31. self.samps_per_packet = 500000
  32. # self.stream_timeout = 3.0
  33. # 配置设备参数(与demo.py同步)
  34. self.usrp.set_tx_rate(self.SAMPLING_RATE)
  35. self.usrp.set_tx_freq(uhd.types.TuneRequest(self.CENTER_FREQ),tx_channel)
  36. self.usrp.set_tx_gain(self.GAIN)
  37. self.usrp.set_tx_antenna("TX/RX", tx_channel)
  38. self.usrp.set_rx_rate(self.SAMPLING_RATE)
  39. self.usrp.set_rx_freq(uhd.types.TuneRequest(self.CENTER_FREQ),rx_channel)
  40. self.usrp.set_rx_gain(self.GAIN)
  41. self.usrp.set_rx_antenna("RX2", rx_channel)
  42. self.anti_jamming_algorithm = None # 存储抗干扰算法
  43. self.tx_signal = None # 存储干扰信号
  44. self.rx_signal = None # 接收到的信号
  45. self.jammed_signal = np.zeros((self.samps_per_packet,), dtype=np.complex64) # 初始化干扰信号缓冲区
  46. self.processed_signal = None # 存储处理后的信号
  47. self.tx_buffer = queue.Queue(maxsize=100)
  48. self.rx_buffer = queue.Queue(maxsize=100)
  49. self.processing_thread = None
  50. def generate_signal(self):
  51. """生成具有随机强度的测试信号"""
  52. t = np.arange(int(SurveillanceRadar.SAMPLING_RATE * 0.1)) / SurveillanceRadar.SAMPLING_RATE # 0.1秒的数据
  53. # 基础幅度为0.5,添加随机波动 (±0.3)
  54. amplitude = 0.5 + 0.3 * np.random.randn()
  55. amplitude = max(0.1, min(0.9, amplitude)) # 限制在合理范围内
  56. # 添加随机相位偏移
  57. phase = np.random.uniform(0, 2 * np.pi)
  58. # 添加随机频率偏移 (±50kHz)
  59. freq_offset = np.random.uniform(-50e3, 50e3)
  60. signal = amplitude * np.exp(2j * np.pi * (1e6 + freq_offset) * t + 1j * phase)
  61. return signal.astype(np.complex64), amplitude
  62. def tx_worker(self):
  63. """发送线程函数"""
  64. metadata = uhd.types.TXMetadata()
  65. metadata.start_of_burst = True
  66. metadata.end_of_burst = False
  67. metadata.has_time_spec = False
  68. print("发送线程已启动")
  69. while not self.stop_event.is_set():
  70. try:
  71. # 生成随机信号
  72. signal, amplitude = self.generate_signal()
  73. self.tx_signal = signal
  74. # 应用抗干扰算法
  75. samples = self.process_transmit_signal(self.tx_signal, self.anti_jamming_algorithm, self.SAMPLING_RATE)
  76. # print("samples:", samples)
  77. # 发送信号
  78. self.tx_stream.send(signal, metadata)
  79. print("数据已发送")
  80. # 将100个信号依次队列
  81. #如果队列已满,则去对头元素
  82. if self.tx_buffer.full():
  83. self.tx_buffer.get()
  84. self.tx_buffer.put(samples.copy())
  85. # 控制发送频率
  86. time.sleep(0.05)
  87. except Exception as e:
  88. # self.stop_event.set()
  89. # metadata.end_of_burst = True
  90. # self.tx_stream.send(np.zeros((1,), dtype=np.complex64), metadata)
  91. # raise Exception(f"发送线程出错: {e}")
  92. print(f"发送线程出错: {e}")
  93. def rx_worker(self):
  94. # 启动接收流
  95. stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.start_cont)
  96. stream_cmd.stream_now = True
  97. self.rx_stream.issue_stream_cmd(stream_cmd)
  98. metadata = uhd.types.RXMetadata()
  99. buff = np.zeros((self.samps_per_packet,), dtype=np.complex64)
  100. while not self.stop_event.is_set():
  101. try:
  102. num_rx = self.rx_stream.recv(buff, metadata,timeout=10)
  103. # time.sleep(0.5)
  104. if metadata.error_code != uhd.types.RXMetadataErrorCode.none:
  105. print(f"接收错误: {metadata.error_code}")
  106. continue
  107. # 将100个信号依次队列
  108. if num_rx > 0:
  109. #如果队列已满,则去对头元素
  110. if self.rx_buffer.full():
  111. self.rx_buffer.get()
  112. self.rx_buffer.put(buff.copy()[:num_rx])
  113. except Exception as e:
  114. # stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.stop_cont)
  115. # self.usrp.issue_stream_cmd(stream_cmd)
  116. # raise Exception(f"接收线程出错: {e}")
  117. print(f"接收线程出错: {e}")
  118. def process_transmit_signal(self, tx_signal: np.ndarray, algorithm: callable, sample_rate: float) -> np.ndarray:
  119. """
  120. 发射端信号处理
  121. :param tx_signal: 发射信号
  122. :param algorithm: 发射端抗干扰算法
  123. :param sample_rate: 采样率
  124. """
  125. #如果为频率捷变算法
  126. if algorithm == AntiJammingSignalAlgo.frequency_agility:
  127. hop_sequence = [(10e6, 0.001), (20e6, 0.001)] # 跳频序列,频率点和驻留时间
  128. process_signal = algorithm(tx_signal=tx_signal, sample_rate=sample_rate, hop_sequence=hop_sequence)
  129. elif algorithm == AntiJammingSignalAlgo.waveform_agility:
  130. waveform_params = {'type': 'LFM', 'bandwidth': 100e6, 'duration': 0.1} # 波形参数
  131. process_signal = algorithm(tx_signal=tx_signal, sample_rate=sample_rate, waveform_params=waveform_params)
  132. else:
  133. process_signal = tx_signal
  134. # print("processed_signal:", processed_signal)
  135. return process_signal.astype(np.complex64)
  136. def apply_anti_jamming_processing(self, rx_signal: np.ndarray, algorithm: callable, sample_rate: float, **kwargs) -> np.ndarray:
  137. """
  138. 应用抗干扰信号处理
  139. :param rx_signal: 接收信号
  140. :param algorithm: 接收端抗干扰算法
  141. :param sample_rate: 采样率
  142. """
  143. # 极化参数配置
  144. polar_params = {
  145. 'angle': 45, # 极化角(单位:度)
  146. 'ellipticity': 0.8 # 椭圆率(0~1之间)
  147. }
  148. if algorithm == AntiJammingSignalAlgo.polarization_filter:
  149. process_signal = algorithm(rx_signal=rx_signal, sample_rate=sample_rate, polarization_params=polar_params)
  150. else:
  151. process_signal = rx_signal
  152. return process_signal.astype(np.complex64)
  153. def anti_jamming_worker(self):
  154. # try:
  155. while not self.stop_event.is_set():
  156. if not self.rx_buffer.qsize() > 150:
  157. list = np.array([])
  158. for i in range(100):
  159. buff = self.rx_buffer.get()
  160. combined_signal = buff
  161. # processed_signal = self.apply_anti_jamming_processing(
  162. # combined_signal,
  163. # self.anti_jamming_algorithm,
  164. # self.SAMPLING_RATE
  165. # )
  166. # 计算接收信号的强度 (RMS)
  167. signal_rms = np.sqrt(np.mean(np.abs(buff) ** 2))
  168. print(f"\r接收信号强度: {signal_rms:.3f}")
  169. list = np.append(list,signal_rms)
  170. print("list:",list.tolist())
  171. self.processed_signal = list
  172. time.sleep(0.05)
  173. # except Exception as e:
  174. # self.stop_event.set()
  175. # raise Exception(f"信号处理线程出错: {e}")
  176. def run(self):
  177. """启动雷达"""
  178. print("雷达启动")
  179. tx_thread = Thread(target=self.tx_worker)
  180. rx_thread = Thread(target=self.rx_worker)
  181. tx_thread.start()
  182. rx_thread.start()
  183. self.processing_thread = threading.Thread(target=self.anti_jamming_worker)
  184. self.processing_thread.start()
  185. print("雷达运行完毕")
  186. def inject(self,anti_jam_algorithm,jammed_signal):
  187. self.jammed_signal = jammed_signal
  188. self.anti_jamming_algorithm = anti_jam_algorithm