信道编码及MATLAB仿真

news2024/11/23 13:25:18

文章目录

  • 前言
  • 一、什么是信道编码?
  • 二、信道编码的基本逻辑—冗余数据
    • 1、奇偶检验码
    • 2、重复码
  • 三、编码率
  • 四、4G 和 5G 的信道编码
    • 1、卷积码
    • 2、维特比译码(Viterbi)—— 概率译码
    • 3、LTE 的咬尾卷积码
    • 4、LTE 的 turbo 码
  • 五、MATLAB 仿真
    • 1、卷积码 ploy2trellis 函数
      • ①、无负反馈的函数调用方法
      • ②、有负反馈的函数调用方法
    • 2、生成卷积码,维特比译码(简述)


前言

本文对数字通信技术中的信道编码及译码进行学习记录。

数字通信,就是把一切声音,图像,文字,都变成 0,1 这种二进制代码,这种转换过来的数据,我们可以称之为原始数据 bit 那么,这种原始的 bit,是否可以直接调制,转换成电磁波发送出去呢?答案是不可以,因为电磁波传输过程中,一定会存在于扰噪声,从而产生差错

下图为数字通信系统模型
在这里插入图片描述

数字通信系统模型

一、什么是信道编码?

首先引用书上的定义对信道编码进行一下讲解:

信道编码(Channel Coding)的作用是进行差错控制。数字信号在传输过程中会受到噪声等影响而发生差错。为了减小差错,信道编码器对传输的信息码元按一定的规则加入保护成分(监督码元),组成所谓“抗干扰编码”。接收端的信道译码器按相应的逆规则进行解码,从中发现错误或纠正错误,提高通信系统的可靠性。

下面我们举个例子形象描述一下。
假设,我们把 “你好” 这两个字转换成 0,1 代码,比如用 00 和 01 分别代表你和好,在我们发送 00 时,因干扰原因,导致我们发送的数据变成了 01,那么我们发送的信息本来应该是“你”,而被接收端识别成了“好”,如下图所示:
在这里插入图片描述
我们为了抗干扰,就需要增加一个步骤,来让我们的数据具备“一定程度上纠正干扰产生的差错的能力”,这个步骤就叫信道编码

二、信道编码的基本逻辑—冗余数据

在进行信道编码时,需要增加冗余数据来达到抗干扰的效果,以下图为例,在运输花瓶时,为避免花瓶运输路途中破碎,我们增加一个泡沫箱子,再打包后通过快递进行发送,这里面的泡沫箱子及顺丰快递箱子就可以类似于冗余数据。
在这里插入图片描述
我们这里列举一些常用的冗余数据。

1、奇偶检验码

原始数据 100101100

  • 奇校验:1001011001,校验位为 1,让 1 的总数变成奇数 5
  • 偶校验:1001011000,校验位为 0,让 1 的总数保持为偶数 4

增加的 1bit 位,为校验位,也就是冗余 bit

假设使用奇校验:1001011001

  • 传输过程中,错 1 位:1011011001,可以发现错误
  • 传输过程中,错 2 位:0011011001,发现不了错误

奇偶校验码只具备检错的能力,而不具备纠错能力

2、重复码

原始信息 1 或者 0
编码

  • 1 ——> 111
  • 0 ——> 000

当受到干扰导致错 1 位的时候,可以达到纠错的效果
在这里插入图片描述
当受到干扰导致错 2 位的时候,不可以达到纠错的效果
在这里插入图片描述

三、编码率

R = K / N R=K/N R=K/N
K K K:有用 bit 数据
N N N:编码后的 bit 数据

以前面的码为例,原始数据 100101100 共 9 bit,奇校验: 1001011001 共 10 bit,编码率 R = 9 / 10 = 0.9 R=9/10=0.9 R=9/10=0.9

重复码编码率 R = 1 / 3 R=1/3 R=1/3

  • 1/3 编码,表示 3 个编码后的比特中,包含 1 个有效比特;
  • 1/4 编码,表示 4 个编码后的比特中,包含 1 个有效比特;

编码率越低,包含的几余信息越多,纠错的能力越强,抗干扰的能力越强,传输的有效数据越小

四、4G 和 5G 的信道编码

4G 的信道编码包括卷积码和 turbo 码,5G 的信道编码包括 polar 和 ldpc 码。
在这里插入图片描述

1、卷积码

卷积码一般使用 n , K , N n,K,N nKN表示卷积编码器。

  • K K K 表示:输入的 K 个 bit (需要编码的原始 bit 数
  • n n n 表示:输出的 n n n 个 bit 编码后的 bit 数
  • 编码率 R = K / n R=K/n R=K/n
  • N N N:编码约束度 (实际上就是寄存器的个数)

卷积码将 K K K 个信息码元编为 n n n 个码元时,这 n n n 个码元不仅与当前的 K K K 个信息有关,也与前面的 N − 1 N-1 N1 段信息有关

参考下面的例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、维特比译码(Viterbi)—— 概率译码

维特比译码是根据接收序列,在网格图上找出一条与接收序列汉明距离最小的一种算法

汉明距离 Hamming:两个码组对应码位上具有不同二进制码元位数,为两码组的距离,简称码距
举个例子:
码 1:000
码 2:101
这两个码的码距为 2

下面我们继续举个例子:

  • 假设发送信息位是 1101
  • 编码后发送的序列为 111 110 010 100
  • 接收序列:111 010 010 110

注意:上面接收序列由于干扰导致出现了差错,现在我们看一下维特比译码是如何纠错的

每一种序列,都是网格图上的一条路径,0 用实线,1 用虚线
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因此,最后解码序列为:111 110 010 100,达到了纠错的效果

如果更复杂的,可能会出现有两个汉明距离,那么我们就会随机选作为它的译码,导致出现错了,这也就是为什么维特比译码叫做概率译码

3、LTE 的咬尾卷积码

在这里插入图片描述

4、LTE 的 turbo 码

在这里插入图片描述

五、MATLAB 仿真

1、卷积码 ploy2trellis 函数

ploy2trellis 函数有两种调用形式:

trellis=poly2trellis(ConstraintLength,CodeGenerator);
trellis=poly2trellis(ConstraintLength,CodeGenerator,...FeedbackConnection)

后者应用于有负反馈的情形

ploy2treliis 顾名思义:多项式 ploy 到网格图 trellis
卷积码的生成多项式可以由一系列多项式描述,我们将多项式转化为 trellis 结构,这种结构又可以作为 matalb 中线形卷积编码函数 convenc 和或者其解码(如 Viterbi 解码函数 vitdec)的输入。

①、无负反馈的函数调用方法

在这里插入图片描述

  • (3,2,4)卷积码,2 进 3 出,记忆长度(约束长度)L=max{4,3}+1=5
  • 输入数据共两个对应两行寄存器,第一行有 4 个移位寄存器,第二行 3 个,分别对应约束长度(4+1,3+1)=(5,4)。那么 ConstraintLength 就应该是[5,4]。
  • 第一位输出由第一行寄存器的“贡献”(生成序列)为(10,011)=23
  • 第二位输出由第一行寄存器的“贡献”(生成序列)为(11,101)=35
  • 第三位输出由第一行寄存器的“贡献”(生成序列)为(00,000)=0

==========================================================

  • 第一位输出由第二行寄存器的“贡献”(生成序列)为(0,000)=0
  • 第二位输出由第二行寄存器的“贡献”(生成序列)为( 0,101)=5
  • 第三位输出由第二行寄存器的“贡献”(生成序列)为( 1,011)=13

那么 CodeGenerator 就是[23,35,0; 0,5,13]

运行

trellis=poly2trellis([5,4],[23,35,0;0,05,13])

输出如下:

trellis = 

  包含以下字段的 struct:

     numInputSymbols: 4
    numOutputSymbols: 8
           numStates: 128
          nextStates: [128×4 double]
             outputs: [128×4 double]
  • numInputSymbols: 4
    • 输入状态数
    • 表示两路输入共有 4( 2 k 2^k 2k k k k为输入的路数)种状态分别为 00,01,10,11
  • numOutputSymbols: 8
    • 输出状态数
    • 表示输出共有 8( 2 n 2^n 2n n n n为输出的路数)种状态分别为 000,001,010,011,100,101,110,111
  • numStates: 128
    • 寄存器状态数
    • 当前状态数是 128( 2 7 2^7 27,7 是寄存器的总个数) 状态是 7 为二进制数
  • nextStates: [128x4 double]
    • 下一个状态
    • nextState 是 numStates-by-2k 的矩阵。他表示所有当前状态和当前输入组合所产生的下一状态。相当于马尔科夫链的状态转移表。行表示各种不同的当前状态,依次表示从全 0 状态到全 1 状态。
  • outputs: [128x4 double]
    • 输出
    • outputs 也是 numStates-by-2k 的矩阵。他表示所有当前状态和当前输入组合所产生的输出(8进制表示)。行和列的意义的nextState相同。
>> trellis.nextStates(1:5,:) 

ans =

     0    64     8    72
     0    64     8    72
     1    65     9    73
     1    65     9    73
     2    66    10    74

上面我们列出了nextStates的 1-5 行

  • (1,1)的元素表示在全 0 状态(0000000)时,输入 00 时的下一个状态还是全 0(0000000),即所有的寄存器的结果还都是 0;
  • (1,2)的元素表示在全 0 状态(0000000)时,输入 01 时的下一个状态是 64(1000000)
    ……
  • (2,1)的元素表示在 1 状态(0000001)时,输入为 00 时的下一个状态时全 0(0000000)
    ……

②、有负反馈的函数调用方法

考虑如下卷积码生成图
在这里插入图片描述

  • 同理,记忆长度(约束长度)L=4+1=5,生成
  • 第一位输出由寄存器的“贡献”(生成序列)为(11,111)=37
  • 第二位输出由寄存器的“贡献”(生成序列)为(11,011)=33
  • 那么 CodeGenerator 就是 [37,33]
  • 负反馈多项式为为(11,111)=37

运行

trellis = poly2trellis(5,[37 33],37)

输出如下:

trellis = 

  包含以下字段的 struct:

     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 16
          nextStates: [16×2 double]
             outputs: [16×2 double]

结构体中的变量含义与第一节一致。

2、生成卷积码,维特比译码(简述)

%编码部分
data = randi([0 1],70,1);%产生一段二进制信息序列
code_data=convenc(data,trellis);%trellis是我们在一或二节产生的网格图,得到卷积码
%译码部分
tbdepth = 34; % 维特比解码器的回溯深度
decodedData = vitdec(codedData,trellis,tbdepth,'trunc','hard');
%验证解码数据是否有错误。
numOfErrorBit=biterr(data,decodedData)

本文学习记录参考:
1、【小白也能看懂】信道编码—卷积码等相关内容
2、卷积码matlab实现之ploy2trellis函数


我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1171610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaspringbootMySQL网上商城系统的设计与实现08789-计算机毕业设计项目选题推荐(附源码)

摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设网上商城系统。 本设…

07.Diffusion Model概述

文章目录 Diffusion Model原理Reverse ProcessDenoise模块Forward Process(Diffusion Process) 文字生成图片by Diffusion Model文字生成图像的常见套路Text EncoderFrchet Inception DistanceContrastive Language-Image Pre-Training(CLIP) DecoderGeneration Model 部分截图…

大数据毕业设计选题推荐-收视点播数据分析-Hadoop-Spark-Hive

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Leetcode实战

我们今天来利用这段时间的学习实操下我们的oj题。 int removeElement(int* nums, int numsSize, int val){int dst0;int src0;while(src<numsSize){if(nums[src]!val){nums[dst]nums[src];}elsesrc;}return dst;}我们这里用用两个下标&#xff0c;src来移动&#xff0c;如果…

抵押贷款巨头 Mr. Cooper 遭受网络攻击,影响 IT 系统

导语 近日&#xff0c;美国抵押贷款巨头 Mr. Cooper 遭受了一次网络攻击&#xff0c;导致该公司的 IT 系统受到影响。这一事件引起了广泛的关注&#xff0c;使得 Mr. Cooper 的在线支付平台无法正常运行。本文将为大家详细介绍这次网络攻击事件的具体情况及其对用户和公司造成的…

Alfred 5 for mac(最好用的苹果mac效率软件)中文最新版

Alfred 5 Mac是一款非常实用的工具&#xff0c;它可以帮助用户更加高效地使用Mac电脑。用户可以学会使用快捷键、全局搜索、快速启动应用程序、使用系统维护工具、快速复制粘贴文本以及自定义设置等功能&#xff0c;以提高工作效率。 Alfred for Mac 的一些主要功能包括&#…

项目实战:根据关键字检索,查找相应的水果

1、在index.html绑定查询点击事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"style/index.css"><script src"…

Python之字符串详解

目录 一、字符串1、转义字符与原始字符串2、使用%运算符进行格式化 一、字符串 在Python中&#xff0c;字符串属于不可变、有序序列&#xff0c;使用单引号、双引号、三单引号或三双引号作为定界符&#xff0c;并且不同的定界符之间可以互相嵌套。 ‘abc’、‘123’、‘中国’…

大数据Doris(十六):Doris表的数据划分

文章目录 Doris表的数据划分 一、Partition 二、 Bucket 三、PROPERTIES 四、 ENGINE Doris表的数据划分 Doris支持单分区和复合分

力扣:有效的括号

自己编写的代码 。 自己的思路&#xff1a; class Solution { private:unordered_map<char,int>symbolValues{{(,1},{),2},{{,4},{},5},{[,8},{],9}, };public:bool isValid(string s) {bool flagfalse;int lenss.length();if (lens % 2 ! 0){flag false;}for…

花了三年时间开发的开源项目,终于500 个 Star 了!快收藏

waynboot-mall 商城项目从疫情开始初期着手准备&#xff0c;到现在已经经过了 3 年多的时间&#xff0c;从项目初期到现在&#xff0c;一个人持续迭代&#xff0c;修复漏洞&#xff0c;添加功能&#xff0c;经历了前端开发工具从 vue2、vue-cli 切换到 vue3、vite 的转变&#…

Spring Security OAuth 2.0 资源服务器— JWT

目录 一、JWT的最小依赖 二、JWT的最基本配置 1、指定授权服务器 2、初始预期&#xff08;Startup Expectations&#xff09; 3、运行时预期&#xff08;Runtime Expectations&#xff09; 三、JWT认证是如何工作的 四、直接指定授权服务器 JWK Set Uri 五、提供 audie…

Linux编译器gcc/g++介绍

gcc/g编译器介绍 编译器的功能就是把代码经过一系列处理变成可执行文件&#xff0c;然后就可以执行文件实现代码的功能。 gcc编译器编译C语言文件&#xff0c;g编译C文件&#xff0c;g也可以编译C语言&#xff0c;但gcc不能编译C文件。 gcc使用方法&#xff1a;gcc [选项] 要编…

【漏洞复现】fastjson_1.2.24_unserializer_rce

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞检测3、漏洞验证 1.5、深度利用1、GetShell 说明内容漏洞编号漏洞名称fastjson 1.2.24 反序列化导致…

vbox虚拟机导出减少体积:压缩VDI文件

前言部分&#xff1a; 网上找了一些virtualBox虚拟机压缩方法&#xff0c;做了测试。虚拟机导出体积有了明显减少。 参考文档&#xff1a;https://blog.csdn.net/mr__bai/article/details/129147223 里面有一些注意事项&#xff0c;包括我在实践时遇到的一些问题&#xff0c;在…

Redis7.x 高级篇

Redis7.x 高级篇 Redis版本发行时间Redis单线程说的是什么东西 Redis版本发行时间 Redis单线程说的是什么东西

微信小程序获取剪切板的内容到输入框中

xml代码 <navigation-bar title"Weixin" back"{{false}}" color"black" background"#FFF"></navigation-bar> <view><input placeholder"请输入内容" name"content" type"text" …

FreeRTOS-定时器\二值信号互斥信号\事件组

FreeRTOS整体知识框架可以参考下文: FreeRTOS整体知识框架 一. FreeRTOS定时器 FreeRTOS定时器 博文路径 FreeRTOS提供了一种软件定时器&#xff0c;用来快速实现一些周期性的操作&#xff0c;并且节约了硬件定时器。不过尽量还是不要做过多的操作&#xff0c;以免影响其他…

文件夹重命名与大小写转换:提高文件检索准确性的技巧

在文件管理中&#xff0c;文件夹的命名和大小写转换是非常重要的操作。正确的文件夹命名和大小写转换可以提高文件检索的准确性&#xff0c;从而提高工作效率和文件管理的便利性。现在来看云炫文件管理器如何进行文件夹重命名和大小写转换的技巧&#xff0c;以帮助您更好地管理…

python 成绩统计,输出及格率和优

题目描述&#xff1a; 小蓝给学生们组织了一场考试&#xff0c;卷面总分为100分&#xff0c;每个学生的得分都是一个0到100的整数。 如果得分至少是60分&#xff0c;则称为及格。如果得分至少为85分&#xff0c;则称为优秀。 请计算及格率和优秀率&#xff0c;用百分数表示&am…