Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"permissions": {
"allow": [
"Bash(python -m pytest grading/test_part1_coding.py -v --tb=short)",
"Bash(python -m pytest grading/test_part2_equalization.py -v --tb=short)",
"Bash(python src/part1_channel_coding.py)",
"Bash(python src/part2_equalization.py)",
"Bash(python -c \"import os; print\\(os.listdir\\('results'\\)\\)\")",
"Bash(python -m pytest grading/test_part1_coding.py grading/test_part2_equalization.py -v --tb=short)",
"Bash(python grading/calculate_grade.py)"
]
}
}
4 changes: 4 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"python-envs.defaultEnvManager": "ms-python.python:conda",
"python-envs.defaultPackageManager": "ms-python.python:conda"
}
66 changes: 66 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

A global CLAUDE.md with behavioral guidelines also exists at `C:\Users\86158\Desktop\CLAUDE.md`.

## Overview

University wireless communications experiment covering channel coding (Hamming 7,4) and channel equalization (ZF/LMS). Students complete TODO stubs in `src/part1_channel_coding.py` and `src/part2_equalization.py`. Teacher-provided utilities in `src/utils.py` should not be modified.

## Commands

```bash
# Install dependencies
pip install -r requirements.txt

# Verify environment
python src/test_environment.py

# Run each experiment (generates results/*.png)
python src/part1_channel_coding.py
python src/part2_equalization.py

# Run a single test class or test
python -m pytest grading/test_part1_coding.py -v -k "test_known_encoding"
python -m pytest grading/test_part2_equalization.py -v -k "test_lms_error_decreases"

# Run all tests for a part
python -m pytest grading/test_part1_coding.py -v
python -m pytest grading/test_part2_equalization.py -v

# Compute local grade preview
python grading/calculate_grade.py

# Lint student code
python -m pylint src/part1_channel_coding.py src/part2_equalization.py --score=y
```

## Architecture

```
src/
part1_channel_coding.py # TODO: hamming74_encode, hamming74_syndrome, hamming74_decode
part2_equalization.py # TODO: estimate_zf_equalizer, apply_fir_filter, lms_equalizer
utils.py # Teacher-supplied: modulation, channel models, BER, plotting (do not edit)
test_environment.py # Checks Python version + required packages
grading/
test_part1_coding.py # pytest tests for Part 1 — passes → encode/decode/result file work
test_part2_equalization.py # pytest tests for Part 2 — passes → FIR/ZF/LMS + result files work
calculate_grade.py # Aggregates environment, pytest, report, pylint, bonus scores
check_report.py # Validates REPORT.md against template requirements
results/ # Generated PNGs: coding_ber_curve.png, equalization_eye_comparison.png, equalization_mse_curve.png
```

## Key constraints when editing student stubs

- All functions operate on NumPy arrays; input validation is already provided in the stubs — keep it.
- The `utils.py` module is pre-supplied and must not be modified. Import from it rather than reimplementing.
- Generated plots must land in `results/` with exact filenames: `coding_ber_curve.png`, `equalization_eye_comparison.png`, `equalization_mse_curve.png`.
- The grading CI runs on `pull_request_target` and requires exact function signatures matching the stubs.

## Math context

- **Hamming(7,4)**: systematic code with G (4×7) and H (3×7) matrices defined at module level. Encoding = bits @ G mod 2. Syndrome = r @ Hᵀ mod 2. Single-error correction via syndrome-to-column matching.
- **ZF equalizer**: solve A @ taps ≈ δ via `np.linalg.lstsq`, where A is the convolution matrix of the channel.
- **LMS equalizer**: FIR weight update w ← w + μ·e[n]·x[n], with e[n] = d[n] − wᵀx[n].
80 changes: 80 additions & 0 deletions REPORT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# 无线通信技术实验报告:信道编码与信道均衡

## 1. 实验目的

本实验旨在通过动手实现巩固对信道编码和信道均衡两个核心无线通信技术的理解。具体目标包括:掌握 Hamming(7,4) 线性分组码的编码、伴随式计算和单比特纠错原理;理解多径信道引起的符号间干扰(ISI)及其对通信可靠性的影响;掌握迫零(ZF)均衡和 LMS 自适应均衡的基本实现方法;熟悉使用 GitHub PR 和自动评分系统进行实验提交和评估的流程。

## 2. 实验原理

### 2.1 信道编码

信道编码通过在信息比特中引入冗余来提高传输可靠性。Hamming(7,4) 是一种系统线性分组码,将每 4 个信息比特编码为 7 个码字比特,码率为 4/7。编码过程使用生成矩阵 G(4×7)在 GF(2) 上进行矩阵乘法,其中前 4 列为单位矩阵(系统码),后 3 列为校验位。

伴随式(syndrome)是接收码字与校验矩阵 H 转置的乘积模 2,即 s = r·H^T mod 2。若伴随式为零向量,认为接收码字无误;若非零,则伴随式与 H 的某一列匹配,该列索引即错误比特位置。通过翻转该位置比特即可实现单比特纠错。相比未编码传输,Hamming(7,4) 在低误码率下可获得编码增益,但当信道误码率过高时,多比特错误可能导致译码失败,编码增益消失。

选做部分实现了 (2,1,3) 卷积码和 Viterbi 硬判决译码。卷积码通过移位寄存器和模 2 加法器产生连续编码序列,生成多项式 g1=111(八进制 7)和 g2=101(八进制 5)。Viterbi 算法以汉明距离为路径度量,在网格图上搜索最小度量路径实现最大似然序列估计。

### 2.2 信道均衡

多径传播导致接收信号为发送信号经多条不同延迟路径叠加的结果,在时域上造成前后符号相互干扰,即 ISI(符号间干扰)。均衡器的目标是对接收信号进行滤波,使均衡后的信号尽可能接近原始发送信号。

ZF(迫零)均衡通过求解线性方程组 A·w = δ 来设计 FIR 均衡器系数,其中 A 是信道冲激响应的卷积矩阵,δ 是以中心位置为 1 的目标冲激响应。ZF 均衡器试图完全消除 ISI,但当信道频率响应存在深衰落时可能放大噪声。

LMS(最小均方)自适应均衡不需要显式信道估计,通过训练序列迭代更新均衡器系数。每次迭代中,均衡器输出 y[n] = w^T·x[n],误差 e[n] = d[n] - y[n],权值更新为 w ← w + μ·e[n]·x[n],其中 μ 为步长。LMS 算法计算简单,能自适应跟踪信道变化,但收敛速度和稳态误差受步长影响。

## 3. 实验环境

- Python 版本:3.14.4
- 主要依赖:NumPy、SciPy、Matplotlib、pytest、pylint
- AI 助手使用情况:使用 Claude Code AI 辅助实现核心编码和均衡函数,包括 Hamming(7,4) 编解码、伴随式计算、ZF/LMS 均衡器设计、卷积码编解码和 Viterbi 译码。AI 生成代码后经人工审查、运行测试验证通过。实验报告在 AI 辅助下完成。

## 4. 实验方法与步骤

### 4.1 Part 1:信道编码

1. 实现 `hamming74_encode`:将信息比特 reshape 为 (N, 4) 矩阵,在 GF(2) 上与生成矩阵 G 相乘,展平输出。
2. 实现 `hamming74_syndrome`:将接收码字与校验矩阵 H 转置相乘并取模 2,得到伴随式矩阵。
3. 实现 `hamming74_decode`:对每个码字计算伴随式,若非零则与 H 各列比较定位错误位并翻转,提取前 4 位信息比特。
4. 生成 4000 个随机比特,在不同误码概率下比较未编码和 Hamming(7,4) 编码的 BER。
5. 选做:实现 (2,1,3) 卷积码编码器(含尾比特)和硬判决 Viterbi 译码器。

### 4.2 Part 2:信道均衡

1. 实现 `estimate_zf_equalizer`:构造信道与均衡器卷积的线性方程组 A·w = δ,用最小二乘法求解均衡器系数。
2. 实现 `apply_fir_filter`:使用 np.convolve 实现 FIR 滤波并截取与输入等长的输出。
3. 实现 `lms_equalizer`:初始化中心抽头为 1,按 LMS 迭代公式更新权值,记录每次迭代误差。
4. 使用 BPSK 调制、多径信道 [0.9, 0.35, -0.25] 和噪声标准差 0.12 生成接收信号,对比 ZF 和 LMS 均衡效果。

## 5. 实验结果

![编码BER曲线](results/coding_ber_curve.png)

![均衡波形对比](results/equalization_eye_comparison.png)

![LMS误差曲线](results/equalization_mse_curve.png)

## 6. 结果分析与讨论

1. **Hamming(7,4) 为什么能纠正单比特错误?** Hamming(7,4) 的校验矩阵 H 具有 3 行 7 列,其 7 列恰好对应 7 种不同的非零 3 维向量。当单个比特出错时,伴随式等于 H 中对应错误位置的列向量,因此可以通过伴随式唯一确定错误位置并翻转纠正。

2. **为什么信道编码会引入冗余并降低码率?** 信道编码在信息比特之外额外传输校验比特,使得总比特数增加。Hamming(7,4) 每 4 个信息比特需 3 个校验比特,码率为 4/7 ≈ 0.57。冗余使得码字之间的最小汉明距离增大,从而获得纠错能力。

3. **ZF 均衡为什么可能放大噪声?** ZF 均衡设计为完全消除 ISI,其频率响应为信道频率响应的倒数。当信道在某些频率处增益接近零(深衰落),均衡器在该频率处增益极大,从而显著放大该频段的噪声分量,导致信噪比恶化。

4. **LMS 的步长过大或过小会出现什么问题?** 步长过大时收敛速度快但稳态误差大,甚至可能导致权值发散不收敛;步长过小时稳态误差小但收敛速度慢,可能无法在有限训练序列内充分收敛。

5. **均衡前后 ISI 有什么变化?** 从实验结果图中的波形对比可以看出,多径接收信号波形因 ISI 而产生明显的畸变和幅度衰减,相邻符号间出现串扰。经 LMS 均衡后,信号波形更接近原始发送符号,ISI 得到有效抑制,BER 从 0.001 降至 0。

## 7. 实验心得

通过本次实验,我对信道编码和信道均衡有了更深入的理解。亲手实现 Hamming(7,4) 编解码让我体会到冗余与纠错能力之间的权衡关系,特别是伴随式如何巧妙地定位错误位置。在均衡部分,ZF 和 LMS 两种方法各有优劣——ZF 实现简单但可能放大噪声,LMS 自适应能力强但对步长敏感。

使用 GitHub PR 和自动评分系统的提交流程规范了实验管理,CI 自动测试即时反馈实现正确性,这种工程化实践很有价值。AI 编程辅助显著提高了编码效率,但对核心算法的理解仍需自己掌握,避免盲目依赖生成结果。

## 8. 参考资料

- 课程课件:第6章 信道编码
- 课程课件:第7章 均衡
- Hamming, R. W. (1950). Error Detecting and Error Correcting Codes. Bell System Technical Journal.
- Viterbi, A. J. (1967). Error Bounds for Convolutional Codes. IEEE Transactions on Information Theory.
- Widrow, B., & Hoff, M. E. (1960). Adaptive Switching Circuits. IRE WESCON Convention Record.
Loading
Loading