纯手写底层算法的2ASK调制与噪声滤波失真分析系统
项目简介
本项目是一个完全基于MATLAB基础数学运算与逻辑控制实现的二进制振幅键控(2ASK)数字通信仿真系统。项目的核心宗旨是并不依赖MATLAB内置的通信工具箱(Communications Toolbox)或信号处理工具箱(DSP System Toolbox),而是通过手写底层算法来重现基带信号生成、频谱搬移、高斯白噪声生成以及离散卷积滤波的全过程。
系统特别设计了一个基于“滑动平均”原理的手写滤波器,旨在直观呈现滤波器特性(如群时延、边缘平滑效应)导致的波形失真现象,为深入理解通信原理、信号与系统及底层数值计算提供了严谨的代码参考。
主要功能特性
- 全流程手写实现:摒弃
rectpulse, awgn, filter, conv, upsample 等高级函数,全部功能通过数组操作、循环迭代和基础数学函数实现。 - 手动基带生成:通过随机数逻辑判断生成比特流,利用嵌套循环构建单极性不归零(NRZ)矩形脉冲。
- 数学级调制解调:直接通过正弦函数点乘实现信号的频谱搬移与相干解调。
- Box-Muller噪声模拟:手动实现Box-Muller变换算法,将均匀分布随机数转换为标准正态分布序列,模拟真实的高斯白噪声环境。
- 底层离散卷积滤波:内置手写的卷积算法函数,实现信号与滤波器系数的时域卷积,并配合滑动平均系数设计,演示波形失真与时延。
- 详细的失真分析:通过对比滤波输出与原始基带信号,直观展示码间干扰(ISI)风险、滤波器群时延以及波形由矩形向三角/平滑波形的演变。
系统要求
- MATLAB R2016a 及以上版本(实际代码仅依赖基础MATLAB功能,老版本亦可运行)。
- 不需要安装任何附加工具箱(如 Communications Toolbox, Signal Processing Toolbox)。
实现细节与算法逻辑
本项目的主程序通过线性流程完整模拟了通信系统的各个环节,具体实现逻辑如下:
1. 系统参数初始化
代码首先定义了关键通信参数:
- 码元速率 (Rb):设定为 1000 bps。
- 载波频率 (Fc):设定为 10000 Hz,保证满足载波频率远大于基带带宽的要求。
- 采样频率 (Fs):设定为 200000 Hz,通过高过采样率保证波形模拟的平滑度。
- 信噪比 (SNR):设定为 10 dB,用于计算噪声功率。
2. 基带信号手写生成
- 比特流生成:不使用
randi。利用 rand 生成 0-1 之间的浮点数,通过 if-else 逻辑判断,大于等于 0.5 判为 1,否则为 0。 - 波形构造:不使用
rectpulse。通过双重循环,外层遍历比特位,内层遍历该比特对应的所有采样点,将比特值手动填充到信号数组中,生成标准的单极性不归零波形。
3. 2ASK 调制原理
- 利用基础三角函数
cos(2 * pi * Fc * t) 生成载波信号。 - 执行点乘运算:将基带矩形波与载波直接相乘。当比特为 1 时输出载波,比特为 0 时输出 0 电平,完成信号频谱搬移。
4. 高斯白噪声模拟 (Box-Muller变换)
为了替代
awgn 或
randn,代码实现了 Box-Muller 算法:
- 生成两组独立的均匀分布随机变量 U1 和 U2。
- 应用公式 $Z = sqrt{-2ln(U_1)} cos(2pi U_2)$ 生成服从标准正态分布 $N(0,1)$ 的随机序列。
- 通过循环累加计算已调信号的平均功率。
- 根据目标 SNR 反算所需的噪声方差,对生成的标准正态序列进行幅度缩放,并叠加到信号上。
5. 解调与手写滤波器设计
这是本项目的核心算法展示部分:
- 相干解调:接收信号再次乘以同频同相载波,将频谱搬移回基带(包含 $2f_c$ 高频分量)。
- 手写滤波器系数:设计了一个长度为 60 的滑动平均滤波器(矩形窗),系数全为 $1/60$。这种滤波器具有明显的低通特性,但时域响应较差(拖尾严重),用于故意展示波形失真。
- 手写卷积算法 (
custom_convolution):
* 不调用
conv 函数。
* 定义子函数,通过双重循环实现离散卷积公式 $y[n] = sum x[k] cdot h[n-k]$。
* 外层循环控制输出序列索引,内层循环计算加权和。
*
截断与时移:卷积会导致序列变长并引入延迟。代码手动计算了群时延
Delay = floor((Order-1)/2),并据此对数据进行对齐截取,以保证波形在时间轴上的同步。
*
幅度修正:乘以系数 2,以补偿相干解调过程中造成的 $1/2$ 幅度衰减。
6. 抽样判决与性能评估
- 最佳抽样点:考虑到滤波器的延迟,抽样时刻设定在每个码元周期的中间位置加上滤波器时延。
- 判决门限:设定为 0.5。
- 误码统计:通过循环比较解调比特与原始比特,计算误码率 (BER)。
代码结果分析与可视化
程序运行后会生成一张包含5个子图的综合分析图表:
- 原始基带信号:展示纯净的二进制矩形脉冲序列。
- 2ASK已调信号:展示调制后的高频载波波形,包络清晰反映了基带变化。
- 接收端混合信号:展示叠加了 Box-Muller 高斯噪声后的波形,信号变得“毛糙”。
- 滤波后波形 (失真分析重点):
*
红色实线:手写卷积滤波器的输出。可以看到矩形波变成了类三角波或梯形波,且上升/下降沿变得平滑。这是由于滑动平均滤波器的频域特性是非理想低通导致的。
*
蓝色虚线:原始基带轮廓。通过对比可以清晰观察到滤波带来的
时延以及
波形失真,直观解释了为什么通信系统中需要精心设计成型滤波器(如升余弦)来消除码间干扰。
- 解调判决结果:展示最终恢复的比特流,并标题中显示计算出的误码率。
使用方法
- 打开 MATLAB。
- 将包含代码的脚本文件(通常命名为
main.m)放置在当前工作路径下。 - 直接运行脚本。
- 观察弹出的波形窗口以及命令行输出的误码率统计。
- 用户可以通过修改代码顶部的
FilterOrder(滤波器阶数)参数,观察不同长度的滑动平均窗对信号时延和波形平滑程度的影响。