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

news2024/12/24 10:21:01

信道编码:MATLAB 使用Conv函数

1. 相关函数

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

1.1 poly2trellis()函数

先看poly2trellis()函数,用来生成卷积编码所需要的网表。

trellis = poly2trellis(ConstraintLength,CodeGenerator)

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

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

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

计算回溯深度

根据设定的n,k,和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每一位代表寄存器的抽头,可以根据这个画出编码器的连接形式。

有了这些概念就可以使用这个函数了。

1.2 convenc()函数

再看convenc()函数

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

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

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

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

1.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 这个参数有三个不同的选项,分别为cont,termtrunc
  • dectype参数用来设置是硬解码hard还是软解码soft,硬解码输入的数据都是01,软解码可以说输入小数。

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

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

下面用程序看具体的区别。

2.使用方法

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

close all;
clear;
clc;

msg_source = [randi([0 1],1,50),zeros([1,30])];  % 一共10e4个点 
n = 2;
k = 1;
rate = k/n; % rate为 1/2
L = 7;
tblen = 5*(L-1); % 回溯深度
trellis = poly2trellis(L,[171 133]);

code_data = convenc(msg_source,trellis);

d = vitdec(code_data,trellis,tblen,'cont','hard');

figure(1);
stairs(msg_source(1:end-30),':*r');
hold on;
stairs(d(31:end),':+b');
ylim([-0.1,1.1]);
grid on;
legend('原始信息','恢复信息');

得到的实验结果为:
卷积编码前后信息对比

当译码函数在使用term模式的时候

close all;
clear;
clc;
msg_source = [randi([0 1],1,50),zeros([1,30])];  % 一共10e4个点 
% msg_source2 = [randi([0 1],1,50),zeros([1,30])];  % 一共10e4个点
n = 2;
k = 1;
rate = k/n; % rate为 1/2
L = 7;
tblen = 5*(L-1); % 回溯深度
trellis = poly2trellis(L,[171 133]);

code_data = convenc(msg_source,trellis);

d = vitdec(code_data,trellis,tblen,'term','hard');

figure(1);
stairs(msg_source(1:end),':*r');
hold on;
stairs(d(1:end),':+b');
ylim([-0.1,1.1]);
grid on;
legend('原始信息','恢复信息');

此时的到的结果为:

卷积编码前后信息对比

从上图中可以看出来,译码之后的信息直接从第一位开始,不需要利用回溯深度来截断之后对比数据,但是这种模式适用的情况是需要编码的信息后面存在足够的多的0数据才可以,当把上一段的代码中的原始数据msg_source后面的30个0,改为20个1时

msg_source = [randi([0 1],1,50),ones([1,30])];

得到的试验结果为:

卷积编码前后信息对比

可以发现虽然译码的结果可以从与原始数据从第1位对齐,但是最后的数据会出现错误。

在测试连续编码的情况:对两段信息分别编码,然后把编码后的信息拼接在一起进行解码,采用的模式为trunchard,程序代码如下:

close all;
clear;
clc;

msg_source1 = [randi([0 1],1,50)];  % 一共10e4个点 
msg_source2 = [randi([0 1],1,50),zeros([1,30])];  % 一共10e4个点 
msg_source = [msg_source1,msg_source2];
n = 2;
k = 1;
rate = k/n; % rate为 1/2
L = 7;
tblen = 5*(L-1); % 回溯深度
trellis = poly2trellis(L,[171 133]);

code_data1 = convenc(msg_source1,trellis);
code_data2 = convenc(msg_source2,trellis);

code_data = [code_data1, code_data2];

d = vitdec(code_data,trellis,tblen,'trunc','hard');

figure(1);
stairs(msg_source(1:end),':*r');
hold on;
stairs(d(1:end),':+b');
ylim([-0.1,1.1]);
grid on;
legend('原始信息','恢复信息');

得到的结果为:

连续编码再进行译码

从结果中可以看出来译码是存在错误的。

可以对上面的msg_source1进行更改,改为

msg_source1 = [randi([0 1],1,50),zeros([1,30])];

在后面添加回溯深度个0,再次运行,可以得到结果

连续编码再进行译码"

可以得到正确的结果,总结起来方便操作就是在信息的末尾添加回溯深度个0

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

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

相关文章

svn commit 用法

转载   原文:https://blog.csdn.net/qq_39790633/article/details/103700391 使用svn进行代码的提交有两种方法:一种是通过TortoiseSVN客户端界面进行提交,另一种是通过svn commit指令提交。 方法一:通过TortoiseSVN客户端界面提…

【Python 随练】文本颜色设置

题目: 文本颜色设置 简介: 在本篇博客中,我们将学习如何在Python中设置文本的颜色。我们将介绍一个常用的库,并提供代码示例来演示不同颜色的设置。 问题分析: 我们需要在Python中设置文本的颜色,以增…

3.2迷宫求解

首先我没 看懂数据结构书上写得迷宫 求解 不过 不重要了 迷宫求解 需要先有个 迷宫 游戏 以下 是 Java写的 控制台迷宫游戏 import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern;public class MazeGameJ {public static void main(St…

云原生|kubernetes|centos7下离线化部署kubesphere-3.3.2---基于kubernetes-1.22.16(从网络插件开始记录)

前言: kubesphere的离线化部署指的是通过自己搭建的harbor私有仓库拉取镜像,完全不依赖于外部网络的方式部署。 我的kubernetes集群是一个单master节点,双工作节点,总计三个节点的版本为1.22.16的集群。 该集群只是初始化完成了…

在Excel当前窗口显示最后一行数据

大家也许都知道Excel工作表中数据行数较多&#xff0c;使用<Ctrl下箭头>组合键可以快速定位最后一行&#xff0c;但是如果数据不是连续的&#xff08;也就是工作表中包含空行&#xff09;&#xff0c;这个方式就只能定位到当前连续数据区域的最后一行。 如下实例代码可以…

Visual Studio2019更改并下载.Net Framework目标框架

一、问题 当使用.net进行开发时&#xff0c;开发的项目与.net framework目标框架会非常密切相关的&#xff0c;所以当vs本地使用的.net framework框架与该项目工程的框架不一致的时候&#xff0c;就可能打开不了当前项目&#xff0c;解决这个问题的方法有&#xff1a; 第一种…

方向导数和梯度

理性认识的三个阶段&#xff1a;定义、判断、推理。 有位博主说过&#xff0c;数学中&#xff0c;定义占60%的内容。 方向导数定义如下&#xff1a; 注意的一点是&#xff1a; 该处的alpha&#xff0c;beta角度关系是alpha beta pi/2。t*cos alpha &#xff0c;t * cos …

两百行代码实现简易点云标注工具

夏天来了非常热&#xff0c;LZ周末不想出去玩&#xff0c;于是乎继之前的图片标注工具利用两个晚上写了一个简单的点云标注工具。该工具基于Qt5.14.2-msvc2017&#xff08;其实LZ的VS版本是2019&#xff0c;似乎兼容&#xff09;平台C语言开发&#xff0c;用到的第三方库为PCL1…

ModaHub魔搭社区:“百模大战”下,字节跳动选择做一个“大模型商场”

“火山方舟”面向企业提供模型精调、评测、推理等全方位的平台服务&#xff08;MaaS&#xff0c;即Model-as-a-Service&#xff09;&#xff0c;目前集成了百川智能、出门问问、复旦大学MOSS、IDEA研究院、澜舟科技、MiniMax、智谱AI等多家AI科技公司及科研团队的大模型。 这种…

通过elementui的el-table实现table嵌套展示

el-table属性&#xff1a; :expand-row-keys: 可以控制行的展开和关闭&#xff0c;也可以控制只能有一行进行展开 expand-change&#xff1a;是表格行的切换事件&#xff0c;具体方法如下 el-table-column属性&#xff1a; type"expand" &#xff1a;表示如果有子t…

从网上复制shell脚本 到 linux下运行 碰到的各种问题汇总

从网上复制shell脚本 到 linux下运行 碰到的各种问题汇总 快捷键CtrlU查看网页源码 一、报错现象&#xff1a;: No such file or directory 解决方法&#xff1a;在linux系统下执行&#xff1a;dos2unix filename 问题原因&#xff1a;本质是文件中二进制符号^M乱码问题 参考…

JAVA学习(七)

1. JAVA 多线程并发 1.1 JAVA 并发 并发知识库 1.2 JAVA 线程实现/创建 创建方式 1.2.1 承 继承 Thread 类 Thread 类本质上是实现了 Runnable 接口的一个实例&#xff0c;代表一个线程的实例。启动线程的唯一方 法就是通过 Thread 类的 start()实例方法。start()方法是一个…

c++实现httpd服务器

文章目录 网络的初始化端口的分配协议的使用WSAStartup函数参数1&#xff1a;WORD wVersionRequested参数2&#xff1a;LPWSADATA lpWSAData返回值 int代码实现 创建套接字int af表示套接字的类型(网络套接字 文件套接字)int type数据流 数据报int protocol 通信协议 TCP &…

网络空间安全数学基础考试要点

网络空间安全数学基础 阶的计算不要求那个公式&#xff0c;但是Order几次方要求 考试会考原根 Legendre必考 多项式计算必考 扩域多项式计算 同态不考 域元素表示 本元多项式不考 1.整除 3 ≡ \equiv ≡ 4 mod 7不对吧3 ≡ \equiv ≡ 3 mod 74 ≡ \equiv ≡ 4 &#xff08;m…

DITA技巧:给文字加颜色

- 1 - 场景 在文档中&#xff0c;我们有时候会在文字中使用颜色。 比如&#xff1a; 在文档中&#xff0c;使用在文字上加颜色来代表一定意义。使用MS Word编写文档的时候&#xff0c;直接在文字上加颜色就可以了。转换成DITA以后&#xff0c;大家会发现在XML编辑器的工具栏…

css实现大屏效果的背景div

实现大屏效果的背景div, 效果如下: html <div class"box">1111111</div>css .box {width: 200px;height: 80px;background: linear-gradient(270deg, #00cda2, #00cda2) 0 0 no-repeat,linear-gradient(180deg, #00cda2, #00cda2) 0 0 no-repeat,line…

JUC高并发编程-初篇(后续发布高阶篇)

JUC高并发编程 1.JUC概述 1.1 什么是JUC JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包&#xff0c;JDK1.5开始出现的。 1.2 线程和进程概念 进程&#xff1a;指在系统中正在运行的一个应用程序&#xff1b;程序一旦运行就是进程&#xff1b;进程—…

数据结构--队列的基本概念

数据结构–队列的基本概念 队列的定义 队列其实是一种受限制的线性表 队列(Queue)&#xff1a;是 只允许在一端进行插入或删除操作 \color{red}只允许在一端进行插入或删除操作 只允许在一端进行插入或删除操作的线性表 重要术语: 队头、队尾、空队列 队列的特点: 先进先出 \…

表格检测识别技术面临的挑战和发展趋势

第四章 表格检测识别技术面临的挑战和发展趋势 现在表格区域检测的准确率已经很高了。但检测和识别是相辅相成的&#xff0c;单独的检测不够完善。如何利用检测和结构识别的结果互相提高效果&#xff0c;是未来的研究方向和重点。 由于表格应用场景较为广泛&#xff0c;表格形…

【MySQL学习笔记】(三)操作表(结构)

表 1 创建表2 查看表结构3 修改表4 删除表 注&#xff1a;本篇文章操作的是表的结构&#xff0c;并不是表的内容。 属于笔记&#xff08;一&#xff09;中的SQL分类中的DDL 1 创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 d…