3. 最小方差无失真响应(MVDR)波束形成

最小方差无失真响应(MVDR)波束形成 学习卡片

任务说明

本案例实现最小方差无失真响应(MVDR)波束形成器,在存在方向性干扰的声场环境中增强期望方向信号,并与延迟-求和(DSB)波束形成器进行输出信干比对比。输入为均匀线阵的仿真接收数据,输出为两种波束形成器的加权向量及波束输出信号,并给出可量化的性能指标。

信号模型与算法原理

考虑\(M\)元均匀线阵,阵元间距为半波长。期望信号从\(\theta_0\)方向入射,干扰从\(\theta_1\)方向入射。第\(m\)个阵元在时刻\(n\)的接收信号为:

\[ x_m(n) = s(n - \tau_m(\theta_0)) + j(n - \tau_m(\theta_1)) + v_m(n) \]

其中\(\tau_m(\theta) = (m-1)d\sin\theta / c\)为相对参考阵元的时延,\(v_m(n)\)为独立高斯白噪声。MVDR波束形成器在保证期望方向无失真响应的约束下最小化输出功率:

\[ \min_{\mathbf{w}} \mathbf{w}^H \mathbf{R}_{xx} \mathbf{w} \quad \text{s.t.} \quad \mathbf{w}^H \mathbf{a}(\theta_0) = 1 \]

其闭式解为\(\mathbf{w}_{\text{MVDR}} = \frac{\mathbf{R}_{xx}^{-1}\mathbf{a}(\theta_0)}{\mathbf{a}^H(\theta_0)\mathbf{R}_{xx}^{-1}\mathbf{a}(\theta_0)}\)。延迟-求和波束形成器则直接取\(\mathbf{w}_{\text{DSB}} = \mathbf{a}(\theta_0)/M\)。

均匀线阵(M=8,d=λ/2) 期望信号 θ₀=10° 干扰 θ₁=-30° MVDR / DSB 处理器 波束输出 y(n)

代码实现

import numpy as np

def generate_array_data(theta_s, theta_i, M=8, N=2000, snr=10, inr=20, seed=42):
    """生成均匀线阵接收数据(半波长间距)"""
    rng = np.random.default_rng(seed)
    d_lambda = 0.5
    n = np.arange(N)
    # 期望信号与干扰的复包络
    s = np.exp(1j * 0.1 * n)                     # 期望信号
    j = np.exp(1j * 0.3 * n) * (10 ** (inr / 20)) # 干扰(功率高于信号)
    # 导向向量
    def steer(theta_deg):
        theta = np.deg2rad(theta_deg)
        return np.exp(-1j * 2 * np.pi * d_lambda * np.arange(M) * np.sin(theta))
    a_s = steer(theta_s).reshape(-1, 1)
    a_i = steer(theta_i).reshape(-1, 1)
    # 接收数据矩阵 X: M x N
    X = a_s @ s.reshape(1, -1) + a_i @ j.reshape(1, -1)
    # 加性噪声(功率归一化到1,SNR由信号幅度控制)
    noise_power = 10 ** (-snr / 10)
    noise = np.sqrt(noise_power / 2) * (rng.standard_normal((M, N)) + 1j * rng.standard_normal((M, N)))
    return X + noise, a_s.flatten()

def mvdr_weights(Rxx, a_s):
    """MVDR波束形成器加权向量"""
    Rinv = np.linalg.inv(Rxx)
    w = Rinv @ a_s / (a_s.conj() @ Rinv @ a_s)
    return w

def dsb_weights(a_s, M):
    """延迟-求和波束形成器加权向量"""
    return a_s / M

def beamformer_output(w, X):
    """计算波束输出信号"""
    return w.conj() @ X

def sinr_estimate(y, s_ref, theta_s, theta_i, M, d_lambda=0.5):
    """基于输出信号与参考信号相关性估计SINR(简化方法)"""
    # 期望信号分量估计(与参考信号相关部分)
    corr = np.sum(y * np.conj(s_ref)) / len(s_ref)
    s_power = np.abs(corr) ** 2
    total_power = np.mean(np.abs(y) ** 2)
    return 10 * np.log10(s_power / (total_power - s_power + 1e-12))

# ========== 参数设置 ==========
M = 8
theta_s, theta_i = 10.0, -30.0
N = 2000
snr, inr = 10, 20

# 生成数据
X, a_s = generate_array_data(theta_s, theta_i, M, N, snr, inr)
# 采样协方差矩阵
Rxx = (X @ X.conj().T) / N

# 计算两种波束形成器权重
w_mvdr = mvdr_weights(Rxx, a_s)
w_dsb = dsb_weights(a_s, M)

# 输出信号
y_mvdr = beamformer_output(w_mvdr, X)
y_dsb = beamformer_output(w_dsb, X)

# 参考信号(用于SINR估计)
n_ref = np.arange(N)
s_ref = np.exp(1j * 0.1 * n_ref)

# 性能对比
sinr_mvdr = sinr_estimate(y_mvdr, s_ref, theta_s, theta_i, M)
sinr_dsb = sinr_estimate(y_dsb, s_ref, theta_s, theta_i, M)

print(f"MVDR 输出SINR: {sinr_mvdr:.2f} dB")
print(f"DSB  输出SINR: {sinr_dsb:.2f} dB")
print(f"MVDR 相对DSB提升: {sinr_mvdr - sinr_dsb:.2f} dB")

运行与验证

依赖:Python 3.8+,NumPy库。

运行方式:将代码保存为mvdr_beamformer.py,在终端执行python mvdr_beamformer.py。

验证方法:程序输出两种波束形成器的输出SINR估计值。判定标准:

  • MVDR的输出SINR应显著高于DSB(通常提升10dB以上,因MVDR在干扰方向形成零陷);
  • DSB输出SINR接近输入SNR(10dB)减去干扰泄漏损失;
  • MVDR输出SINR应接近理论上限(由阵元数M和输入SNR决定,此处约17-20dB)。

若需验证波束方向图,可额外计算20*log10(abs(w.conj() @ steer(theta)))在-90°~90°扫描,观察MVDR在-30°处形成深零陷而DSB无此特性。