4. 广义旁瓣对消器(GSC)
任务说明
本案例实现广义旁瓣对消器(GSC),将自适应波束形成分解为固定波束形成器、阻塞矩阵和自适应噪声对消器三个模块。给定均匀线阵接收信号(含期望信号、干扰和噪声),GSC在保持期望方向响应恒定的同时,自适应抑制干扰。通过对比GSC输出与固定波束形成输出的信干噪比(SINR),验证干扰抑制效果。
GSC结构原理
GSC将阵列信号处理分解为三条支路:上支路为固定波束形成器(FBF),对期望方向形成恒定响应;中间支路为阻塞矩阵(BM),将期望信号阻塞,仅让干扰和噪声通过;下支路为自适应滤波器,对阻塞后的信号进行加权,使其输出与上支路中的干扰分量相抵消。最终输出为固定波束输出减去自适应对消输出,从而在无失真保留期望信号的前提下抑制干扰。
代码实现
以下Python代码实现GSC核心算法。使用8元均匀线阵,阵元间距为半波长。期望信号来自0°,干扰来自30°。固定波束形成器采用均匀加权(等效于对期望方向无失真响应)。阻塞矩阵通过特征分解构造,使其零空间包含期望方向导向矢量。自适应滤波器采用归一化LMS(NLMS)算法更新权重。
import numpy as np
# ========== 参数设置 ==========
M = 8 # 阵元数
d = 0.5 # 阵元间距(波长归一化)
theta_s = 0 # 期望信号方向(度)
theta_i = 30 # 干扰方向(度)
SNR = 10 # 信噪比 dB
INR = 30 # 干噪比 dB
N = 4000 # 快拍数
mu = 0.01 # NLMS步长
delta = 1e-6 # 正则化参数
# ========== 导向矢量 ==========
def steering_vector(theta_deg, M, d):
theta = np.deg2rad(theta_deg)
return np.exp(1j * 2 * np.pi * d * np.arange(M) * np.sin(theta))
a_s = steering_vector(theta_s, M, d) # 期望方向导向矢量
a_i = steering_vector(theta_i, M, d) # 干扰方向导向矢量
# ========== 生成接收数据 ==========
rng = np.random.default_rng(42)
s = rng.standard_normal(N) + 1j * rng.standard_normal(N) # 期望信号
i = rng.standard_normal(N) + 1j * rng.standard_normal(N) # 干扰
n = rng.standard_normal((M, N)) + 1j * rng.standard_normal((M, N)) # 噪声
# 功率归一化
s = s / np.sqrt(np.mean(np.abs(s)**2))
i = i / np.sqrt(np.mean(np.abs(i)**2))
n = n / np.sqrt(np.mean(np.abs(n)**2))
# 按SNR/INR缩放
A_s = np.sqrt(10**(SNR/10))
A_i = np.sqrt(10**(INR/10))
# 阵列接收信号: x[k] = A_s*a_s*s[k] + A_i*a_i*i[k] + n[k]
x = A_s * np.outer(a_s, s) + A_i * np.outer(a_i, i) + n
# ========== GSC模块 ==========
# 1. 固定波束形成器(均匀加权)
w_q = a_s / M
# 2. 阻塞矩阵 B: 通过投影构造,使 B @ a_s = 0
# 使用M-1个与a_s正交的基向量
A_full = np.linalg.qr(np.column_stack([a_s, np.eye(M)]))[0]
B = A_full[:, 1:].conj().T # (M-1) x M,满足 B @ a_s = 0
# 3. 自适应滤波器初始化
w_a = np.zeros(M - 1, dtype=complex)
# ========== 自适应处理 ==========
y_out = np.zeros(N, dtype=complex)
y_fbf = np.zeros(N, dtype=complex)
for k in range(N):
x_k = x[:, k]
# 上支路:固定波束形成输出
y_fbf[k] = w_q.conj() @ x_k
# 中支路:阻塞矩阵输出
u_k = B @ x_k
# 下支路:自适应对消
y_a = w_a.conj() @ u_k
# GSC输出
y_out[k] = y_fbf[k] - y_a
# NLMS自适应更新
denom = u_k.conj() @ u_k + delta
w_a = w_a + mu / denom * u_k * np.conj(y_out[k])
# ========== 性能评估 ==========
# 计算输出SINR(理论值,基于信号分量功率)
def compute_sinr(w, x, a_s, a_i, A_s, A_i, N):
# 期望信号分量功率
s_comp = A_s * (w.conj() @ a_s)
Ps = np.abs(s_comp)**2 * np.mean(np.abs(s)**2)
# 干扰分量功率
i_comp = A_i * (w.conj() @ a_i)
Pi = np.abs(i_comp)**2 * np.mean(np.abs(i)**2)
# 噪声分量功率
Pn = np.mean(np.abs(w)**2) * np.mean(np.abs(n)**2)
return 10 * np.log10(Ps / (Pi + Pn))
# 固定波束形成SINR
w_fbf = w_q
sinr_fbf = compute_sinr(w_fbf, x, a_s, a_i, A_s, A_i, N)
# GSC稳态SINR(取最后500个快拍的平均权重)
w_gsc = w_q.copy()
w_gsc[1:] = -w_a # 合并到等效权重
# 实际等效权重: w_eq = w_q - B^H w_a
w_eq = w_q - B.conj().T @ w_a
sinr_gsc = compute_sinr(w_eq, x, a_s, a_i, A_s, A_i, N)
# 理论最优SINR(MVDR)
R_i_n = A_i**2 * np.outer(a_i, a_i.conj()) + np.eye(M)
w_opt = np.linalg.solve(R_i_n, a_s) / (a_s.conj() @ np.linalg.solve(R_i_n, a_s))
sinr_opt = compute_sinr(w_opt, x, a_s, a_i, A_s, A_i, N)
print(f"固定波束形成 SINR: {sinr_fbf:.2f} dB")
print(f"GSC 稳态 SINR: {sinr_gsc:.2f} dB")
print(f"理论最优 SINR: {sinr_opt:.2f} dB")
print(f"GSC干扰抑制增益: {sinr_gsc - sinr_fbf:.2f} dB")
运行与验证
运行方式:将代码保存为gsc_demo.py,在安装NumPy的Python环境中执行python gsc_demo.py。
预期输出:程序打印三个SINR值。由于干扰功率远大于噪声(INR=30dB),固定波束形成器无法有效抑制旁瓣方向的干扰,其输出SINR较低;GSC通过自适应对消将干扰抑制到噪声水平以下,输出SINR接近理论最优值。典型结果中,GSC比固定波束形成的SINR提升约20dB以上。
判定标准:若GSC稳态SINR显著高于固定波束形成SINR(提升≥15dB),且与理论最优SINR差距在3dB以内,则验证GSC结构正确实现了干扰抑制功能。可通过调整干扰方向(如改为-40°)或干扰强度(INR=20dB)观察GSC仍能有效抑制干扰,进一步确认算法鲁棒性。