2. 窄带信号模型仿真
任务说明
本案例仿真3个窄带信号以不同方向入射到8元均匀线阵(阵元间距为半波长),生成包含高斯白噪声的阵列接收数据,为后续波束形成与DOA估计提供标准输入。
信号模型与参数
均匀线阵接收模型:x(t) = A·s(t) + n(t),其中A为方向矩阵(8×3),s(t)为信号复包络(3×1),n(t)为复高斯白噪声(8×1)。
| 参数 | 数值 | 说明 |
|---|---|---|
| 阵元数 M | 8 | 均匀线阵 |
| 阵元间距 d | λ/2 | 半波长 |
| 信号数 K | 3 | 窄带远场信号 |
| 入射角 θ | -30°, 0°, 45° | 相对法线方向 |
| 信噪比 SNR | 10 dB | 每个信号等功率 |
| 快拍数 N | 500 | 采样点数 |
| 载频 f₀ | 1 GHz | 波长 λ = c/f₀ |
核心代码实现
import numpy as np
# ===== 参数设置 =====
M = 8 # 阵元数
K = 3 # 信号数
N = 500 # 快拍数
SNR_dB = 10 # 信噪比(dB)
c = 3e8 # 光速
f0 = 1e9 # 载频
lam = c / f0 # 波长
d = lam / 2 # 阵元间距(半波长)
theta_deg = np.array([-30, 0, 45]) # 入射角(度)
theta = np.deg2rad(theta_deg) # 转弧度
# ===== 方向矩阵 A (M×K) =====
# 第k个信号在第m个阵元的相位延迟: exp(-j*2π*d*m*sin(θ_k)/λ)
m_idx = np.arange(M).reshape(-1, 1) # (M,1)
A = np.exp(-1j * 2 * np.pi * d * m_idx * np.sin(theta) / lam) # (M,K)
# ===== 生成信号复包络 s(t) (K×N) =====
# 窄带信号: 复指数形式, 频率偏移各不相同
f_offset = np.array([0.01, 0.02, -0.015]) # 归一化频率偏移
t = np.arange(N) / N
s = np.exp(1j * 2 * np.pi * f_offset.reshape(-1, 1) * t) # (K,N)
# ===== 生成噪声并叠加 =====
# 信号功率归一化为1, 按SNR计算噪声功率
signal_power = np.mean(np.abs(s)**2, axis=1) # 每个信号平均功率
noise_power = np.mean(signal_power) / (10**(SNR_dB/10)) # 总噪声功率
noise = (np.random.randn(M, N) + 1j*np.random.randn(M, N)) * np.sqrt(noise_power/2)
# ===== 阵列接收数据 X (M×N) =====
X = A @ s + noise
# ===== 输出关键信息 =====
print(f"方向矩阵 A 维度: {A.shape}")
print(f"信号矩阵 s 维度: {s.shape}")
print(f"接收数据 X 维度: {X.shape}")
print(f"噪声功率: {noise_power:.6f}")
print(f"接收数据实部均值: {np.mean(X.real):.4f}")
print(f"接收数据虚部均值: {np.mean(X.imag):.4f}")
代码说明
方向矩阵A的第k列对应第k个信号的阵列导向矢量,元素A[m,k] = exp(-j·2π·d·m·sinθ_k/λ)。信号复包络采用不同归一化频率的复指数,模拟窄带信号间的频率差异。噪声为复高斯白噪声,其实部与虚部独立同分布,方差为noise_power/2,保证总噪声功率为noise_power。接收数据X为8×500的复矩阵,每列对应一个快拍的阵列快照。
运行与验证
运行方式:直接执行上述Python脚本(需安装NumPy)。
验证方法:
- 检查输出维度:
A为(8,3),s为(3,500),X为(8,500); - 验证信噪比:计算
X中信号分量功率与噪声功率之比,应接近10dB; - 验证导向矢量正确性:对第
k个信号,A[:,k]相邻元素相位差应为-2π·d·sinθ_k/λ; - 观察数据统计特性:
X的实部与虚部均值应接近0(随机噪声所致)。
判定标准:维度正确、SNR误差在±0.5dB以内、相位差与理论值一致,即视为通过。