信道编码译码及MATLAB仿真(三)

简介: 信道编码译码及MATLAB仿真

信道编码译码及MATLAB仿真(二)/article/1472341


五、MATLAB 仿真

在进行卷积编码的过程中,使用的函数是 convenc() 函数和 vitdec() 函数,同时需要 poly2trellis() 函数。

1、ploy2trellis 函数

先看 poly2trellis() 函数,用来生成卷积编码所需要的网表。ploy2trellis 函数有两种调用形式:

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

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

这个函数相当于定义了编码器中寄存器的结构,一般来说,在查看卷积编码的相关资料中都是类似于(2,1,3)这种结构,但是这个函数只需要两个参数:

  • ConstraintLength参数代表约束长度
  • CodeGenerator 代码生成器,指定为八进制数的KN矩阵、多项式字符向量的KN单元阵列或KN字符串阵列。CodeGenerator 为编码器的 K 个输入比特流中的每一个指定 N 个输出连接。

通俗理解这两个参数的含义和作用,首先约束长度决定了再译码时候的回溯深度的大小,根据不同的编码速率有不同的关系,技术文档中对此有介绍:

根据设定的 nk,和 L 值来确定,如对于 (2,1,3) 结构类型的卷积编码器,其中 rate = k/n = 1/2,对应第一种计算方式,那么回溯深度为 5*(L-1),结果为10,在进行译码的时候利用这个值对齐或者截断,这个在下面使用过程中会有。

回到函数本身,如设计 (2,1,7) 类型的编码器,可以用:

L = 7;
trellis = poly2trellis(L,[171 133]);

其中的第二个参数是 8 进制数据的表现形式,对应二进制为[111_1111, 101_1011]。可以理解为进入1bit数据,输出2bit数据,所以这个是2维的,同时这个7bit每一位代表寄存器的抽头,可以根据这个画出编码器的连接形式。

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])
? 1

输出如下:

trellis = 
  包含以下字段的 struct:
     numInputSymbols: 4
    numOutputSymbols: 8
           numStates: 128
          nextStates: [128×4 double]
             outputs: [128×4 double]
  • numInputSymbols: 4
  • 输入状态数
  • 表示两路输入共有 4(2 k 2^k2kk kk为输入的路数)种状态分别为 00,01,10,11
  • numOutputSymbols: 8
  • 输出状态数
  • 表示输出共有 8(2 n 2^n2nn nn为输出的路数)种状态分别为 000,001,010,011,100,101,110,111
  • numStates: 128
  • 寄存器状态数
  • 当前状态数是 128(2 7 2^727,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、convenc() 函数

再看 convenc() 函数

codedout = convenc(msg,trellis)
codedout = convenc(msg,trellis,puncpat)

简单使用卷积编码就用这个第1种调用方式就可以了,其中

  • msg参数是需要编码的信息,这个需要输入0,1二进制数据。
  • trellis参数就是上面函数生成的结果,传输到这里。

在使用时,需要注意的是 msg 数据的长度要是k的整数倍,同时利用上面的约束长度,计算回溯深度,利用回溯深度在信息后面添加0

3、vitdec() 函数

最后看译码函数

decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype)
decodedout = vitdec(codedin,trellis,tbdepth,opmode,'soft',nsdec)
decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype,puncpat)

译码函数的参数相对校多,主要是需要设置模式:

  • codedin参数是需要译码的结果,模式选择硬判决的时候必须输入是整数,模式选择软判决的时候可以输入小数。
  • trellis参数与编码函数的一致。
  • tbdepth这个参数参数就是回溯深度,前面利用约束长度计算的结果。
  • opmode 这个参数有三个不同的选项,分别为conttermtrunc
  • dectype参数用来设置是硬解码hard还是软解码soft,硬解码输入的数据都是01,软解码可以说输入小数。

有一点需要注意的是,对于termtrunk模式,回溯深度tbdepth必须是一个正整数,并且小于或等于输入编码中的输入符号数,说白了就是在编码前的信息msg长度就得大于等于回溯深度,要不然不够译码的。

这三个参数的差别,term模式下没有延时,就是译码的第一个数据就是编码的第一个数据。trunc参数也没有延时,cont参数有延时,是回溯深度。还有差别就是连续编码的区别。

4、MATLAB 仿真

利用(2,1,7)结构的形式进行卷积编译码,如下是测试代码,选择conthard模式。

close all;
clear;
clc;
msg_source = [randi([0 1],1,50),zeros([1,30])]; % 这行代码生成一个长度为80的随机二进制消息序列。它使用randi函数在0和1之间随机生成50个比特,并在后面添加30个零。
% 这些变量定义了卷积码的编码率。在这个例子中,n表示输出比特数,k表示输入比特数,因此编码率为1/2。
n = 2;
k = 1;
rate = k/n; % rate为 1/2
% 这些变量定义了卷积码的约束长度和回溯深度。在这个例子中,约束长度为7,回溯深度为5*(7-1)=30。
L = 7;
tblen = 5*(L-1); % 回溯深度
trellis = poly2trellis(L,[171 133]); % 使用poly2trellis函数生成一个约束长度为7的卷积码的Trellis结构。生成多项式为[171 133],定义了卷积码的生成过程。
code_data = convenc(msg_source,trellis); % 使用convenc函数对消息序列进行卷积码编码。它将msg_source输入到卷积码编码器中,使用之前生成的Trellis结构,得到编码后的数据序列code_data。
zero=zeros(1,2*tblen);  % 生成一个长度为2*tblen的零向量。
code_data=[code_data(:,1:end),zero]; % 在编码数据的末尾添加了零,以增加解码过程的缓冲区大小
d = vitdec(code_data,trellis,tblen,'cont','hard'); % 使用vitdec函数对编码数据进行卷积码译码。它使用之前生成的Trellis结构和回溯深度,采用硬判决方式进行译码,得到译码后的数据序列d。
d = d(tblen*k+1:end); % 从译码数据中去除多余的部分,保留原始消息序列的长度。
figure(1);
stairs(msg_source(1:end),':*r'); % 绘制原始消息序列的阶梯图,使用红色星号表示
hold on;    % 保持图形窗口的当前内容,以便后续的绘图命令在同一窗口中显示。
stairs(d,':+b');    % 绘制译码后的消息序列的阶梯图,使用蓝色加号表示。
ylim([-0.1,1.1]);
grid on;
legend('原始信息','恢复信息');

仿真结果:

可以看到编码后的 80bit 数据译码后与原数据一一对应。

参考文献:

1、【小白也能看懂】信道编码—卷积码等相关内容

2、卷积码matlab实现之ploy2trellis函数

3、信道编码:MATLAB使用卷积编译码函数

目录
相关文章
|
2天前
|
机器学习/深度学习 算法 安全
m基于Q-Learning强化学习的路线规划和避障策略matlab仿真
MATLAB 2022a仿真实现了Q-Learning算法在路线规划与避障中的应用,展示了智能体在动态环境中学习最优路径的过程。Q-Learning通过学习动作价值函数Q(s,a)来最大化长期奖励,状态s和动作a分别代表智能体的位置和移动方向。核心程序包括迭代选择最优动作、更新Q矩阵及奖励机制(正奖励鼓励向目标移动,负奖励避开障碍,探索奖励平衡探索与利用)。最终,智能体能在复杂环境中找到安全高效的路径,体现了强化学习在自主导航的潜力。
8 0
|
3天前
|
机器学习/深度学习 算法 数据挖掘
基于GWO灰狼优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真
摘要: 本文介绍了使用matlab2022a中优化后的算法,应用于时间序列回归预测,结合CNN、LSTM和Attention机制,提升预测性能。GWO算法用于优化深度学习模型的超参数,模拟灰狼社群行为以求全局最优。算法流程包括CNN提取局部特征,LSTM处理序列依赖,注意力机制聚焦相关历史信息。GWO的灰狼角色划分和迭代策略助力寻找最佳解。
|
3天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
3天前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
9 1
|
3天前
|
数据安全/隐私保护
地震波功率谱密度函数、功率谱密度曲线,反应谱转功率谱,matlab代码
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
3天前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
3天前
|
算法 调度
面向配电网韧性提升的移动储能预布局与动态调度策略(matlab代码)
面向配电网韧性提升的移动储能预布局与动态调度策略(matlab代码)
|
3天前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
|
3天前
|
运维 算法
基于改进遗传算法的配电网故障定位(matlab代码)
基于改进遗传算法的配电网故障定位(matlab代码)

热门文章

最新文章

http://www.vxiaotou.com