前言
卷积码 4G Turbo码就是卷积码
这个模型复杂点要深入理解HMM,这边重点讲一下卷积码定义,编码方案,viterbi译码
,4,5,6是HMM的参考部分可以忽略。
Short description of the Viterbi Algorithm without equations using a trip planning example. Correction: Viterbi first published this in 1967, not 1968 as stated in the video. Here is the original reference: Andrew J. Viterbi, "Error Bounds for Convolutional Codes and an Asymptotically Optimum Decoding Algorithm," IEEE Trans. Information Theory, vol. 13, pp. 259-260, April 1967. Also see the seminal paper by David Forney showing several applications of the Viterbi Algorithm: G. D. Forney, Jr., "The Viterbi Algorithm," Proc. IEEE, Mar. 1973, pp. 268-278.
参考:
【小白也能看懂】信道编码---卷积码等相关内容_哔哩哔哩_bilibili
快速画出卷积码的状态图、码树图与网格图_哔哩哔哩_bilibili
目录:
1: 定义
2: 常用编码方案
3: 译码
4: HMM 回顾
5: 概率计算问题
6: 预测问题(Viterbi)
一 定义
卷积码将n个信息码元编码成长度为n的码字,这个n码字不仅仅与k个信息元有关
也与前面N-1段信息元有关
使用(n,k,N)表示卷积编码器
k: 输入的k个bit
n: 编码输出的n 个bit
N: 编码约束度(移位寄存器个数)
码率
二 常用编码方案
2.1 框图
以(3,1,3)为例,如下图
输入:
每次输入1个bit a
移位寄存器b右移1位
输出
例: 输入信息元为1011
移位寄存器初始化状态为000
2.2 码树图
后面的网格图就是基于码数图的原理生成的。
根据当前移位寄存器的内容定义4种状态:
a[00], b[10], c[01], d[11]
根据上面的码树图如下
原理
假设输入后,当前状态为C:
那么移位寄存器状态有两种[001] [101]
当为001[ ]
编码后
[011]
因为下一次输入后,寄存器要移位所以寄存器状态变成,即状态a
依次类推得到上面的码树图
2.2 树状图
分支代表当前输入,节点代表当前输出
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 29 10:57:01 2022
@author: chengxf2
"""
import numpy as np
class turbo():
def __init__(self,n=3,k=1,N=3):
self.n = n #编码后长度
self.k = k #输入信息长度
self.N = N #寄存器个数
'''
移位寄存器移位
'''
def shift(self, bit):
for i in reversed(range(1,self.N)):
self.Reg[i]=self.Reg[i-1]
self.Reg[0]= bit
def modules(self):
c1 =self.Reg[0]
c2 = self.Reg[0]+self.Reg[2]
c3 = self.Reg[0]+self.Reg[1]+self.Reg[2]
c2 = int(c2%2)
c3 = int(c3%2)
return [c1,c2,c3]
def Encode(self,bits):
num = len(bits)
self.Reg = [0]*self.N
for i in range(num):
bit = bits[i] #每次只进一位bit
self.shift(bit)
c= self.modules()
print(c)
if __name__ =="__main__":
bits= [1,1,0,1]
demon = turbo()
demon.Encode(bits)
2.3 网格图
根据前面的码树图很容易得到网格图
每个分支代表一条路径
三 Viterbi 译码
维特比译码是根据接收序列,在网格图上找出一条与接收序列汉明距离最小的
算法。
viterbi 思想:
如果最优路径在时刻t通过结点,那么这一路径从结点
到终端的部分路径,对于到的所有可能的部分路径,必须是最优的。
假如不是这样,那么从到 就会有另外一条更好的路径存在,如果把它和
从到的部分路径连接起来,就会形成一条比原来更优的路径,这是矛盾的。
如上图到点的距离都是3,但是到起始点的最短路径是4
假设最短路径经过,则必然经过到起始点的最短路径
例:
最后最短路径为
:2
111-110 -010-100
Turbo 码更加复杂一点,后面会单独章节讲解Turbo 码
四 HMM(隐马尔可夫模型)
3.1 模型
Hidden Markov model 是统计学里面最基础的一个模型,应用非常广泛.
描述由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由
各个状态生成一个观测而产生观测随机序列的过程。
隐藏马尔科夫链随机生成的状态序列,称为状态序列(state sequence)
每一个状态产生一个观测,由此产生了观测随机序列,称为观测序列(obeservation sequence)
Q 是所有可能的状态集合
V 是所有可能的观测集合
A 是状态转移概率矩阵
B 观测概率矩阵
是初始状态概率向量
隐马尔科模型可以用
表示
3.2 状态序列生成过程
观测序列生成过程:
输入
隐马尔可夫模型HMM,观测序列长度T
输出
观测序列
流程
1 按照初始分布 ,产生状态序列
2 令 t =1
3 按照状态的观测概率分布 生成
4 按照状态的状态转移概率分布 产生新的状态
5 令t=t+1; 如果t<T 转步3,否则终止
3.3 HMM 3个基本问题
1 概率计算问题:
1 概率计算问题
给定模型和观测序列O,计算
2 学习问题:
已知观测序列,估计模型参数
使得最大
3 预测问题 decoding 解码问题:
已知模型
和观测序列,求对给定观测条件概率
最大的状态序列 ,即给定观测序列,最有可能的状态序列
我们前面讲的卷积码
因为,可以把它当初观测序列
是状态序列
五 概率计算问题
4.1 直接计算法
给定模型 和 t时刻的观测序列
计算O 出现的概率
1: 计算状态序列的概率
2 计算观察序列概率
3 计算联合概率
4 对所有可能的状态序列求和,得到观察序列O的概率
4.2 前向算法
定义:
给定HMM的模型,定义到时刻t部分观测序列为且状态为
的概率为前向概率,记作
可以递推求得前向概率,以及观测序列
算法2:(观测序列概率的前向算法)
输入:
HMM模型,观测序列
输出:
观测序列概率
初值:
递推
终止:
4.3 后向算法
给定HMM模型,定义在时刻t状态为的条件下,从t+1到T的部分观测序列为
的概率为后向概率
算法3: 观测序列概率的后向算法
输入:
HMM模型,观测序列O
输出:
观测序列概率
初始化
递归
t= T-1,T-2,...,1
4.4 常用概率与期望计算
( 简化掉)
1: 给定模型和观测序列O,在时刻t处于状态的概率
根据贝叶斯公式
其中
2 给定模型和观测序列O,在时刻t处于状态且在时刻t+1处于状态的概率,记
六 预测算法
已知模型和观测序列 ,求对给定观测序列条件概率
最大的状态序列
动态规划原理
最优路径具有以下特征:
如果最优路径在时刻t通过结点,那么这一路径从结点
到终端的部分路径,对于到的所有可能的部分路径,必须是最优的。
假如不是这样,那么从到 就会有另外一条更好的路径存在,如果把它和
从到的部分路径连接起来,就会形成一条比原来更优的路径,这是矛盾的。
定义
在时刻t状态为i的所有单个路径中的概率最大值
定义在时刻t状态为i的单个路径中概率最大的路径的第
个结点为:
输入:
给定模型,和 观测
输出:
最优路径
初始化
递推 t=2,3...T
终止
最优路径回溯:
t=T-1,T-2,..1