
11.1 UAV 控制/遥测链路特征分析
无人机(UAV)系统的可靠运行依赖于指挥与控制(C2)链路及遥测/图传数据链路。从信号情报(SIGINT)角度,对这些链路的特征进行深入分析是实现检测、分类和反制(C-UAS)的基石。
11.1.1 频谱与调制原理
UAV 链路为实现抗干扰(AJ)和低截获概率(LPI),广泛采用扩频技术。
1. 直接序列扩频 (DSSS)



11.1.2 时域与协议特征(循环平稳性)

11.2 标准化测试场景与数据集构建
鲁棒的 AI 模型依赖于反映真实物理退化的数据集。
11.2.1 空-地信道(A2G)的数学模型



11.2.2 代码实现:信道模拟与数据增强
在数据集中,我们必须通过数据增强来模拟上述物理效应,以防止模型过拟合到“干净”的 LoS 场景。
import numpy as np
import scipy.signal as signal
from scipy.stats import rayleigh, rician
def apply_rician_fading(iq_signal: np.ndarray, K_db: float) -> np.ndarray:
"""
对I/Q信号施加莱斯衰落 (A2G 信道)
Args:
iq_signal (np.ndarray): 纯净I/Q信号
K_db (float): 莱斯K因子 (dB). K=Inf 为纯AWGN, K=-Inf (0) 为瑞利.
"""
if K_db > 50: # 近似为纯LoS, 无衰落
return iq_signal
K_linear = 10**(K_db / 10.0)
# 莱斯分布参数推导:
# K = v^2 / (2 * sigma^2)
# 假设总功率 E[A^2] = v^2 + 2*sigma^2 = 1 (归一化)
# v^2 = K / (K + 1)
# 2*sigma^2 = 1 / (K + 1)
v = np.sqrt(K_linear / (K_linear + 1))
sigma = np.sqrt(1 / (2 * (K_linear + 1)))
# 生成莱斯分布的随机幅值 A
# (更简单的实现是生成LoS分量 + 复高斯NLoS分量)
# LoS 分量 (固定幅值 v, 随机相位)
los_phase = np.exp(1j * np.random.uniform(0, 2*np.pi))
los_component = v * los_phase
# NLoS (瑞利) 分量
# (sigma 是复高斯随机变量的标准差)
nlos_real = np.random.normal(0, sigma, len(iq_signal))
nlos_imag = np.random.normal(0, sigma, len(iq_signal))
nlos_component = nlos_real + 1j * nlos_imag
# 总的信道增益 h (时变)
# (假设 T_c >> len(iq_signal), 视为慢衰落, h 为常数)
# (为模拟快衰落, h 应通过一个多普勒滤波器)
# 这里我们简化为慢衰落, 整个片段使用一个 h
h = los_component + (nlos_real[0] + 1j*nlos_imag[0])
return iq_signal * h
def apply_channel_effects(iq_signal: np.ndarray, fs: float,
snr_db: float, K_factor_db: float,
doppler_freq: float) -> np.ndarray:
"""
实战化的数据增强管线
Args:
iq_signal (np.ndarray): 纯净的复数基带I/Q信号
fs (float): 采样率 (Hz)
snr_db (float): 期望的信噪比 (dB)
K_factor_db (float): 莱斯K因子 (dB)
doppler_freq (float): 最大多普勒频移 (Hz)
Returns:
np.ndarray: 退化后的I/Q信号
"""
# 1. 应用莱斯衰落 (模拟 A2G LoS + NLoS)
signal_faded = apply_rician_fading(iq_signal, K_factor_db)
# 2. 应用多普勒频移 (模拟运动)
t = np.arange(len(signal_faded)) / fs
doppler_shift = np.exp(1j * 2 * np.pi * doppler_freq * t)
signal_doppler = signal_faded * doppler_shift
# 3. 应用加性高斯白噪声 (AWGN)
signal_power_linear = np.mean(np.abs(signal_doppler)**2)
noise_power_linear = signal_power_linear / (10**(snr_db / 10.0))
noise = (np.random.normal(0, 1, len(signal_doppler)) +
1j * np.random.normal(0, 1, len(signal_doppler))) * \
np.sqrt(noise_power_linear / 2.0)
return signal_doppler + noise
11.3 系统案例:被动检测 + ML 分类 + 定位融合
![]()
11.3.1 阶段一:检测(能量检测 vs 循环平稳)


11.3.2 阶段二:ML 分类(Spectrogram + CNN)

2. 代码实现:(Keras/TensorFlow)
import tensorflow as k
from tensorflow.keras import layers, models
def create_spectrogram_cnn(input_shape=(128, 128, 1), num_classes=5):
"""
构建一个用于UAV信号分类的 2D CNN (深度和鲁棒性增强)
Args:
input_shape (tuple): 频谱图的形状 (height, width, channels)
num_classes (int): 类别数 (例如: 0=Noise, 1=FHSS, 2=DSSS, 3=WiFi-OFDM, 4=DJI)
"""
model = models.Sequential(name="UAV_Signal_Classifier")
# 输入层: 128x128 频谱图, 1个通道 (灰度)
model.add(layers.Input(shape=input_shape))
# 卷积块 1
model.add(layers.Conv2D(32, (3, 3), padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation('relu'))
model.add(layers.MaxPooling2D((2, 2)))
# 卷积块 2
model.add(layers.Conv2D(64, (3, 3), padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation('relu'))
model.add(layers.MaxPooling2D((2, 2)))
# 卷积块 3
model.add(layers.Conv2D(128, (3, 3), padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation('relu'))
model.add(layers.MaxPooling2D((2, 2)))
# 展平层
model.add(layers.Flatten())
# 全连接层
model.add(layers.Dense(256))
model.add(layers.BatchNormalization())
model.add(layers.Activation('relu'))
model.add(layers.Dropout(0.5))
# 输出层
model.add(layers.Dense(num_classes, activation='softmax'))
# 编译模型
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.summary()
return model
# --- 训练流程 (示意) ---
# 1. (外部) 准备 (X_train_spectrograms, y_train_labels)
# 2. (外部) 准备 (X_val_spectrograms, y_val_labels)
# 3. model = create_spectrogram_cnn(input_shape, num_classes)
# 4. history = model.fit(X_train_spectrograms, y_train_labels,
# epochs=50,
# validation_data=(X_val_spectrograms, y_val_labels),
# batch_size=32)
11.3.3 阶段三:定位融合(MUSIC 算法)



2. 代码实现:(Numpy)
import numpy as np
def music_aoa_estimator(X_data: np.ndarray, M: int, D_sources: int,
d_spacing: float, f_c: float,
search_angles: np.ndarray) -> np.ndarray:
"""
实现基础MUSIC算法以估计AoA
(注:未包含空间平滑,适用于非相干源)
Args:
X_data (np.ndarray): 接收的I/Q数据 (M x N_samples)
M (int): 阵元数
D_sources (int): 信号源数量 (假设已知, e.g., from ML)
d_spacing (float): 阵元间距 (米)
f_c (float): 载波频率 (Hz)
search_angles (np.ndarray): 要搜索的角度 (度)
Returns:
np.ndarray: MUSIC 伪谱 (dB)
"""
# 0. 计算波长
lambda_c = 3e8 / f_c
# 1. 估计协方差矩阵 R
N_samples = X_data.shape[1]
if N_samples < M:
raise ValueError("N_samples 必须大于 M 才能使 R 满秩")
R = (X_data @ X_data.conj().T) / N_samples
# 2. 特征值分解
# W: 特征值 (升序)
# V: 特征向量 (列向量)
W, V = np.linalg.eigh(R)
# 3. 划分噪声子空间 E_N
# eigh() 返回升序特征值, 所以噪声子空间是前 M-D 列
E_N = V[:, 0:(M - D_sources)]
# 4. 搜索伪谱
music_spectrum_db = []
for theta_deg in search_angles:
theta_rad = np.deg2rad(theta_deg)
# 4a. 计算转向矢量 a(theta)
a_theta = np.zeros((M, 1), dtype=np.complex128)
# 向量化实现 m = [0, 1, ..., M-1]
m_vec = np.arange(0, M).reshape(M, 1)
exponent = -1j * 2 * np.pi * m_vec * (d_spacing / lambda_c) * np.sin(theta_rad)
a_theta = np.exp(exponent)
# 4b. 计算分母 P = a^H * E_N * E_N^H * a
# E_N^H * a
proj = a_theta.conj().T @ E_N
denominator = proj @ proj.conj().T
P_music = 1.0 / np.abs(denominator)
music_spectrum_db.append(10 * np.log10(P_music[0, 0]))
return np.array(music_spectrum_db)
11.4 部署挑战与缓解策略
将上述系统从实验室推向实战部署,会遇到两大技术挑战。
1. 城市环境(RF Clutter)与多径

2. 多源干扰(Co-Channel Interference

35

被折叠的 条评论
为什么被折叠?



