anti_jamming_signal_algo.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import numpy as np
  2. from scipy import signal, fft, linalg
  3. from typing import Tuple, List
  4. class AntiJammingSignalAlgo:
  5. @staticmethod
  6. def polarization_filter(rx_signal, sample_rate, polarization_params):
  7. """极化滤波算法"""
  8. # 应用极化参数
  9. angle_rad = np.deg2rad(polarization_params['angle'])
  10. ellipticity = polarization_params['ellipticity']
  11. # 构建极化滤波矩阵
  12. filter_matrix = np.array([
  13. [np.cos(angle_rad), -ellipticity * np.sin(angle_rad)],
  14. [np.sin(angle_rad), ellipticity * np.cos(angle_rad)]
  15. ])
  16. # 应用极化滤波
  17. polarized_signal = filter_matrix @ rx_signal.reshape(2, -1)
  18. return polarized_signal[0].real
  19. @staticmethod
  20. def frequency_agility(tx_signal, sample_rate, hop_sequence):
  21. """频率捷变算法
  22. Args:
  23. tx_signal: 原始发射信号
  24. sample_rate: 采样率
  25. hop_sequence: 跳频序列 (包含频率点和驻留时间)
  26. """
  27. processed_signal = np.zeros_like(tx_signal)
  28. t = 0
  29. for freq, dwell in hop_sequence:
  30. n_samples = 100
  31. freq_shift = np.exp(1j*2*np.pi*freq/sample_rate*np.arange(n_samples))
  32. segment = tx_signal[t:t+n_samples] * freq_shift
  33. processed_signal[t:t+n_samples] = segment
  34. t += n_samples
  35. if t >= len(tx_signal):
  36. break
  37. return processed_signal
  38. @staticmethod
  39. def waveform_agility(tx_signal, sample_rate, waveform_params):
  40. """波形捷变算法
  41. Args:
  42. tx_signal: 原始发射信号
  43. sample_rate: 采样率
  44. waveform_params: 波形参数 {
  45. 'type': 'LFM'/'NLFM'/'PhaseCode',
  46. 'bandwidth': 带宽(Hz),
  47. 'duration': 持续时间(s)
  48. }
  49. """
  50. t = np.linspace(0, waveform_params['duration'], int(sample_rate * waveform_params['duration']))
  51. if waveform_params['type'] == 'LFM':
  52. waveform = signal.chirp(t, f0=0, f1=waveform_params['bandwidth'], t1=waveform_params['duration'])
  53. elif waveform_params['type'] == 'NLFM':
  54. # 非线性调频波形
  55. beta = 2.5
  56. waveform = np.cos(2*np.pi* waveform_params['bandwidth'] * (t + beta*t**3))
  57. elif waveform_params['type'] == 'PhaseCode':
  58. # 相位编码波形
  59. code_length = 13
  60. phase_code = np.exp(1j*np.pi*np.random.randint(0,2,code_length))
  61. waveform = np.kron(phase_code, np.ones(int(sample_rate*waveform_params['duration']/code_length)))
  62. else:
  63. raise ValueError("不支持的波形类型")
  64. return tx_signal * waveform[:len(tx_signal)]