surveillance_radar.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. from pickletools import read_string1
  2. import numpy as np
  3. import numpy as np
  4. from scipy.signal import find_peaks
  5. from algo import anti_jamming_signal_algo
  6. from algo.anti_jamming_signal_algo import AntiJammingSignalAlgo
  7. from threading import Thread, Event
  8. import queue
  9. import threading
  10. import time
  11. import uhd
  12. # ==================== 侦查雷达类 ====================
  13. class SurveillanceRadar:
  14. SAMPLING_RATE = 10e6
  15. CENTER_FREQ = 6e9
  16. GAIN = 50
  17. def __init__(self, usrp, rx_channel=0, tx_channel=0):
  18. self.usrp = usrp
  19. self.stop_event = Event()
  20. self.tx_buffer = queue.Queue(maxsize=10)
  21. self.rx_buffer = queue.Queue(maxsize=10)
  22. # 流配置参数(与demo.py保持一致)
  23. tx_stream_args = uhd.usrp.StreamArgs('fc32', 'sc16')
  24. tx_stream_args.channels = [tx_channel]
  25. self.tx_stream = self.usrp.get_tx_stream(tx_stream_args)
  26. rx_stream_args = uhd.usrp.StreamArgs('fc32','sc16')
  27. rx_stream_args.channels = [rx_channel]
  28. self.rx_stream = self.usrp.get_rx_stream(rx_stream_args)
  29. self.samps_per_packet = 100
  30. # self.stream_timeout = 3.0
  31. # 配置设备参数(与demo.py同步)
  32. self.usrp.set_tx_rate(self.SAMPLING_RATE)
  33. self.usrp.set_tx_freq(uhd.types.TuneRequest(self.CENTER_FREQ),tx_channel)
  34. self.usrp.set_tx_gain(self.GAIN)
  35. self.usrp.set_tx_antenna("TX/RX", tx_channel)
  36. self.usrp.set_rx_rate(self.SAMPLING_RATE)
  37. self.usrp.set_rx_freq(uhd.types.TuneRequest(self.CENTER_FREQ),rx_channel)
  38. self.usrp.set_rx_gain(self.GAIN)
  39. self.usrp.set_rx_antenna("RX2", rx_channel)
  40. self.anti_jamming_algorithm = None # 存储抗干扰算法
  41. self.tx_signal = None # 存储干扰信号
  42. self.rx_signal = None # 接收到的信号
  43. self.jammed_signal = np.zeros((self.samps_per_packet,), dtype=np.complex64) # 初始化干扰信号缓冲区
  44. self.processed_signal = None # 存储处理后的信号
  45. self.tx_buffer = queue.Queue(maxsize=100)
  46. self.rx_buffer = queue.Queue(maxsize=100)
  47. self.processing_thread = None
  48. def tx_worker(self):
  49. """发送线程函数"""
  50. try:
  51. metadata = uhd.types.TXMetadata()
  52. metadata.start_of_burst = True
  53. metadata.end_of_burst = False
  54. metadata.has_time_spec = False
  55. print("发送线程已启动")
  56. while not self.stop_event.is_set():
  57. # 生成随机信号
  58. self.tx_signal = np.random.randn(100)
  59. # 应用抗干扰算法
  60. samples = self.process_transmit_signal(self.tx_signal, self.anti_jamming_algorithm, self.SAMPLING_RATE)
  61. # print("samples:", samples)
  62. # 发送信号
  63. self.tx_stream.send(samples, metadata)
  64. # 将100个信号依次队列
  65. #如果队列已满,则去对头元素
  66. if self.tx_buffer.full():
  67. self.tx_buffer.get()
  68. self.tx_buffer.put(samples.copy())
  69. # 控制发送频率
  70. time.sleep(0.05)
  71. except Exception as e:
  72. self.stop_event.set()
  73. metadata.end_of_burst = True
  74. self.tx_stream.send(np.zeros((1,), dtype=np.complex64), metadata)
  75. raise Exception(f"发送线程出错: {e}")
  76. def rx_worker(self):
  77. # try:
  78. # 启动接收流
  79. stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.start_cont)
  80. stream_cmd.stream_now = True
  81. self.rx_stream.issue_stream_cmd(stream_cmd)
  82. metadata = uhd.types.RXMetadata()
  83. buff = np.zeros((self.samps_per_packet,), dtype=np.complex64)
  84. while not self.stop_event.is_set():
  85. num_rx = self.rx_stream.recv(buff, metadata)
  86. if metadata.error_code != uhd.types.RXMetadataErrorCode.none:
  87. print(f"接收错误: {metadata.error_code}")
  88. continue
  89. # 将100个信号依次队列
  90. if num_rx > 0:
  91. #如果队列已满,则去对头元素
  92. if self.rx_buffer.full():
  93. self.rx_buffer.get()
  94. self.rx_buffer.put(buff.copy())
  95. # except Exception as e:
  96. # stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.stop_cont)
  97. # self.usrp.issue_stream_cmd(stream_cmd)
  98. # raise Exception(f"接收线程出错: {e}")
  99. def process_transmit_signal(self, tx_signal: np.ndarray, algorithm: callable, sample_rate: float) -> np.ndarray:
  100. """
  101. 发射端信号处理
  102. :param tx_signal: 发射信号
  103. :param algorithm: 发射端抗干扰算法
  104. :param sample_rate: 采样率
  105. """
  106. #如果为频率捷变算法
  107. if algorithm == AntiJammingSignalAlgo.frequency_agility:
  108. hop_sequence = [(10e6, 0.001), (20e6, 0.001)] # 跳频序列,频率点和驻留时间
  109. process_signal = algorithm(tx_signal=tx_signal, sample_rate=sample_rate, hop_sequence=hop_sequence)
  110. elif algorithm == AntiJammingSignalAlgo.waveform_agility:
  111. waveform_params = {'type': 'LFM', 'bandwidth': 100e6, 'duration': 0.1} # 波形参数
  112. process_signal = algorithm(tx_signal=tx_signal, sample_rate=sample_rate, waveform_params=waveform_params)
  113. else:
  114. process_signal = tx_signal
  115. # print("processed_signal:", processed_signal)
  116. return process_signal.astype(np.complex64)
  117. def apply_anti_jamming_processing(self, rx_signal: np.ndarray, algorithm: callable, sample_rate: float, **kwargs) -> np.ndarray:
  118. """
  119. 应用抗干扰信号处理
  120. :param rx_signal: 接收信号
  121. :param algorithm: 接收端抗干扰算法
  122. :param sample_rate: 采样率
  123. """
  124. if algorithm == AntiJammingSignalAlgo.polarization_filter:
  125. process_signal = algorithm(rx_signal=rx_signal, sample_rate=sample_rate, **kwargs)
  126. else:
  127. process_signal = rx_signal
  128. return process_signal.astype(np.complex64)
  129. def anti_jamming_worker(self):
  130. while not self.stop_event.is_set():
  131. if not self.rx_buffer.empty():
  132. rx_signal = self.rx_buffer.get()
  133. combined_signal = rx_signal + self.jammed_signal
  134. # print("原始信号:", rx_signal)
  135. # print("干扰信号:", self.jammed_signal)
  136. # print("合成信号:", combined_signal)
  137. self.processed_signal = self.apply_anti_jamming_processing(
  138. combined_signal,
  139. self.anti_jamming_algorithm,
  140. self.SAMPLING_RATE
  141. )
  142. # print("处理后的信号:", self.processed_signal)
  143. def run(self):
  144. """启动雷达"""
  145. print("雷达启动")
  146. tx_thread = Thread(target=self.tx_worker)
  147. rx_thread = Thread(target=self.rx_worker)
  148. tx_thread.start()
  149. rx_thread.start()
  150. self.processing_thread = threading.Thread(target=self.anti_jamming_worker)
  151. self.processing_thread.start()
  152. print("雷达运行完毕")
  153. def inject(self,anti_jam_algorithm,jammed_signal):
  154. self.jammed_signal = jammed_signal
  155. self.anti_jamming_algorithm = anti_jam_algorithm