surveillance_radar.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. try:
  65. metadata = uhd.types.TXMetadata()
  66. metadata.start_of_burst = True
  67. metadata.end_of_burst = False
  68. metadata.has_time_spec = False
  69. print("发送线程已启动")
  70. while not self.stop_event.is_set():
  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. # 将100个信号依次队列
  80. #如果队列已满,则去对头元素
  81. if self.tx_buffer.full():
  82. self.tx_buffer.get()
  83. self.tx_buffer.put(samples.copy())
  84. # 控制发送频率
  85. time.sleep(0.05)
  86. except Exception as e:
  87. # self.stop_event.set()
  88. # metadata.end_of_burst = True
  89. # self.tx_stream.send(np.zeros((1,), dtype=np.complex64), metadata)
  90. # raise Exception(f"发送线程出错: {e}")
  91. print(f"发送线程出错: {e}")
  92. def rx_worker(self):
  93. # 启动接收流
  94. stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.start_cont)
  95. stream_cmd.stream_now = True
  96. self.rx_stream.issue_stream_cmd(stream_cmd)
  97. metadata = uhd.types.RXMetadata()
  98. buff = np.zeros((self.samps_per_packet,), dtype=np.complex64)
  99. while not self.stop_event.is_set():
  100. try:
  101. num_rx = self.rx_stream.recv(buff, metadata,timeout=10)
  102. if metadata.error_code != uhd.types.RXMetadataErrorCode.none:
  103. print(f"接收错误: {metadata.error_code}")
  104. continue
  105. # 将100个信号依次队列
  106. if num_rx > 0:
  107. #如果队列已满,则去对头元素
  108. if self.rx_buffer.full():
  109. self.rx_buffer.get()
  110. self.rx_buffer.put(buff.copy()[:num_rx])
  111. except Exception as e:
  112. # stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.stop_cont)
  113. # self.usrp.issue_stream_cmd(stream_cmd)
  114. # raise Exception(f"接收线程出错: {e}")
  115. print(f"接收线程出错: {e}")
  116. def process_transmit_signal(self, tx_signal: np.ndarray, algorithm: callable, sample_rate: float) -> np.ndarray:
  117. """
  118. 发射端信号处理
  119. :param tx_signal: 发射信号
  120. :param algorithm: 发射端抗干扰算法
  121. :param sample_rate: 采样率
  122. """
  123. #如果为频率捷变算法
  124. if algorithm == AntiJammingSignalAlgo.frequency_agility:
  125. hop_sequence = [(10e6, 0.001), (20e6, 0.001)] # 跳频序列,频率点和驻留时间
  126. process_signal = algorithm(tx_signal=tx_signal, sample_rate=sample_rate, hop_sequence=hop_sequence)
  127. elif algorithm == AntiJammingSignalAlgo.waveform_agility:
  128. waveform_params = {'type': 'LFM', 'bandwidth': 100e6, 'duration': 0.1} # 波形参数
  129. process_signal = algorithm(tx_signal=tx_signal, sample_rate=sample_rate, waveform_params=waveform_params)
  130. else:
  131. process_signal = tx_signal
  132. # print("processed_signal:", processed_signal)
  133. return process_signal.astype(np.complex64)
  134. def apply_anti_jamming_processing(self, rx_signal: np.ndarray, algorithm: callable, sample_rate: float, **kwargs) -> np.ndarray:
  135. """
  136. 应用抗干扰信号处理
  137. :param rx_signal: 接收信号
  138. :param algorithm: 接收端抗干扰算法
  139. :param sample_rate: 采样率
  140. """
  141. # 极化参数配置
  142. polar_params = {
  143. 'angle': 45, # 极化角(单位:度)
  144. 'ellipticity': 0.8 # 椭圆率(0~1之间)
  145. }
  146. if algorithm == AntiJammingSignalAlgo.polarization_filter:
  147. process_signal = algorithm(rx_signal=rx_signal, sample_rate=sample_rate, polarization_params=polar_params)
  148. else:
  149. process_signal = rx_signal
  150. return process_signal.astype(np.complex64)
  151. def anti_jamming_worker(self):
  152. # try:
  153. while not self.stop_event.is_set():
  154. if not self.rx_buffer.qsize() > 150:
  155. list = np.array([])
  156. for i in range(100):
  157. buff = self.rx_buffer.get()
  158. combined_signal = buff
  159. # processed_signal = self.apply_anti_jamming_processing(
  160. # combined_signal,
  161. # self.anti_jamming_algorithm,
  162. # self.SAMPLING_RATE
  163. # )
  164. # 计算接收信号的强度 (RMS)
  165. signal_rms = np.sqrt(np.mean(np.abs(buff) ** 2))
  166. print(f"\r接收信号强度: {signal_rms:.3f}")
  167. list = np.append(list,signal_rms)
  168. print("list:",list.tolist())
  169. self.processed_signal = list
  170. time.sleep(0.05)
  171. # except Exception as e:
  172. # self.stop_event.set()
  173. # raise Exception(f"信号处理线程出错: {e}")
  174. def run(self):
  175. """启动雷达"""
  176. print("雷达启动")
  177. tx_thread = Thread(target=self.tx_worker)
  178. rx_thread = Thread(target=self.rx_worker)
  179. tx_thread.start()
  180. rx_thread.start()
  181. self.processing_thread = threading.Thread(target=self.anti_jamming_worker)
  182. self.processing_thread.start()
  183. print("雷达运行完毕")
  184. def inject(self,anti_jam_algorithm,jammed_signal):
  185. self.jammed_signal = jammed_signal
  186. self.anti_jamming_algorithm = anti_jam_algorithm