MatlabCode

本站所有资源均为高质量资源,各种姿势下载。

您现在的位置是:MatlabCode > 资源下载 > 一般算法 > 纯底层算法实现的2ASK调制与手写滤波器仿真

纯底层算法实现的2ASK调制与手写滤波器仿真

资 源 简 介

本项目旨在通过不调用MATLAB内置通信工具箱(如comm、dsp等)及高级信号处理函数(如filter、awgn等)的方式,完全利用基础数学运算和逻辑编程来实现二进制振幅键控(2ASK)通信系统的全流程仿真。项目详细涵盖了以下功能模块:1. 基带信号生成:通过随机逻辑手动构造二进制比特流及其对应的矩形脉冲序列;2. 2ASK调制:利用正弦函数生成载波,通过点乘运算完成基带信号的频谱搬移;3. 噪声模拟:摒弃内置噪声函数,采用Box-Muller变换或其他概率算法,利用均匀分布随机数手动生成符合高斯分布的白噪声序列,并叠加到调制信号上;4. 手写滤波器:通过编写离散卷积算法(conv)或差分方程迭代循环,实现低通或带通滤波器以滤除噪声;5. 现象分析:重点呈现滤波后的波形输出,针对“波形变形”这一现象,直观展示手动实现的滤波器(可能是由于相位非线性、阶数不足或系数设计问题)对信号时域特征的影响,为深入理解滤波器原理及信号失真机制提供底层代码参考。

详 情 说 明

纯手写底层算法的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变换)

为了替代 awgnrandn,代码实现了 Box-Muller 算法:
  1. 生成两组独立的均匀分布随机变量 U1 和 U2。
  2. 应用公式 $Z = sqrt{-2ln(U_1)} cos(2pi U_2)$ 生成服从标准正态分布 $N(0,1)$ 的随机序列。
  3. 通过循环累加计算已调信号的平均功率。
  4. 根据目标 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个子图的综合分析图表:

  1. 原始基带信号:展示纯净的二进制矩形脉冲序列。
  2. 2ASK已调信号:展示调制后的高频载波波形,包络清晰反映了基带变化。
  3. 接收端混合信号:展示叠加了 Box-Muller 高斯噪声后的波形,信号变得“毛糙”。
  4. 滤波后波形 (失真分析重点)
* 红色实线:手写卷积滤波器的输出。可以看到矩形波变成了类三角波或梯形波,且上升/下降沿变得平滑。这是由于滑动平均滤波器的频域特性是非理想低通导致的。 * 蓝色虚线:原始基带轮廓。通过对比可以清晰观察到滤波带来的时延以及波形失真,直观解释了为什么通信系统中需要精心设计成型滤波器(如升余弦)来消除码间干扰。
  1. 解调判决结果:展示最终恢复的比特流,并标题中显示计算出的误码率。

使用方法

  1. 打开 MATLAB。
  2. 将包含代码的脚本文件(通常命名为 main.m)放置在当前工作路径下。
  3. 直接运行脚本。
  4. 观察弹出的波形窗口以及命令行输出的误码率统计。
  5. 用户可以通过修改代码顶部的 FilterOrder(滤波器阶数)参数,观察不同长度的滑动平均窗对信号时延和波形平滑程度的影响。