2. 构建简单的信道模型
任务说明
本案例的目标是使用Python构建一个可复现的简单有损信道模型,用于模拟高速SerDes链路中高频分量的衰减效应。该模型将作为后续均衡算法(CTLE/DFE)验证的基准信道,因此需要具备明确的频域传递函数和时域脉冲响应,并支持任意输入码流的波形仿真。
信道模型设计
采用经典的单极点低通模型近似有损传输线的高频衰减特性,其频域传递函数为:
H(f) = 1 / (1 + j·f/fc)
其中 fc 为信道−3dB截止频率。该模型物理意义清晰:频率越高,衰减越大,相位延迟越明显。为便于时域仿真,我们通过逆傅里叶变换获得脉冲响应,再与发送波形进行卷积。
Python实现
import numpy as np
import matplotlib.pyplot as plt
def channel_response(fc, fs, num_taps=64):
"""生成单极点低通信道的脉冲响应(FIR近似)"""
# 频域采样点数(含正负频率)
N = num_taps * 16
freqs = np.fft.fftfreq(N, d=1/fs)
# 单极点低通传递函数
H = 1.0 / (1.0 + 1j * freqs / fc)
# 逆傅里叶得到时域脉冲响应
h = np.fft.ifft(H)
# 截取主瓣并归一化(确保直流增益为1)
start = N//2 - num_taps//2
h_cut = np.real(h[start:start+num_taps])
h_cut /= np.sum(h_cut)
return h_cut
def apply_channel(signal, h):
"""将信号通过信道(线性卷积)"""
return np.convolve(signal, h, mode='full')[:len(signal)]
# ===== 参数设置 =====
fs = 40e9 # 采样率 40 GS/s(对应25 Gb/s NRZ信号)
fc = 5e9 # 信道截止频率 5 GHz(高频强衰减)
num_taps = 48 # FIR抽头数
# 生成信道脉冲响应
h = channel_response(fc, fs, num_taps)
# 生成测试信号:25 Gb/s NRZ码流(每个UI采样2点)
n_bits = 64
bits = np.random.randint(0, 2, n_bits)
# 上升/下降沿设为理想阶跃
signal = np.repeat(bits, 2).astype(float)
signal[signal == 0] = -1.0 # NRZ: -1/1 表示
# 通过信道
received = apply_channel(signal, h)
# ===== 验证与可视化 =====
# 1. 频域响应验证
N_fft = 4096
f_axis = np.linspace(0, fs/2, N_fft//2)
H_theory = 1.0 / np.sqrt(1 + (f_axis/fc)**2) # 幅度响应理论值
H_actual = np.abs(np.fft.fft(h, N_fft)[:N_fft//2])
# 2. 绘制结果
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 9))
# 脉冲响应
ax1.stem(np.arange(len(h)), h, basefmt=' ')
ax1.set_title('信道脉冲响应 h(t)')
ax1.set_xlabel('抽头序号')
ax1.set_ylabel('幅度')
# 频域响应对比
ax2.semilogx(f_axis/1e9, 20*np.log10(H_theory), 'r-', label='理论')
ax2.semilogx(f_axis/1e9, 20*np.log10(H_actual), 'b--', label='FIR近似')
ax2.set_title('信道频域响应(幅度)')
ax2.set_xlabel('频率 (GHz)')
ax2.set_ylabel('增益 (dB)')
ax2.legend()
ax2.grid(True, which='both')
# 时域波形对比
t = np.arange(len(signal)) / fs * 1e9 # 时间轴(ns)
ax3.plot(t, signal, 'g-', label='发送信号')
ax3.plot(t, received, 'b-', label='接收信号')
ax3.set_title('25 Gb/s NRZ信号通过信道前后对比')
ax3.set_xlabel('时间 (ns)')
ax3.set_ylabel('幅度')
ax3.legend()
ax3.grid(True)
plt.tight_layout()
plt.savefig('channel_model.png', dpi=150)
plt.show()
# 输出关键参数
print(f"信道截止频率 fc = {fc/1e9:.1f} GHz")
print(f"脉冲响应抽头数 = {len(h)}")
print(f"直流增益 = {np.sum(h):.4f}")
print(f"5GHz处衰减 = {20*np.log10(np.abs(np.fft.fft(h)[int(5e9/fs*len(h))])):.2f} dB")
代码说明
上述代码实现了完整的信道建模闭环:channel_response() 根据截止频率生成FIR近似的脉冲响应,apply_channel() 通过卷积完成信号滤波。测试信号采用25 Gb/s NRZ码流(每个UI采样2点),经过信道后可直接观察码间干扰(ISI)的引入情况。频域验证部分对比了理论幅度响应与FIR近似的差异,确保模型在目标频段内准确。
运行与验证
运行方式:确保已安装 numpy 和 matplotlib,直接执行脚本即可。程序会生成 channel_model.png 图像文件并在终端打印关键参数。
判定标准:
- 脉冲响应图形呈现单边指数衰减形态,抽头数48时能量集中在起始10个抽头内;
- 频域响应曲线在fc=5 GHz处衰减约3 dB,且FIR近似与理论曲线在0~15 GHz范围内误差小于1 dB;
- 时域波形中,接收信号相比发送信号出现明显的上升沿变缓与过冲/振铃现象,眼图张开度下降(可通过后续眼图分析验证);
- 终端打印的直流增益接近1.0000(误差<0.01),5 GHz处衰减约−3 dB。
预期输出:终端打印的直流增益为1.0000(误差小于0.01),5 GHz处衰减约−3.0 dB;生成的图像中频域响应曲线在截止频率处正确衰减3 dB,时域波形显示接收信号上升沿明显变缓(约从0到90%所需时间由20 ps增至约60 ps),且出现幅度约±0.15V的振铃现象。该模型可直接用于后续CTLE/DFE均衡算法的性能对比基准。