matlab仿真 信道编码和交织(上)
(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第八章内容,有兴趣的读者请阅读原书)
clear all
N=10;%信息比特的行数
n=7;%hamming码组长度n=2^m-1
m=3;%监督位长度
[H,G]=hammgen(m);%产生(n,n-m)hamming码的效验矩阵和生成矩阵
x=randi([0 1],N,n-m);%产生比特数据
y=mod(x*G,2);%hamming编码
y1=mod(y+randerr(N,n),2);%在每个编码码组中引入一个随机比特错误
mat1=eye(n);%生成n*n的单位矩阵,其中每一行的1代表错误比特位置
errvec=mat1*H.';%校验结果对应的所有错误矢量
y2=mod(y1*H.',2);%译码
%根据译码结果对应的错误矢量找出错误比特的位置,并纠错
for indx=1:Nfor indx1=1:nif(y2(indx,:)==errvec(indx1,:))y1(indx,:)=mod(y1(indx,:)+mat1(indx1,:),2);endend
end
x_dec=y1(:,m+1:end);%恢复原始信息比特
s=find(x~=x_dec)%纠错后的信息比特与原始信息比特对比
首先,(7,4)汉明码是指7个码元中携带了4个有效信息,还有三个是冗余位,是用奇偶校验留下来的检错信息。
先从最简单的情况开始,假设我们需要传递的信息为[0 1 0 1],
以偶校验的1,3,4位为例,这三位的数据分别为0 0 1,为了确保加上校验位后有偶数个1,所以校验位为1,后面的1 2 3位,2 3 4位同理。
有了这三个校验位,当四个信息位出现错误的时候,我们可以根据校验位判断错误在什么地方。
可以看到,1,3,4位和1,2,3位中的交集有错,而2,3,4位没错,所以错误只可能出现在1号位
这里我们利用三个校验位的情况,成功的锁定了错误码元的所在位置。
(这里没有讨论出现偶数个码元错误的情况,和校验位错误的情况)
现在回到代码
x是我们产生的数据,其中的每一行可以称其为一组,一组有4个信息码元。
y是编码后的结果,我们一行一行看,绿色区域是每一组的校验位,红色区域是每一组的信息位(红色就是x)
y=mod(x*G,2);
这里的代码意思是x*G得到的矩阵每个元素对2取余,其实就是异或,也就是我们之前在进行校验位的计算时使用的方式
G就是生成矩阵,把之前的我们从4个信息位编码成7个码元的过程用矩阵乘法进行表示
红色部分就是单位矩阵,用来将信息部分原封不动的传进
黄色部分就是产生校验位的部分,信息码元与它进行矩阵乘法再异或后就能得到上述的校验位。
这样就解释了为什么x*G再取异或后就能实现编码过程。
接下来来看解码过程,解码需要用到校验矩阵H
y2=mod(y1*H.',2);%译码
可以发现,由于在编码过程中的设计,在乘上H’之后,如果没有错误的情况下,得到的矩阵中元素全都为0
现在我们假设信息码元中出现了一位错误。在解码之后得到的矩阵元素不全为0,证明有错误,我们需要用我们得到的 [0 ,1,1]找到错误出现的位置
总结:译码的结果并不是原始数据,而是表示错误情况的向量(矩阵)(y2),如果矩阵(y2)全为0 ,证明没有错误,如果不全为0,证明有错误,我们通过逐行比较译码结果(y2)和所有的错误情况(errvec),观察每一行的译码结果与哪一行的errvec相同,得到的errvec的行数,就是y1中出现错误的位数
现在也可以解释为什么说errvec是校验结果对应的所有错误矢量,因为errvec包含了所有含有非0元素(错误的)情况,比对就能得到错误位数
如果译码得到的是0 0 0,自然在errvec中没有对应的情况,也表示y1这一行没有错误,不需要修改。
clear all
N=1000000; %信息比特长度
M=4;%QPSK调制
n=7;%汉明码编码码组长度
m=3;%汉明吗监督位长度
graycode=[0 1 3 2];msg=randi([0 1],N,n-m);%信息比特
msg1=reshape(msg.',log2(M),N*(n-m)/log2(M)).';
msg1_de=bi2de(msg1,'left-msb');%信息比特转化为10进制(1)
msg1=graycode(msg1_de+1);%格雷编码
msg1=pskmod(msg1,M);%qpsk调制
Eb1=norm(msg1).^2/(N*(n-m));%计算比特能量
msg2=encode(msg,n,n-m);%汉明编码(2)
msg2=reshape(msg2.',log2(M),N*n/log2(M)).';
msg2=bi2de(msg2,'left-msb');
msg2=graycode(msg2+1);%汉明编码后的比特序列转化为十进制形式
msg2=pskmod(msg2,M);%汉明码数据进行qpsk调制
Eb2=norm(msg2).^2/(N*(n-m));%计算比特能量
EbNo=0:10;%信噪比
EbNo_lin=10.^(EbNo/10);%信噪比的线性值
for indx=1:length(EbNo_lin)sigma1=sqrt(Eb1/(2*EbNo_lin(indx)));%未编码的噪声标准差rx1=msg1+sigma1*(randn(1,length(msg1))+j*randn(1,length(msg1)));%加入高斯白噪声y1=pskdemod(rx1,M);%未编码QPSK解调y1_de=graycode(y1+1);%未编码的格雷逆映射[err ber1(indx)]=biterr(msg1_de.',y1_de,log2(M));%未编码的误比特率sigma2=sqrt(Eb2/(2*EbNo_lin(indx)));%编码的噪声标准差rx2=msg2+sigma2*(randn(1,length(msg2))+j*randn(1,length(msg2)));%加入高斯白噪声y2=pskdemod(rx2,M);%编码qpsk解调y2=graycode(y2+1);%编码格雷逆映射y2=de2bi(y2,'left-msb');%转换为二进制形式y2=reshape(y2.',n,N).';y2=decode(y2,n,n-m);%译码[err ber2(indx)]=biterr(msg,y2);%编码的误比特率endsemilogy(EbNo,ber1,'-ko',EbNo,ber2,'-k*');legend('未编码','Hamming(7,4)编码')title('未编码和hamming(7,4)编码的QPSK在AWGN下的性能')xlabel('Eb/N0');ylabel('误比特率')
(1):这里的转化为10进制是为了将二进制的信号转化为0-3的4进制情况,这样就可以进行格雷编码,进而qpsk调制
(2) encode和decode编译码本质上就是例8.1中的过程,这里使用现成的函数可以直接实现编译码
相关文章:

matlab仿真 信道编码和交织(上)
(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第八章内容,有兴趣的读者请阅读原书) clear all N10;%信息比特的行数 n7;%hamming码组长度n2^m-1 m3;%监督位长度 [H,G]hammgen(m);%产生(n,n-…...

基于YOLOv8的高压输电线路异物检测系统
基于YOLOv8的高压输电线路异物检测系统 (价格88) 包含 【“鸟窝”,“风筝”,“气球”,“垃圾”】 4个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数…...

23款奔驰GLS450加装原厂电吸门配置,提升车辆舒适性和便利性
今天是一台22款奔驰GLS450,车主是佛山的 以前被不良商家坑了 装了副厂的电吸门 刚开始就很正常 用了半年之后 就开始开不了门,被锁在里面,刚开始车主以为是零件坏了 后来越来越频繁,本来是为了家里老人小孩关门方便而升级的&#…...
git操作流程笔记
1、在本地项目文件夹右击鼠标点击Git Bash Here 2、输入git init,这个目录变成git可以管理的仓库,会出现一个.git文件夹,如果没出现的话需要选择“显示隐藏文件”(不会的同学自行百度一下) 3、绑定本地仓库与远程仓库…...

【QT】常用控件-上
欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 目录 👉🏻QWidgetenabledgeometryrect制作上下左右按钮 window frame 的影响window titlewindowIcon代码示例: 通过 qrc 管理图片作为图标 windowOpacitycursor使用qrc自…...

帮助网站提升用户参与度的5个WordPress插件
仅靠编写精彩的内容、设计精美的图像和创建简化的客户旅程不足以提高网站参与度。您需要让用户在首次访问后继续与您的网站互动并成为回访者,才能真正吸引您所追求的兴趣。 幸运的是,对于 WordPress 用户来说,有数百种工具可用于提高用户参与…...
理解 Python 中的 @wraps:保留函数元数据
一.介绍 在本文中,我们将了解 wraps。在 Python 中使用装饰器时,您可能会遇到原始函数的元数据丢失的情况。这时,functools 模块中的 wraps 装饰器就可以派上用场了。让我们深入了解 wraps 的作用及其重要性。 二.简单装饰器的问题 首先&a…...

cjson
文章目录 概述编译cjson_test 小结 概述 在网络传输中,网络数据序列化,常用的有那么几种,json,protobuf都是很常用的,这一篇来写下json。 Json常用的有几个,rapidjson,jsoncpp,还有…...
Docker data root 目录更改
有时候受限于系统根目录空间的限制,需要将 docker data root 目录更改为其它目录,如单独挂载一个磁盘或存储。本篇文章介绍如何操作。 修改docker 工作目录 修改配置文件/etc/docker/daemon.json(在19.x 版本之前使用grapth) {&q…...

[CR]厚云填补_SEGDNet
Structure-transferring edge-enhanced grid dehazing network Abstract 在过去的二十年里,图像去雾问题在计算机视觉界受到了极大的关注。在雾霾条件下,由于空气中水汽和粉尘颗粒的散射,图像的清晰度严重降低,使得许多计算机视觉…...

图-基础概念
是什么 图是一种抽象的数据类型,在图中的数据元素通常称作节点,V是所以定点的集合,E是所有边的集合 图的分类 有向图 如果两个订单v,w,只能由v向w,而不能w向v,那么我们就把何种情况叫做一个从…...

Javascript前端基础面试(十)
MVVM Vue MVVM这一篇就够啦!_vue r mvvm-CSDN博客 点容器内的图标,图标边框变成border 1px solid red,点空白处重置 <div id"container"> <img src"icon.png" alt"Icon" class"icon"> <!…...

书生大模型实战营闯关记录----第五关:LlamaIndex+Internlm2 RAG实践Demo:效果对比,文档加载,向量库构建,检索器,模型推理
文章目录 1. 前置知识RAG背景RAG 效果比对 2. 环境、模型准备2.1 配置基础环境2.2 安装 Python环境和依赖包2.3 下载 Sentence Transformer 模型2.4 下载 NLTK 相关资源 3. LlamaIndex HuggingFaceLLM4. LlamaIndex RAG加载文档构建向量存储索引库检索器RAG代码 5. LlamaIndex …...

如何使用极狐GitLab CI/CD Component Catalog?【上】
极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…...

详解Xilinx FPGA高速串行收发器GTX/GTP(3)--GTX的时钟架构
目录 1、参考时钟 2、时钟方案 2.1、单个外部参考时钟驱动单个QUAD中的多个transceiver 2.2、单个外部参考时钟驱动多个QUAD中的多个transceiver 2.3、同一个Quad中,多个GTX Transceiver使用多个参考时钟 2.4、不同Quad中,多个GTX Transceiver 使用多个参考时钟 3、QP…...

简单搭建dns服务器
目录 一.安装服务 二.编写子配置文件 三.编写主配置文件 四.编写文件 五.重启服务测试 配置端:IP地址为172.25.254.100、主机名为node1.rhel9.org 测试端:IP地址为172.25.254.101、主机名为node2.rhel9.org 一.安装服务 [rootnode1 ~]# dnf inst…...
大数据进阶(Advanced Big Data)
大数据进阶(Advanced Big Data) 目录 引言大数据架构 Lambda架构Kappa架构 大数据技术栈 数据采集与预处理数据存储与管理数据处理与分析数据可视化与展示 大数据分析方法 机器学习深度学习自然语言处理图数据分析 大数据在工业中的应用 制造业能源管理…...
微信小程序开发优惠券制作源码
微信小程序开发优惠券制作源码。制作一个自带流量的小程序商城,功能强大玩法新,轻松实现引流,推广,卖货,分销,会员管理,直播等多种功能需求需要哪些编辑代码源码呢?http://m.bokequ.com/list/124-2.html 代码分享 <!DOCTYPE HTML> <html xmlns"http://www.w3.o…...
mongodb的安装操作记录
mongodb的安装操作记录 1 上传软件包,并解压 [rootmonitor local]# tar -xvf mongodb-linux-x86_64-rhel70-7.0.12.tgz mongodb-linux-x86_64-rhel70-7.0.12/LICENSE-Community.txt mongodb-linux-x86_64-rhel70-7.0.12/MPL-2 mongodb-linux-x86_64-rhel70-7.0.1…...

C++客户端Qt开发——多线程编程(二)
多线程编程(二) ③线程池 Qt中线程池的使用 | 爱编程的大丙 1>线程池 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...