【MATLAB源码-第213期】基于matlab的16QAM调制解调系统软硬判决对比仿真,输出误码率曲线对比图。

操作环境:

MATLAB 2022a

1 、算法描述

一、16QAM调制原理

在16QAM(16 Quadrature Amplitude Modulation)调制中,一个符号表示4个比特的数据。这种调制方式结合了幅度调制和相位调制,能够在相同的频谱资源下传输更多的数据。具体来说,16QAM星座图通常为4x4矩阵,每个信号点的实部和虚部的值分别取自集合{-3, -1, 1, 3},从而形成16个不同的信号点,每个点对应一个唯一的4比特二进制序列。

二、信号的生成与调制

在我们的系统中,首先生成一个长度为100000比特的随机二进制数据序列。然后,这个序列被分割成每组4个比特的数据块,每个数据块将映射到一个16QAM符号。具体的映射方式如下:

  1. 前两个比特决定符号的实部:如果前两个比特是11,则实部为+1;如果是10,则实部为+3;如果是01,则实部为-1;如果是00,则实部为-3。
  2. 后两个比特决定符号的虚部:如果后两个比特是11,则虚部为+1;如果是10,则虚部为+3;如果是01,则虚部为-1;如果是00,则虚部为-3。

通过这种方式,我们可以将二进制数据映射到16QAM符号上。

三、加入噪声

信号在实际传输中会受到噪声的影响。为了模拟这种情况,我们引入了AWGN(加性高斯白噪声)信道。在每个信噪比(SNR)水平下,我们将16QAM符号加上对应的高斯噪声,生成接收的符号。

四、软判决与硬判决

在接收到带有噪声的符号后,需要进行解调,将符号还原成二进制数据。解调方式主要有两种:软判决和硬判决。

软判决

软判决通过计算接收符号与星座图中各个信号点的欧氏距离,选择距离最近的信号点来确定原始数据。具体的步骤如下:

  1. 对于每个接收符号,分别计算其与星座图中所有信号点的距离。
  2. 根据距离选择最接近的信号点。
  3. 根据选择的信号点确定二进制数据。

这种方法利用了信号点之间的距离信息,可以更好地抵抗噪声,通常能获得较低的误码率。

硬判决

硬判决则是根据接收符号的实部和虚部分别进行直接判决,不考虑距离信息。具体的步骤如下:

  1. 对于每个接收符号,直接判断其实部和虚部的值。
  2. 根据实部和虚部的范围,确定对应的二进制数据。例如,实部大于等于0且小于2,则前两个比特为11;实部大于等于2,则前两个比特为10,等等。

这种方法简单直接,但在噪声较大时,误码率可能较高。

五、误码率比较

为了比较软判决和硬判决的性能,我们计算了不同信噪比(SNR)水平下的比特误码率(BER)。具体步骤如下:

  1. 对于每个SNR值,加入对应强度的噪声,生成接收符号。
  2. 分别使用软判决和硬判决进行解调,得到解调后的二进制数据。
  3. 将解调后的数据与原始数据进行比较,计算误码率。

实验结果表明,软判决在各个SNR水平下的误码率均低于硬判决,尤其在较低的SNR下,软判决的优势更加明显。

结论

通过以上描述,我们可以看到,16QAM调制方式通过结合幅度和相位调制,在同样的频谱资源下传输更多的数据。加入噪声后,通过软判决和硬判决两种方式进行解调。软判决利用了符号点之间的距离信息,能够更好地抵抗噪声,通常能获得较低的误码率;而硬判决则简单直接,但在噪声较大时,误码率较高。总体而言,软判决在抗噪声性能上优于硬判决。

2 、仿真结果演示

3 、关键代码展示

4 、MATLAB 源码获取

V

点击下方名片

相关推荐
hopetomorrow11 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull21 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i29 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落32 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜41 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
GIS 数据栈1 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis
Mr.131 小时前
什么是 C++ 中的初始化列表?它的作用是什么?初始化列表和在构造函数体内赋值有什么区别?
开发语言·c++
陌小呆^O^1 小时前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp