2. 多径信道冲激响应的时域测量与抽头提取

为什么用匹配滤波做信道冲激响应估计

在探测信号 s(t) 已知、接收信号 r(t) 可采集的前提下,信道冲激响应 h(t) 的估计可以写成匹配滤波形式:把接收信号与探测信号的时间反转共轭做卷积。对离散采样序列,若探测信号为 s[n](长度 N),接收序列为 r[n],则

h_est[k] = Σ_n r[n] · conj(s[n-k])

当探测信号具有近似理想的自相关(如线性调频信号、伪随机序列),匹配滤波输出在真实到达时延处形成尖锐相关峰,峰的位置对应多径时延,峰的复幅度对应该路径的复增益(含传播损失与反射相位)。这正是从“连续响应”走向“离散抽头模型”的桥梁。

仿真数据构造与抽头提取流程

为便于验证,先构造一个已知真值的三径信道作为教学示例:采样率 fs = 48 kHz,探测信号采用 2–8 kHz 线性调频、时长 20 ms。设定三条路径的相对时延为 [0, 1.8, 4.3] ms,复增益为 [1.0, 0.55·e^{j0.9}, 0.28·e^{-j2.1}],并叠加信噪比约 20 dB 的高斯白噪声。下面的 Python 代码完成“生成接收数据 → 匹配滤波 → 门限检测 → 抽头重构 → 误差评估”的完整闭环。

import numpy as np

fs = 48000
T = 0.020
t = np.arange(int(fs*T)) / fs
f0, f1 = 2000, 8000
s = np.cos(2*np.pi*(f0*t + (f1-f0)/(2*T)*t**2))   # 2-8 kHz LFM 探测信号

# 已知真值三径信道
delays_ms = np.array([0.0, 1.8, 4.3])
gains = np.array([1.0, 0.55*np.exp(1j*0.9), 0.28*np.exp(-1j*2.1)])
L = int(0.010*fs)                                  # 信道长度 10 ms
h_true = np.zeros(L, dtype=complex)
for d, g in zip(delays_ms, gains):
    h_true[int(round(d/1000*fs))] += g

# 接收信号 = 探测信号卷积信道 + 噪声
r_clean = np.convolve(s, h_true)[:len(s)+L-1]
rng = np.random.default_rng(7)
noise = (rng.normal(size=r_clean.size) + 1j*rng.normal(size=r_clean.size)) / np.sqrt(2)
r = r_clean + 0.1*np.std(r_clean)*noise            # 约 20 dB SNR

# 匹配滤波估计信道冲激响应
h_est = np.convolve(r, np.conj(s[::-1]), mode='full')
h_est = h_est[len(s)-1:len(s)-1+L]                 # 对齐到信道时延轴

# 门限检测:相对最大峰值的 -15 dB
thr = np.max(np.abs(h_est)) * 10**(-15/20)
peaks = []
for k in range(1, L-1):
    if abs(h_est[k]) > thr and abs(h_est[k]) >= abs(h_est[k-1]) and abs(h_est[k]) >= abs(h_est[k+1]):
        peaks.append(k)

# 抽头模型重构与误差
h_taps = np.zeros(L, dtype=complex)
for k in peaks:
    h_taps[k] = h_est[k]
err = np.linalg.norm(h_est - h_taps) / np.linalg.norm(h_est)
print("提取抽头时延(ms):", [round(k/fs*1000, 2) for k in peaks])
print("重构相对误差:", round(err, 4))

运行后预期可观察到:抽头时延集中在 0、1.8、4.3 ms 附近(受采样量化影响可能有 ±0.02 ms 偏差),重构相对误差通常在 0.1 量级以下。若误差明显偏大,说明门限过低引入了噪声峰,或门限过高漏掉了弱路径。

时延轴对齐与门限选择的关键关系

匹配滤波输出长度是 N + L - 1,必须截取 [N-1, N-1+L) 这一段才能让索引 k 直接对应信道时延 k/fs。门限选择则是在“漏检弱路径”和“误检噪声峰”之间的权衡:门限过高会丢失 0.28 幅度那条路径,门限过低会把噪声起伏当成抽头。下图把这一处理链与判读逻辑放在一起呈现。

匹配滤波估计 → 门限抽头提取 → 重构误差判读 探测信号 s[n] 2–8 kHz LFM, 20 ms 接收信号 r[n] 三径 + 20 dB 噪声 匹配滤波 r[n] ⊛ conj(s[-n]) 截取 [N-1, N-1+L) |h_est[k]| 匹配滤波输出 时延 (ms) 门限 −15 dB 0 ms 1.8 ms 4.3 ms 门限检测 局部极大 + 幅度门限 提取时延与复增益 离散抽头模型 h_taps[k] = h_est[k] 仅保留检测到的峰 重构误差 ‖h_est − h_taps‖ / ‖h_est‖ 目标 < 0.1 判读要点 时延轴对齐:截取起点必须为 N−1,否则抽头时延整体偏移 门限过高 → 漏掉 0.28 幅度弱路径;门限过低 → 噪声峰被误判为抽头 重构误差偏大时,先检查门限,再检查探测信号自相关旁瓣是否过高

结果判读与常见偏差

  • 时延偏差:若所有抽头时延整体偏移一个固定量,通常是截取起点写成了 len(s) 而非 len(s)-1。
  • 弱路径丢失:0.28 幅度路径在 −15 dB 门限下仍可检出;若门限提到 −10 dB 就可能漏掉,此时重构误差会明显上升。
  • 噪声峰误检:门限降到 −25 dB 以下时,噪声起伏容易越过门限形成伪抽头,表现为抽头数量多于真实路径数。
  • 旁瓣干扰:LFM 匹配滤波存在距离旁瓣,若两条路径时延差小于主瓣宽度(约 1/B = 0.17 ms),峰将无法分辨,需要改用更宽带宽或加窗抑制旁瓣。
验证抽头模型是否可信,最直接的办法就是计算重构相对误差:把提取出的离散抽头重新卷积探测信号,与匹配滤波输出比较。误差小于 0.1 通常说明主要多径已被完整捕获。