surveillance_radar_20250421165346.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import numpy as np
  2. from scipy.signal import find_peaks
  3. # ==================== 侦查雷达类 ====================
  4. class SurveillanceRadar:
  5. #初始化函数,传入usrp,输入的通道,输出的通道
  6. def __init__(self, usrp, rx, tx):
  7. self.usrp = usrp
  8. self.rx = rx
  9. self.tx = tx
  10. # 封装一个发送信号的函数
  11. def send_signal(self, tx_signal, duration, center_freq, sample_rate, gain):
  12. # 发送信号并返回发射信号
  13. self.usrp.send_waveform(tx_signal, duration, center_freq, sample_rate, self.tx, gain)
  14. print('侦查雷达已发送信号')
  15. return tx_signal
  16. # 封装一个接收信号的函数
  17. def recv_signal(self, num_samples, sample_rate, center_freq):
  18. rx_signal = self.usrp.recv_num_samps(num_samples, center_freq, sample_rate, self.rx)
  19. print('侦查雷达已接收信号')
  20. return rx_signal
  21. def process_transmit_signal(self, tx_signal: np.ndarray, algorithm: callable, sample_rate: float) -> np.ndarray:
  22. """
  23. 发射端信号处理
  24. :param tx_signal: 发射信号
  25. :param algorithm: 发射端抗干扰算法
  26. :param sample_rate: 采样率
  27. """
  28. return algorithm(tx_signal=tx_signal, sample_rate=sample_rate)
  29. def apply_anti_jamming_processing(self, rx_signal: np.ndarray, algorithm: callable, sample_rate: float, **kwargs) -> np.ndarray:
  30. """
  31. 应用抗干扰信号处理
  32. :param rx_signal: 接收信号
  33. :param algorithm: 接收端抗干扰算法
  34. :param sample_rate: 采样率
  35. """
  36. processed_signal = algorithm(rx_signal=rx_signal, sample_rate=sample_rate, **kwargs)
  37. return processed_signal.astype(np.complex64)
  38. # 分析信号,获取目标距离
  39. def analyze_signal(self, rx_signal: np.ndarray, sample_rate: float,
  40. cfar_threshold: float = 20.0) -> list:
  41. """
  42. 分析接收信号并返回目标距离列表
  43. :param rx_signal: 接收信号(复数形式)
  44. :param sample_rate: 采样率(Hz)
  45. :param cfar_threshold: CFAR检测阈值(dB)
  46. :return: 目标距离列表(米)
  47. """
  48. # 1. 去斜处理(Dechirping)
  49. mixed = rx_signal * np.conj(self.tx_signal[:len(rx_signal)])
  50. # 2. 加窗处理(Hamming窗)
  51. window = np.hamming(len(mixed))
  52. windowed = mixed * window
  53. # 3. 距离FFT
  54. range_fft = np.fft.fft(windowed)
  55. spectrum_db = 20 * np.log10(np.abs(range_fft) + 1e-10) # 转换为dB
  56. # 4. 计算距离轴
  57. freq_bins = np.fft.fftfreq(len(spectrum_db), 1/sample_rate)
  58. ranges = (self.c * self.T * freq_bins) / (2 * self.B)
  59. # 5. CFAR目标检测(简化版)
  60. noise_floor = np.median(spectrum_db)
  61. peaks, _ = find_peaks(spectrum_db, height=noise_floor + cfar_threshold)
  62. # 6. 提取目标距离(取前向部分)
  63. valid_peaks = peaks[peaks <= len(ranges)//2]
  64. print(f"检测到目标距离:{[abs(ranges[p]) for p in valid_peaks]} 米")
  65. return [abs(ranges[p]) for p in valid_peaks]