简介:本资源是《通信原理》(李晓峰版)配套课后习题的完整参考答案,面向电子信息、通信工程等专业本科生及考研复习者,用于巩固信源熵计算、信道容量分析、AM/SSB调制解调、带宽与功率关系等核心知识点。文件为单个PDF文档(2.53MB),内容覆盖第3章至第4章典型习题,含详细推导过程与规范公式应用,如多符号熵计算、香农容量公式代入、调制指数判定、单边带信号时频域表达式推导及频谱图示意,对理解理论难点与应试演算极具参考价值。预览可见清晰分题编号、标准解题步骤与关键结论标注,便于对照教材自查思路。目前已有141人学习下载,适合作为课后自学辅助、期末备考梳理或教师教学参考材料。
1. 这份《通信原理-李晓峰》课后习题答案PDF,不是“抄作业指南”,而是信号与系统建模能力的校准器
很多通信工程、电子信息类专业的学生第一次打开《通信原理(第三版)》李晓峰主编教材时,会被第2章“确知信号分析”里的傅里叶变换对推导卡住,或在第5章“模拟调制系统”中对SSB调制频谱搬移后为何要保留单边带感到抽象。这份流传较广的“通信原理-李晓峰-课后习题答案.pdf”,表面看是解题过程汇编,实则是一套隐性知识图谱:它把教材中分散在各章的数学工具(如希尔伯特变换、功率谱密度计算、匹配滤波器冲激响应设计)串联成可复现的信号处理链路。它适合两类人——刚学完理论但无法将公式映射到MATLAB/Python仿真结果的学生,以及需要快速验证调制解调模块信噪比性能边界的一线工程师。注意:该PDF本身不含代码,但所有答案均可通过Python SciPy+NumPy或MATLAB Signal Processing Toolbox逐行复现;其价值不在“答案是什么”,而在“如何用离散采样逼近连续域推导”。
2. 从PDF答案反向构建可运行的通信系统仿真环境:以第4章“随机过程”习题4-7为例
提示:本节不依赖PDF文件内容,仅以其典型题目为线索,构建可验证的数字通信仿真流程。所有代码均基于开源库,无需商业软件授权。
2.1 为什么必须重写PDF中的手算推导?——离散化带来的三重失配
PDF中习题4-7要求计算“窄带高斯白噪声通过理想带通滤波器后的同相/正交分量统计特性”。手算答案给出:$I(t)$ 与 $Q(t)$ 独立同分布,均值为0,方差为 $N_0B/2$。但若直接用np.random.normal(0, np.sqrt(N0*B/2), size=N)生成 $I(t)$ 序列,会忽略两个关键失配:
- 采样率失配:理论推导假设连续时间,而实际仿真需满足奈奎斯特准则,若载频 $f_c=10,\text{MHz}$,带宽 $B=1,\text{MHz}$,则采样率至少需 $22,\text{MHz}$(而非 $2B=2,\text{MHz}$);
- 滤波器实现失配:PDF中“理想带通”在数字域不可实现,必须用FIR滤波器逼近,其过渡带和纹波会污染 $I/Q$ 分量的高斯性;
- 相位同步失配:手算默认本地振荡器与载波严格同频同相,实际需加入相位抖动模型(如
np.random.uniform(-0.1, 0.1, size=N)弧度)。
因此,正确路径是:先用PDF答案作为理论基准,再用代码重建整个噪声生成-滤波-下变频链路,并用Kolmogorov-Smirnov检验验证 $I(t)$ 是否服从 $N(0, N_0B/2)$。
2.2 用Python复现窄带噪声生成与I/Q分解全流程
以下代码完整实现习题4-7的数字仿真,包含抗混叠预处理、FIR带通设计、正交下变频及统计检验:
import numpy as np import matplotlib.pyplot as plt from scipy import signal, stats from scipy.fft import fft, fftfreq # 参数设定(严格对应教材习题条件) fc = 10e6 # 载频 10 MHz B = 1e6 # 带宽 1 MHz N0 = 1e-9 # 单边功率谱密度 1 nW/Hz fs = 22e6 # 采样率 22 MHz(满足 fc+B < fs/2) T = 0.001 # 仿真时长 1 ms N = int(T * fs) # 总采样点数 # 1. 生成零均值高斯白噪声(连续域近似) n_w = np.random.normal(0, np.sqrt(N0 * fs / 2), size=N) # 功率归一化至采样率 # 2. 设计FIR带通滤波器(逼近理想[fc-B/2, fc+B/2]) nyq = fs / 2 low = (fc - B/2) / nyq high = (fc + B/2) / nyq taps = 101 # 滤波器阶数 b = signal.firwin(taps, [low, high], pass_zero='bandpass', fs=fs) # 3. 滤波得到窄带噪声 n_bn(t) n_bn = signal.lfilter(b, 1, n_w) # 4. 正交下变频:乘cos/sin后低通滤波 t = np.arange(N) / fs cos_lo = np.cos(2 * np.pi * fc * t) sin_lo = np.sin(2 * np.pi * fc * t) # I分量 = n_bn * cos_lo → 低通滤波 i_sig = n_bn * cos_lo i_lp = signal.lfilter(signal.firwin(51, 0.5*B/nyq, fs=fs), 1, i_sig) # Q分量 = n_bn * sin_lo → 低通滤波 q_sig = n_bn * sin_lo q_lp = signal.lfilter(signal.firwin(51, 0.5*B/nyq, fs=fs), 1, q_sig) # 5. 统计检验:I分量是否服从 N(0, N0*B/2) var_theory = N0 * B / 2 ks_stat, ks_p = stats.kstest(i_lp, 'norm', args=(0, np.sqrt(var_theory))) print(f"I分量KS检验p值: {ks_p:.4f} (p>0.05接受原假设)")代码逻辑说明与参数含义
n_w的标准差设为np.sqrt(N0 * fs / 2)是因数字白噪声功率谱密度需按采样率缩放(单位:W/Hz → W·s/样本);firwin(..., pass_zero='bandpass')生成线性相位FIR带通,taps=101保证过渡带宽度 ≤ 50 kHz(远小于B=1 MHz),避免频谱泄漏;- 下变频后低通滤波器截止频率设为
0.5*B/nyq(即500 kHz归一化频率),因I/Q分量带宽为B/2; - KS检验使用
kstest对I分量直方图与理论高斯分布拟合,p值 > 0.05 表明仿真结果与PDF理论一致。
2.3 验证结果可视化:对比PDF手算结论与仿真输出
运行上述代码后,执行以下绘图验证三个核心结论:
# 绘制I/Q分量概率密度函数(PDF)与理论高斯曲线对比 fig, ax = plt.subplots(1, 2, figsize=(12, 4)) x_grid = np.linspace(-3e-3, 3e-3, 1000) pdf_theory = stats.norm.pdf(x_grid, 0, np.sqrt(var_theory)) ax[0].hist(i_lp, bins=50, density=True, alpha=0.7, label='仿真I分量') ax[0].plot(x_grid, pdf_theory, 'r-', lw=2, label='理论N(0,σ²)') ax[0].set_title('I分量概率密度') ax[0].legend() ax[1].scatter(i_lp[::100], q_lp[::100], s=0.1, alpha=0.6) ax[1].set_xlabel('I(t)'); ax[1].set_ylabel('Q(t)') ax[1].set_title('I-Q平面散点图(应呈圆对称)') plt.tight_layout() plt.show()注意:若散点图呈现椭圆而非圆形,说明I/Q分量未完全正交——需检查本地振荡器相位是否严格正交(
sin_lo必须用np.sin而非np.cos偏移π/2,因浮点误差会导致微小偏差)。
3. 将PDF答案转化为调制解调性能评估脚本:以第6章AM/FM解调误码率验证为例
提示:本节聚焦“如何用PDF中的闭式解(如AM包络检波输出SNR公式)驱动自动化测试”,而非复现教材推导。
3.1 教材公式与数字仿真的鸿沟:为什么不能直接套用SNR公式?
李晓峰教材第6章习题6-3给出AM调制下包络检波输出信噪比公式: $$ \left(\frac{S}{N}\right)_{out} = \frac{A_c^2 m^2}{2N_0 B} $$ 其中 $A_c$ 为载波幅度,$m$ 为调制指数。但该公式成立需满足大信噪比条件($S/N \gg 1$)且假设无门限效应。当输入SNR低于10 dB时,仿真结果将显著偏离该公式——这正是PDF答案未覆盖的工程边界。因此,必须构建闭环测试框架:输入不同SNR,测量实际误码率(BER),并与理论曲线对比。
3.2 构建AM调制-加噪-包络检波-判决的端到端BER测试流水线
以下脚本实现从基带信号生成到BER计算的全链路,支持批量测试不同SNR:
def am_modulate_demodulate_ber(snr_db_list, fc=1e6, fs=10e6, T=0.01): """ AM调制解调BER测试主函数 snr_db_list: 输入SNR列表,单位dB 返回: dict{'snr_db': [...], 'ber': [...]} """ results = {'snr_db': [], 'ber': []} for snr_db in snr_db_list: # 1. 生成双极性基带信号(矩形脉冲,速率Rb=100kbit/s) Rb = 1e5 N_bits = int(Rb * T) bits = np.random.randint(0, 2, N_bits) # 映射为±1(双极性) symbols = 2 * bits - 1 # 2. AM调制:s(t) = Ac[1 + m·u(t)]cos(2πfct) Ac = 1.0 m = 0.8 # 调制指数 t_base = np.arange(0, T, 1/fs) # 插值生成基带波形 u(t)(升余弦成形,避免码间干扰) u_t = np.zeros(len(t_base)) pulse_len = int(fs / Rb) # 每符号采样点数 for i, bit in enumerate(bits): start_idx = int(i * pulse_len) if start_idx + pulse_len <= len(u_t): # 简化为矩形脉冲(教材习题常用假设) u_t[start_idx:start_idx+pulse_len] = symbols[i] carrier = Ac * np.cos(2 * np.pi * fc * t_base) am_signal = Ac * (1 + m * u_t) * carrier # 3. 加高斯白噪声(按目标SNR计算噪声功率) sig_power = np.mean(am_signal**2) noise_power = sig_power / (10**(snr_db/10)) noise = np.random.normal(0, np.sqrt(noise_power), len(am_signal)) rx_signal = am_signal + noise # 4. 包络检波:取绝对值 + 低通滤波 envelope = np.abs(rx_signal) # 低通滤波器(截止频率=2*Rb,保留基带信息) b_lp = signal.firwin(31, 2*Rb/(fs/2), fs=fs) u_hat = signal.lfilter(b_lp, 1, envelope) # 5. 判决:采样每个符号中心点,与阈值比较 decision_points = [] for i in range(N_bits): center_idx = int((i + 0.5) * pulse_len) if center_idx < len(u_hat): decision_points.append(u_hat[center_idx]) # 判决阈值设为均值(自适应) threshold = np.mean(decision_points) decisions = [1 if x > threshold else 0 for x in decision_points] # 6. 计算BER errors = sum([1 for a,b in zip(bits, decisions) if a!=b]) ber = errors / len(bits) results['snr_db'].append(snr_db) results['ber'].append(ber) return results # 执行测试(覆盖教材典型SNR范围) snr_range = np.arange(0, 25, 2) ber_data = am_modulate_demodulate_ber(snr_range) # 绘制BER曲线并与理论公式对比 plt.figure(figsize=(8, 5)) plt.semilogy(ber_data['snr_db'], ber_data['ber'], 'bo-', label='仿真BER') # 理论公式:Q函数近似(大SNR下AM包络检波BER ≈ Q(sqrt(SNR))) snr_linear = 10**(np.array(ber_data['snr_db'])/10) ber_theory = 0.5 * special.erfc(np.sqrt(snr_linear)/2) # 简化近似 plt.semilogy(ber_data['snr_db'], ber_theory, 'r--', label='理论Q函数近似') plt.xlabel('输入SNR (dB)'); plt.ylabel('BER'); plt.legend(); plt.grid() plt.title('AM包络检波BER性能验证(对比PDF习题6-3理论)') plt.show()关键参数设计依据
m = 0.8:严格采用教材习题中常用调制指数,避免过调制导致包络失真;pulse_len = int(fs / Rb):确保每符号采样点数为整数,防止判决点偏移;envelope = np.abs(rx_signal):实现包络检波核心操作,后续低通滤波带宽设为2*Rb(教材中基带信号最高频率);threshold = np.mean(decision_points):采用自适应判决门限,更贴近实际接收机行为,而非固定门限。
提示:当
snr_db < 10时,仿真BER将明显高于理论曲线——这正是PDF答案未体现的“门限效应”,需在实验报告中重点分析。
4. 利用PDF答案反向调试MATLAB/Simulink模型:定位第7章数字基带传输的ISI根源
提示:本节针对已建立Simulink模型但误码率异常的用户,提供基于PDF答案的根因排查法。
4.1 从习题7-5的无ISI条件出发,构建眼图诊断工作流
教材第7章习题7-5要求验证“升余弦滚降滤波器能否消除码间干扰”,其理论条件是:发送滤波器 $G_T(f)$ 与接收滤波器 $G_R(f)$ 满足 $G_T(f)G_R(f) = \text{rect}(f/2R_b)$(奈奎斯特第一准则)。但Simulink中常因以下原因失效:
- 采样时钟相位偏移:判决时刻未对齐眼图中心;
- 滤波器群延迟不匹配:发送/接收滤波器相位响应不对称;
- 量化误差累积:定点模型中系数截断引入频响畸变。
因此,不能仅看误码率数值,而需用PDF答案中的“无ISI理想眼图”作为黄金标准,反向校准模型。
4.2 四步眼图诊断法:用Python解析Simulink输出数据
假设已从Simulink导出rx_samples.mat(含变量y为接收信号序列),执行以下诊断:
import scipy.io as sio import numpy as np import matplotlib.pyplot as plt # 1. 加载Simulink输出数据 data = sio.loadmat('rx_samples.mat') y = data['y'].flatten() # 2. 重构眼图(关键:精确符号定时) Rb = 1e6 # 符号率 1 Mbps Ts = 1/Rb # 符号周期 fs = 10e6 # 采样率 samples_per_symbol = int(fs * Ts) # 每符号采样点数 # 提取足够多符号用于眼图(至少200个) num_symbols = min(200, len(y)//samples_per_symbol) y_trim = y[:num_symbols * samples_per_symbol] # 3. 绘制眼图(按符号周期堆叠) eye_data = y_trim.reshape(num_symbols, samples_per_symbol).T plt.figure(figsize=(10, 6)) for i in range(0, samples_per_symbol, 2): # 每2点画一条轨迹(提升清晰度) plt.plot(eye_data[i, :], 'b-', alpha=0.1) plt.xlabel('时间(采样点)'); plt.ylabel('幅度') plt.title(f'眼图诊断({num_symbols}个符号)') plt.grid(True) plt.show() # 4. 定量分析:计算眼高(Eye Height)与眼宽(Eye Width) # 眼高 = 眼图张开高度(判决阈值处垂直距离) mid_point = samples_per_symbol // 2 threshold = np.mean([np.min(eye_data[mid_point, :]), np.max(eye_data[mid_point, :])]) eye_height = np.max(eye_data[mid_point, :]) - np.min(eye_data[mid_point, :]) # 眼宽 = 眼图水平张开宽度(在眼高50%处测量) half_height = threshold + 0.5 * eye_height # 在中间50%采样点范围内搜索穿越点 search_region = eye_data[mid_point-5:mid_point+5, :] crossings = [] for row in search_region: above = row > half_height change_points = np.where(np.diff(above))[0] crossings.extend(change_points) eye_width = np.max(crossings) - np.min(crossings) if crossings else 0 print(f"眼高: {eye_height:.4f}, 眼宽: {eye_width} 采样点(理论应≥0.8*samples_per_symbol)")诊断结果解读表
| 观察现象 | 可能根因 | PDF答案对应知识点 |
|---|---|---|
| 眼图完全闭合(eye_height ≈ 0) | 发送/接收滤波器滚降因子α设置不匹配(如发送α=0.5,接收α=0) | 习题7-5强调 $G_T(f)G_R(f)$ 必须为矩形,α需相同 |
| 眼图倾斜(非垂直对称) | 采样时钟相位偏移 > Ts/4 | 习题7-3指出最佳判决点在眼图中心,偏移导致ISI敏感度上升 |
| 眼图有规律毛刺 | Simulink中滤波器使用了非线性相位IIR结构 | 教材强调“线性相位”是实现无ISI的必要条件(P218) |
注意:若眼宽 < 0.8×samples_per_symbol,说明定时恢复环路未收敛——需检查Simulink中PLL模块的环路带宽参数是否过小(典型值应为 $0.01R_b$)。
5. 进阶技巧:用PDF答案自动校验自定义调制解调器的频谱合规性——以第8章QPSK为例
提示:本节解决“如何快速验证自己写的QPSK收发器是否符合3GPP/IEEE标准”的痛点,不依赖昂贵仪器。
5.1 从习题8-7的功率谱密度推导,导出可编程的频谱模板匹配算法
教材习题8-7要求推导QPSK信号的功率谱密度(PSD): $$ S_x(f) = \frac{E_s}{T_s} \cdot \left| \frac{\sin(\pi f T_s)}{\pi f T_s} \right|^2 $$ 其中 $E_s$ 为符号能量,$T_s$ 为符号周期。该公式表明QPSK PSD主瓣宽度为 $2/T_s$,第一零点在 $f = \pm 1/T_s$。但实际发射信号需满足频谱掩模(如FCC Part 15对ISM频段的限制),因此需将PDF答案转化为可执行的频谱合规性检查。
5.2 实现频谱模板自动比对:Python脚本检测发射信号是否越界
以下函数接收时域信号,计算PSD并比对FCC ISM频段掩模(中心频点 $f_c=2.4,\text{GHz}$,带宽 $B=20,\text{MHz}$):
def check_spectrum_mask(signal_td, fs, fc=2.4e9, mask_type='fcc_ism'): """ 检查QPSK信号频谱是否符合指定掩模 signal_td: 时域信号数组 fs: 采样率(Hz) mask_type: 'fcc_ism' 或 'etsi_srds' 返回: bool(True表示合规),dict(详细越界信息) """ # 计算PSD(Welch法,50%重叠) f, psd = signal.welch(signal_td, fs=fs, nperseg=4096, noverlap=2048, scaling='density', return_onesided=False) # 转换为dBm/Hz(参考1 Ohm阻抗) psd_dbmhz = 10 * np.log10(psd * 1000) # W/Hz → dBm/Hz # 构建FCC ISM掩模(相对载频的偏移) # FCC §15.247: 2400-2483.5 MHz, 带外衰减 ≥ 20 dB @ ±1 MHz, ≥ 30 dB @ ±2 MHz offset_f = f - fc # 频率偏移数组 mask_db = np.full_like(offset_f, -41.3) # 基础噪声底 -41.3 dBm/Hz # 主瓣内允许功率:≤ 30 dBm ERP(等效为 -10 dBm/Hz 在20MHz带宽) main_lo = -10e6; main_hi = 10e6 in_main = (offset_f >= main_lo) & (offset_f <= main_hi) mask_db[in_main] = -10.0 # 过渡区:±1~2 MHz 衰减至 -30 dBm/Hz trans1_lo, trans1_hi = -2e6, -1e6 trans2_lo, trans2_hi = 1e6, 2e6 mask_db[(offset_f >= trans1_lo) & (offset_f < trans1_hi)] = -30.0 mask_db[(offset_f > trans2_lo) & (offset_f <= trans2_hi)] = -30.0 # 带外区:|f-fc| > 2 MHz,要求 ≤ -41.3 dBm/Hz out_of_band = np.abs(offset_f) > 2e6 mask_db[out_of_band] = -41.3 # 检测越界点 violations = psd_dbmhz > mask_db violation_freqs = offset_f[violations] violation_margins = psd_dbmhz[violations] - mask_db[violations] result = { 'compliant': not np.any(violations), 'violation_count': np.sum(violations), 'max_violation_dB': np.max(violation_margins) if violations.any() else 0, 'violation_freqs_MHz': violation_freqs / 1e6 } # 可视化 plt.figure(figsize=(10, 6)) plt.plot(offset_f/1e6, psd_dbmhz, 'b-', label='实测PSD') plt.plot(offset_f/1e6, mask_db, 'r--', label='FCC掩模') plt.fill_between(offset_f/1e6, mask_db, -100, alpha=0.2, color='red') plt.xlabel('频率偏移 (MHz)'); plt.ylabel('PSD (dBm/Hz)') plt.title('QPSK频谱合规性检查(对比习题8-7理论PSD)') plt.grid(); plt.legend(); plt.xlim(-5, 5); plt.ylim(-50, -5) plt.show() return result['compliant'], result # 使用示例(假设已有QPSK信号) # compliant, details = check_spectrum_mask(qpsk_tx_signal, fs=40e6)掩模参数与教材习题的关联性
main_lo/main_hi = ±10e6:对应习题8-7中QPSK主瓣宽度 $2/T_s$,当 $R_s=10,\text{Mbaud}$ 时,$T_s=0.1,\mu\text{s}$,故主瓣宽 $20,\text{MHz}$;trans1_lo/trans1_hi区间衰减至 -30 dBm/Hz:源于FCC对邻道泄漏功率比(ACLR)的要求,而习题8-7的PSD公式是计算ACLR的起点;-41.3 dBm/Hz噪声底:由热噪声 $kTB$ 推导($k=1.38e-23$, $T=290K$, $B=1,\text{Hz}$),教材虽未明说,但习题8-7的 $E_s/T_s$ 量纲隐含此物理基础。
提示:若检测到
violation_count > 0,优先检查QPSK成形滤波器是否使用了升余弦(而非矩形),因矩形成形会导致旁瓣过高——这正是习题8-7推导中“$\text{sinc}^2$”函数被升余弦替代的工程动因。
本文还有配套的精品资源,点击获取