本实验要求学生实现常见的数字调制方式(BPSK、QPSK、16-QAM),生成星座图,并选做性能分析。实验使用 Python + NumPy + Matplotlib,鼓励使用 AI 编程助手(GitHub Copilot / Claude Code)。
实验时长:2小时(120分钟)
- 第一小时:教师讲解和演示
- 第二小时:学生动手实验
提交截止:实验课后7天(下周四 23:59)
- 理解数字调制的基本原理(BPSK、QPSK、16-QAM)
- 实现调制算法并可视化星座图
- 学习使用 AI 编程助手辅助开发
- 熟悉 GitHub 协作流程和自动评分系统
- 使用 Copilot Agent 配置 Python 环境
- Fork 本仓库到个人账号
- Clone 到本地并安装依赖
在 src/modulation.py 中实现 bpsk_modulate() 函数:
- 输入:比特序列
[0, 1, 0, 1, ...] - 输出:符号序列
[+1, -1, +1, -1, ...] - 映射关系:
0 → +1,1 → -1 - 生成星座图并保存到
results/bpsk_constellation.png
在 src/modulation.py 中实现 qpsk_modulate() 函数:
- 每2比特一组
- 格雷码映射:
00 → (1+1j)/√2(45°)01 → (-1+1j)/√2(135°)11 → (-1-1j)/√2(225°)10 → (1-1j)/√2(315°)
- 生成星座图并保存到
results/qpsk_constellation.png
在 src/modulation.py 中实现 qam16_modulate() 函数:
- 每4比特一组
- I/Q 分量取值:
-3, -1, +1, +3 - 生成16个符号的星座图
- 保存到
results/16qam_constellation.png
在 src/demodulation.py 中实现解调函数:
bpsk_demodulate():判决准则qpsk_demodulate():最小欧氏距离判决qam16_demodulate():最小欧氏距离判决
在 src/performance_test.py 中完成性能测试:
- 生成随机比特序列
- 调制 → 添加 AWGN 噪声 → 解调
- 扫描不同 SNR(0~15 dB)
- 绘制 BER vs SNR 曲线(对数坐标)
在根目录创建 REPORT.md,包含:
- 实验目的
- 实验原理(简述BPSK/QPSK/QAM)
- 实验方法与步骤
- 实验结果(插入星座图)
- 结果分析与讨论
- 实验心得与 Copilot 使用体会
- 参考文献
使用 Copilot Agent 自动配置(推荐):
打开 VSCode Copilot Chat,输入:
"请帮我配置 Python 开发环境,需要安装 numpy、scipy、matplotlib"
手动安装(备选):
# 1. 安装 Python 3.8+
# 2. 安装依赖
pip install -r requirements.txt# Fork 本仓库到你的 GitHub 账号
# 然后 Clone 到本地
git clone https://github.com/你的用户名/wireless-modulation-experiment.git
cd wireless-modulation-experiment
# 测试环境
python src/test_environment.py打开 src/modulation.py,使用 GitHub Copilot 辅助完成代码:
提示词示例:
"请实现 BPSK 调制函数,输入是比特序列,输出是符号序列,
其中比特0映射到+1,比特1映射到-1"
运行测试:
python src/modulation.py检查结果:
- 查看
results/目录是否生成了星座图 - 确认图片清晰、坐标轴标注正确
git add .
git commit -m "完成 BPSK 和 QPSK 调制"
git push origin main在 GitHub 网页上创建 Pull Request:
- 访问你的仓库
- 点击 "Pull requests" → "New pull request"
- 填写 PR 描述(说明完成了哪些任务)
- 点击 "Create pull request"
等待 3-5 分钟,GitHub Actions 会自动运行评分脚本。 评分结果会以 Comment 形式显示在你的 PR 下方。
调制实现:
"请用 Python 实现 BPSK 调制,输入二进制序列,
输出复数符号序列,0映射到+1,1映射到-1"
星座图绘制:
"请用 matplotlib 画出 QPSK 的星座图,
四个点在单位圆上均匀分布"
代码调试:
"我的代码报错了:[粘贴错误信息],请帮我找出问题"
代码解释:
"请解释这段代码的含义:[粘贴代码]"
✅ 先理解原理,再使用 AI 生成代码
✅ 生成的代码要仔细阅读理解
✅ 可以让 AI 解释代码的实现逻辑
✅ 遇到错误时,将完整错误信息粘贴给 AI
✅ 尝试修改参数观察结果变化
❌ 不要完全依赖 AI,要培养独立思考能力
❌ 不要直接提交 AI 生成的代码而不理解其含义
| 评分项 | 分值 | 评分细则 |
|---|---|---|
| 环境配置 | 5分 | 成功运行环境测试脚本 |
| BPSK调制 | 25分 | 映射正确(15分) + 星座图(10分) |
| QPSK调制 | 25分 | 映射正确(15分) + 星座图(10分) |
| 16-QAM调制 | 20分 | 映射正确(12分) + 星座图(8分) |
| 解调实现 | 10分 | 正确实现解调算法(选做加分) |
| BER性能 | 10分 | 生成BER曲线并分析(选做加分) |
| 实验报告 | 15分 | 完整性(8分) + 分析深度(7分) |
| 代码质量 | -10~+5分 | pylint评分 > 8.0加分,< 5.0扣分 |
总分:基础任务(0-3+报告)满分75分,选做任务可额外加分20分。
wireless-modulation-experiment/
├── README.md # 本文件
├── REQUIREMENTS.md # 详细任务要求
├── .github/workflows/
│ └── grading.yml # 自动评分工作流
├── docs/
│ ├── theory_bpsk.md # BPSK原理
│ ├── theory_qpsk.md # QPSK原理
│ ├── theory_qam.md # QAM原理
│ └── copilot_guide.md # Copilot使用指南
├── src/
│ ├── modulation.py # 调制函数(学生填充)
│ ├── demodulation.py # 解调函数(学生填充)
│ ├── performance_test.py # 性能测试(学生填充)
│ ├── utils.py # 工具函数(已实现)
│ └── test_environment.py # 环境测试脚本
├── grading/ # 评分脚本(学生不可见)
│ ├── test_bpsk.py
│ ├── test_qpsk.py
│ ├── test_qam16.py
│ ├── check_report.py
│ └── calculate_grade.py
├── examples/ # 示例输出
│ ├── bpsk_constellation.png
│ ├── qpsk_constellation.png
│ └── ber_curve_example.png
├── results/ # 学生结果(自动创建)
├── requirements.txt # Python依赖
├── .gitignore
└── REPORT_TEMPLATE.md # 报告模板
Q1: 我不会用 Git,怎么办?
A: 课上会有 10 分钟的 Git 快速演示,也可以查看 Git 快速入门。
Q2: GitHub Copilot 需要付费吗?
A: 学生可以申请免费使用,访问 https://education.github.com/ 申请。
Q3: 我的代码运行报错,怎么办?
A: 将完整错误信息粘贴给 Copilot 求助,或向教师/助教求助。
Q4: 星座图应该是什么样的?
A: 查看 examples/ 目录中的示例图片。
Q5: 我可以多次提交吗?
A: 可以!在截止时间前可以随意修改和提交,系统会取最后一次评分。
Q6: 选做任务必须做吗?
A: 不是必须的。基础任务满分75分即可及格,选做任务是加分项。
如有问题,请通过以下方式联系:
- 课程群:[课程群号]
- 邮箱:[教师邮箱]
- Office Hours:[时间地点]
祝实验顺利!🎉