卷积码和维特比译码

article/2025/10/6 14:46:10

卷积码

基本概念

卷积码常记为(n, k, N)

  • n n n为模2和相加器的个数
  • N N N为输入移位寄存器的段数(称为约束长度)
  • k k k表示每段有 k k k

编码效率为 R c = k n R_c = \frac{k}{n} Rc=nk

距离特性

  1. 纠错能力的度量:最大的最小距离
  2. 最小距 d min ⁡ d_{\min} dmin:卷积码中长度为 n N nN nN N N N为约束长度)的编码后序列之间的最小汉明距离。
  3. 自由距 d f r e e d_{free} dfree:任意长编码后序列之间的最小汉明距离

表示方法

其实,前面的基本概念看书基本都能理解,但是表示方法确实挺让人费解的,下面捎带解读地介绍卷积码的表示方法。
只介绍常用的树状图和网格图,解析法一般不用。

树状图(以(2, 1, 3)卷积码为例)

见下图。

卷积码编码过程示意

卷积码编码过程示意
输入序列为 M = m 1 m 2 … m j M = m_1m_2\ldots m_j M=m1m2mj,从左往右依次输入。

  1. 在时刻 j j j输入 m j m_j mj,此时寄存器的状态为 m j − 1 m j − 2 m_{j-1}m_{j-2} mj1mj2
  2. 编码过程
    x 1 , j = m j ⊕ m j − 1 ⊕ m j − 2 x_{1,j} = m_j\oplus m_{j-1}\oplus m_{j-2} x1,j=mjmj1mj2
    x 2 , j = m j ⊕ m j − 2 x_{2,j} = m_j\oplus m_{j-2} x2,j=mjmj2

那么当输入序列为 M = 01010101 M = 01010101 M=01010101时,可以得到下面的状态列表。

输入 m j m_j mj当前状态 m j − 1 m j − 2 m_{j-1}m_{j-2} mj1mj2输出 x 1 , j x 2 , j x_{1,j}x_{2,j} x1,jx2,j下一状态 m j m j − 1 m_jm_{j-1} mjmj1
0000000
1001110
0101001
1010010
0101001
1010010
0101001
1010010

简要解释一下。寄存器初始状态为0,按照上述的编码过程,输入 m 0 = 0 m_0 = 0 m0=0时, x 1 , 0 = m 0 ⊕ 0 ⊕ 0 = 0 x_{1,0} = m_0\oplus 0\oplus 0 = 0 x1,0=m000=0 x 2 , 0 = m 0 ⊕ 0 = 0 x_{2,0} = m_0\oplus 0 = 0 x2,0=m00=0,下一状态为 m j m j − 1 = 00 m_jm_{j-1} = 00 mjmj1=00
输入 m 1 = 1 m_1 = 1 m1=1时, x 1 , 1 = m 1 ⊕ 0 ⊕ 0 = 1 x_{1,1} = m_1\oplus 0\oplus 0 = 1 x1,1=m100=1 x 2 , 1 = m 1 ⊕ 0 = 1 x_{2,1} = m_1\oplus 0 = 1 x2,1=m10=1,下一状态为 m j m j − 1 = 10 m_jm_{j-1} = 10 mjmj1=10表格中已标红)。
依此类推,得到整个表格。
为了方便表示,记状态 a : 00 a: 00 a:00;状态 b : 10 b: 10 b:10;状态 c : 01 c: 01 c:01;状态 d : 11 d: 11 d:11
因此可以得到下面的树状图,其中节点表示状态,树杈上所标注的数字表示输出比特。

卷积码树状图
(2,1,3)卷积码树状图表示

简要解释一下。
从最左边开始,初始状态为 a , 00 a, 00 a,00,上面树杈上的蓝色的0表示输入比特,黑色的00表示输出比特 x 1 , 0 x 2 , 0 x_{1,0}x_{2,0} x1,0x2,0,查表格可知,当输入为0,当前状态为00,输出为00时,下一状态仍为00,也就是状态 a a a
再来看第一个 a a a下面的树杈,同样,蓝色的1表示输入比特,黑色的11表示输出比特 x 1 , 1 x 2 , 1 x_{1,1}x_{2,1} x1,1x2,1,查表格可知,当输入为1,当前状态为00,输出为11时,下一状态是10,也就是状态 b b b
后面的树杈也就同理可得了。

:上图不该写成“共 2 j = 16 2^j = 16 2j=16条树杈”,而是每个节点会引出 2 j 2^j 2j条支路。

网格图

其实原理还是一样的,只不过是换了一种表示方法,看起来更简洁而已。将二叉树的上支路(对应输入比特0)用实线表示,下支路(对应输入比特1)用虚线表示,仍然根据表格来确定下一步的状态

至此,卷积码应该就讲清楚了。

维特比译码

根据书上所说,卷积码的译码方法有三种:

  • 维特比译码:性能最佳,硬件实现最复杂;
  • 门限译码:性能最差,硬件简单;
  • 序列译码:性能和硬件介于维特比译码和门限译码之间。

目前应用最广的就是维特比译码

译码原理

首先还是应该介绍译码原理,举例子或者解读只是为了更好的理解原理
在维特比译码算法中,把汇聚在每个节点上的两条路径的对数似然函数累加值进行比较,然后把具有较大对数似然函数累加值的路径保存下来,而丢弃另一条路径,经挑选后低 N + 1 N+1 N+1级只留下 2 N 2^N 2N条幸存路径,选出的路径连同它们的对数似然函数累加值一起被存储起来。
总结来说就是加-比-选,即每级求出对数似然函数累加值,然后两两比较并作出选择。

译码例子(以(2, 1, 3)卷积码为例)

不失一般性,假设编码器输出序列为全0码。假设接收序列为 Y = 001001000000 Y = 001001000000 Y=001001000000,由于输出为全0码,则可知有两个位置发生了错误(两个1)。
用下图表示随着接收序列的串行输入,维特比译码器中各路径的取舍情况。圆圈中的数字表示从起始点到某节点的该路径与接收序列的之间的汉明距最大对数似然函数 = 最小汉明距)。

维特比译码
维特比译码过程的网格图表示

图中画了卷积码的网格图,上支路对应输入0,下支路对应输入1。

图一,根据上面的状态表格,输入0的输出为00,输入1的输出为11,汉明距分别为0,2,标在了支路末端;
图二,同样地,根据状态表格,画出网格图。关注红色路径,输出分别为11,10,对比接受序列 Y Y Y,见图中红色下划线和蓝色下划线,00和11地汉明距为2,10和10的汉明距为0,故红色路径总的汉明距为 2 + 0 = 2 2+0=2 2+0=2,其他路径同理;
图三,前面不变,根据状态表格,这时出现了路径终点重合的情况,因此需要进行比较-选择,每条路径的汉明距也分别标注出来,选择较小的那个(汉明距相同的则任意选),也就是图中红色对勾的那条路径;
依此类推,可得到图十的情况,这时译码过程也就结束了。

补充说明

事实上,在第三步即可断定第一条支路应为 Y = 00 Y=00 Y=00支路,这是因为所有幸存路径都是从同一点出发的(汉明距为0的点)。由此可见,不必等到最后得到唯一一条路径才做出最后的判断,因而也不需要等整个译码序列输入后再加 N − 1 N-1 N1个已知的结束信息。译码器可以以少量时延连续不断地工作,做出基本正确的判断

参考资料

曹志刚,宋铁成,杨鸿文.通信原理与应用 [M].北京:高等教育出版社,2015


http://chatgpt.dhexx.cn/article/Y5xGsHXb.shtml

相关文章

如何通俗地理解卷积?

从数学上讲,卷积就是一种运算。 某种运算,能被定义出来,至少有以下特征: 首先是抽象的、符号化的 其次,在生活、科研中,有着广泛的作用 比如加法: ,是抽象的,本身只是…

【信道编码/Channel Coding】卷积码和Viterbi译码及其MATLAB实现

简介: 这是本专栏信道编码/Channel Coding的最后一站,想对信道编码有一个系统性的认识可以看本专栏的 信道编码的整体框架 一文。而在本篇文章中,将介绍卷积码的基本原理和Viterbi译码的过程,以及其MATLAB实现。为什么是最后一站呢…

不同卷积方法一览(+部分代码)

关键词 卷积方法:2D / 3D / 1x1 /转置/扩张(Atrous)/空间可分/深度可分/平展/分组/混洗分组/逐点分组卷积 卷积网络:全卷积FCN(Fully Convolutional Network),可变形卷积(Deformab…

卷积代码实现

卷积在pytorch中有两种方式,一种是torch.Conv2d(),一种是torch.nn.functional.conv2d(),这两种形式本质都是使用一个卷积操作,下面举例来说明一下这两种卷积方式 import numpy as np import torch from torch import …

最通俗的语言讲解卷积码、码树图、状态图以及维特比译码

什么是卷积码? 卷积码是由伊利亚斯发明的一种非分组码,它更加倾向于纠错,对于实际的性能优于分组码,运算较为简单。 将卷积码记为(n,k,N),码率定义为k/n n是n个比特 k是k个信息位 N是N个信息段 卷积码编码器 组成&#xff1a…

卷积,卷积神经网络,图卷积神经网络中的“卷积”如何理解?

[] 1. 对卷积最朴素的理解 首先我们在教材上看到的卷积公式是 ∫ f ( τ ) g ( x − τ ) d τ \int f(\tau)g(x-\tau)d\tau ∫f(τ)g(x−τ)dτ。对于这个公式的理解,网上有很多讲解视频,都是用一些具体的例子来帮助我们理解卷积的过程。推荐b站上的视…

实现卷积的几种代码方式

目录 摘要 卷积(convolution) 1、pytorch实现 2、对input展开矩阵相乘 3、对kernel展开以及矩阵相乘 转置卷积 1、API实现 2、对kernel矩阵转置矩阵相乘 总结 摘要 卷积的基本元素有着input size、kernel size、stride、padding、group以及dil…

卷积卷积神经网络

文章目录 一、关于卷积(convolution)的直观感受二、卷积在不同领域的应用三、卷积神经网络(CNN)的诞生四、卷积神经网络(CNN)(1)为什么需要卷积层(2)池化&…

MATLAB (n,k,m)卷积码原理及仿真代码(你值得拥有)

卷积码原理介绍 1.基本概念 首先卷积码是一种纠错码,让我们先从大格局出发,去认识卷积码。如图1所示我是先从通信原理书上了解了卷积码的概念,再结合网上部分资料,勉强搞懂,感觉主要需要掌握卷积码编码器、状态图、网…

通信原理学习笔记4:信道编码、分组码、卷积码、现代信道编码(Turbo码、LDPC码、Polar码)

信道编码 / 前向纠错码FEC 思想是在数据中增加冗余信息,即校验码元 / 监督码元,从而检错、纠错 信道编码的优劣评判 首先,最基本的是要追求低差错率 实现纠错很简单,只要多添加冗余信息就好;但实际中,我…

韩信点兵算法:

韩信点兵问题:韩信点兵不足百人,3人一行排列多一人,7人一行排列少两人,5人一行正好, 输出韩信究竟点了多少兵。 使用 math 类的DivRem 方法进行运算。 static void Main(string[] args){///韩信点兵不足百人&#xff…

韩信点兵

韩信点兵&#xff1a; 韩信带1500名兵士打仗&#xff0c;战死四五百人&#xff0c;站3人一排&#xff0c;多出2人&#xff1b;站5人一排&#xff0c;多出4人&#xff1b;站7人一排&#xff0c;多出6人。韩信马上说出人数&#xff1a;1049。 代码实现&#xff1a; <span styl…

韩信点兵(python)

韩信点兵 全部士兵按每行8人站立&#xff0c;剩余7人 全部士兵按每行7人站立&#xff0c;剩余6人 问题&#xff1a;已知每一营士兵人数在1000~2000之间&#xff0c;如何利用循环判断表示出代码逻辑 for num in range (1000,2000):if num % 87 and num %76 and num%65\and num%5…

经典算法--韩信点兵

韩信点兵是一道古代的数学题&#xff0c;题意&#xff1a;韩信点兵不足百人&#xff0c;三人一排多1人&#xff0c;七人一排少2人&#xff0c;五人一排正好。问韩信带兵多少&#xff1f; /*** 韩信点兵&#xff1a;* 韩信带兵不足百人&#xff0c;3人一排多1人&#xff0c;7人一…

枚举算法:韩信点兵。

韩信点兵。韩信在点兵的时候&#xff0c;为了知道有多少名士兵&#xff0c;同时又能保住军事机密&#xff0c;便让士兵排队报数。 按从1至5报数&#xff0c;最末一个士兵报的数为1。 再按从1至6报数&#xff0c;最末一个士兵报的数为5。 再按1至7报数&#xff0c;最末一个士兵报…

java工作流activity_activity 工作流学习(一)

启动流程实例 什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系) 为了演示:在流程图中指定办理人是谁,现在是写死的,表示只能张三能提交请假申请。后面会讲解如何动态指定。 //根据流程定义的Id启动一个流程实…

工作流:一文让你学会使用flowable工作流

1.请假流程图 下图是 一个请假申请的简单流程图 &#xff08;1&#xff09;申请人通过发起流程进行请假申请&#xff0c;给经理发送一个待审批事项&#xff1b; &#xff08;2&#xff09;经理在待办列表选择事项&#xff0c;进行审批&#xff0c;approved同意或者rejected驳回…

jeesite工作流使用

问题&#xff1a;jeesite工作流如何使用&#xff1f; 背景&#xff1a;公司没人熟悉工作流&#xff0c;现在要上线办公系统&#xff0c;请假&#xff0c;加班&#xff0c;报销&#xff0c;预审批&#xff0c;用印&#xff0c;付款等工作流要写&#xff0c;之前有简单版本&…

工作流的大致开发流程

前段时间公司在做一个oa的项目&#xff0c;用到了flowable工作流&#xff0c;刚开始的时候还在纠结于是用activity还是flowable&#xff0c;后来查了相关资料发现flowable的作者之前就是开发activity的作者&#xff0c;只不过后来自己出去又搞了一套就叫做flowable&#xff0c;…

flowable工作流所有业务概念

1.什么是工作流审批 根据本人的理解&#xff0c;就是审批流程管理。 2.什么是flowable 1.官方解释 官方解释如下&#xff1a; Flowable 项目提供了一套核心的开源业务流程引擎&#xff0c;这些引擎紧凑且高效。它们为开发人员、系统管理员和业务用户提供工作流和业务流程管…