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

article/2025/10/7 13:02:02

卷积码原理介绍

1.基本概念

首先卷积码是一种纠错码,让我们先从大格局出发,去认识卷积码。如图1所示

图1 纠错码的各种类型

我是先从通信原理书上了解了卷积码的概念,再结合网上部分资料,勉强搞懂,感觉主要需要掌握卷积码编码器状态图网状图。基本概念太多,要叙述起来需要花挺多时间的,不过网上这部分资料挺多的,这里就不在全部叙述,仅就部分知识点说一下我的看法。

1.1 编码器状态

以(2,1,2)卷积码例,此时编码器对应的状态共有2^2=4种,如图2所示。图2 (2,1,2)卷积码编码器状态图

由于输入只有0或者1,故每一种状态对应的下一种状态都只有两种情况。值得一提的是,这两种情况对应的输出相互取反,如果一个输入为01,则另一种输入为10,即码距最大。后面我也去理解了一下Viterbi译码,由这个译码原理,我进一步发现 编码时一个状态对应不同的输出互相取反的情况是有必要的,是有特殊规定的。因为这样的规定可以使得最大似然译码(MLD) 算法可以在Viterbi译码中成功应用。(由于本篇只论述编码,我还没开始译码的仿真,所以此处不再继续叙述译码。后面了解译码并仿真成功后再进一步叙述我对译码的理解)。

2.(n,1,m)卷积编码及仿真

本实验以(2,1,2)为例。必须知道如何通过生成多项式画出编码器结构,或者从编码器结构写出生成多项式,这部分内容B上面很多讲的挺详细的视频。本次实验的生成多项式为

%一般用八进制表示,为了方便,我用的是二进制。
m = [1 0 0;1 1 1]; %第n行元素分别表示每个编码器(从左至右)与第n个输出码元的连接情况,即行数代表输出码元数 列数代表编码器个数 即m+1

此代码模仿自这位大佬的作品实验七-卷积编码的MATLAB实现
如有侵权,告知后立马删!

%% 测试主函数
clear all
clc
G = [1,0,1;1,1,1]; %%生成多项式
M = [1 1 0 0 1 0 1 1]; %%信息
C = ZW_conv_encode(M,G);
%% 本函数实现卷积编码
function C = ZW_conv_encode(m,G)
%{
输入:原始序列m生成矢量G  每一行代表一个输出的连接结构
输出:卷积码结果C 
特点:适用于所有的[n,1,N]卷积编码
%}
len = length(m);    %记录输入信息长度
k=1;                %每次输入一个码元
[n,N] =  size(G);   %n表示一次有几个码元输出 N表示一次有几个监督码元(包括当前输入)
C = zeros(1,n*len); %储存输出卷积码
% 在头尾补0,方便卷积输出和寄存器清洗
m_add0 = [zeros(1,N-1),m,0]; %初始m个状态均假设为0,补N-10 当作新的信息流
%fliplr将矩阵倒序 因为编码器输出的计算是对应的 [输入-m个状态].*G 而m_add0中与所需相反
C_reg = fliplr(m_add0(1,1:N));  %C_reg[输入-m个状态] 因为每次监督的码元为N个,故寄存器中也储存N个码元%开始循环 将每一个输入都得到对应的输出
for i=1:len%生成每一位输入符号的n位输出C(n*i-(n-1):n*i) =  mod(C_reg*G',2);%载入新的输入并更新寄存器状态 C_reg = [m_add0(i+N),C_reg];%此时(1,N+1C_reg(end) = [];% 挤掉旧符号 最后一个元素直接没有 回到(1,N)
end

经过验证,此函数的卷积编码输出与在MATLAB中直接调用poly2trellisconvenc函数卷积编码后的输出一致。

3.(n,k,m)卷积编码及仿真

做完(n,1,m)的卷积编码还不能罢休,我的任务是完成(n,k,m)的编码与译码,所以首先我还得把(n,k,m)码给仿真出来,这样才算真正理解了。但是网上这部分资料比较少,好在被我发现了一个宝藏文章,自取。poly2trellis(matlab)
在搜索怎么使用MATLAB的时候发现了这个宝藏,让我受益匪浅。从这篇文章可以看出来,实际k个输入就有点类似于k个(n,1,m)卷积码的相叠加,就是把最后结果取异或而已。于是抱着试一试的态度,我又继续尝试了,在于BUG一番斗争后,功夫不负有心人,我成功了!!!!
以(3,2,[2 2])为例,生成多项式为

G1{1} = [1 0;0 1;1 1];每个元组中对应一个信息码所在编码器的结构
G1{2} = [0 1;1 1;1 1];

%% 测试主函数
clear all
clc
M = [1 1 0 0 1 0 1 1];
%G1{1} = [1 1 1;0 0 1;1 0 0];
%G1{2} = [0 1 0;1 0 1;1 1 1];
G1{1} = [1 0;0 1;1 1];
G1{2} = [0 1;1 1;1 1];
C2 = ZW_conv_K_encode(M,G1);%C3 = [1 1 0 0 0 1 0 0 0 0 1 0];
C3 = [1 1 0 1 0 0 1 0 1 1 0 1];  %调用MATLAB内部函数得到的编码情况
C2 - C3 %如输出全为零则此函数编码正确
%% 本函数实现卷积编码
function C = ZW_conv_K_encode(m,G)
%{
输入:原始序列m生成矢量G  元组 每一个细胞对应一个输入的生成式 输入(1,k)
输出:卷积码结果C 
特点:适用于所有的[n,k,N]卷积编码
%}
len = length(m);    %记录输入信息长度
[~,k] = size(G);    %k表示每次输入的信息码元数
if (mod(len,k)~=0)  %说明最后一次输入的时候信息玛不够 times = len/k + 1; %time 为循环次数
elsetimes =len/k;
end%timesm = [m,zeros(1,k)];    %这样总可以让最后一次输入时有k个信息码输入 防止最后一次循环没有输入报错%预先分配内存 加快运行速度
n = zeros(1,k);     %共有k个 每一个表示一个输入对应的编码器结构
N = zeros(1,k);     %不过每个码元对应的输出码元数肯定相同 所以n(i)均相同 
for i=1:k           %求每次输入码元对应的编码器结构[n(i),N(i)] = size(G{i}); %n表示一次有几个码元输出 N表示一次有几个监督码元(包括当前输入)
endC = zeros(1,n(1)*floor(times));%每次循环输入n个码元 
%C1 = zeros(1,n(1));%暂时存储每个输入码元对应的输出码元
C_regs = cell(1,k);  %k个输入 对应k个编码器结构
%初始化每个输入对应的寄存器状态 并送入新的输入
for i=1:k C_regs{i} = [m(i),zeros(1,N(i)-1)]; %对应[输入,m个初始为零的状态] 
endfor i=1:floor(times)    %开始循环 将每一次的k个输入都得到其对应的输出for j=1:k       %对每个输入进行循环 得到C的值C1 = mod(C_regs{j}*G{j}',2); %得到第i次输入时第j个码元的输入结果%上一个输入码元对应的输出加上此时码元对应的输入码元异或(对2取余),则为此时全部输入对应的输入码元C((i-1)*n(j)+1:n(j)*i) = mod(C1+C((i-1)*n(j)+1:n(j)*i),2);%载入新的输入并更新寄存器状态 为下一次的大循环的第j个码元的编码器做准备C_regs{j} = [m(j+i*k),C_regs{j}];%此时(1,k+1)C_regs{j}(end) = [];% 挤掉旧符号 最后一个元素直接没有 回到(1,k)end
end

中途由于马虎出了一些问题,最终终于成功实现。后面还进行了另一组实验,仍然正确。

4.总结

总的来说,卷积码相对分组码来说更难理解。这次很幸运地理解了卷积码的编码过程并成功仿真出来,还是很自豪的。不过编码要比译码更简单,后面的译码才更是一块硬骨头,目前已经有一定的了解了,打算继续进一步了解,并尝试去仿真,希望下一次译码仿真不会太久!
内容如有侵权,我知道后立马删除


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

相关文章

通信原理学习笔记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;这些引擎紧凑且高效。它们为开发人员、系统管理员和业务用户提供工作流和业务流程管…

微服务与工作流

本文主要想谈一谈工作流在微服务系统中的使用以及工作流能够为微服务系统带来的好处。 通过查找资料可得&#xff0c;微服务的编排主要分为两种形式&#xff0c;一种是“choreography”&#xff0c;有人将其翻译成微服务的编排&#xff1b;另一种是“orchestration”,有人将其翻…

Camunda工作流引擎入门

文档集合 1、camunda文档&#xff1a;https://docs.camunda.org/get-started/quick-start/ 2、camunda资源下载&#xff1a;https://camunda.com/download/ 3、camunda示例github仓库&#xff1a;https://github.com/camunda/camunda-bpm-examples 4、camunda 代码仓库&…

工作流设计详解

工作流 概念&#xff1a; workflow流程性通知和审批控制&#xff0c;业务流程中、发送、提供附加信息或进行附加业务处理&#xff0c;两个或两个以上的人为共同目标&#xff0c;连续以并行或串行的方式完成某一业务。 工作流 设计&#xff1a; 按照业务规划流程图&#xff0…

什么是工作流?为什么程序员要用它?

每一个程序员&#xff0c;在接触到工作流的时候&#xff0c;都会有这么一个疑问——我用一般的方法可以实现&#xff0c;为什么还要用工作流&#xff1f; 我曾经也问过这个问题&#xff0c;不过现在稍微有点明白了。别着急要答案&#xff0c;看过下面的例子&#xff0c;或许你…

什么是工作流

什么是工作流&#xff1f; 工作流是从英文单词work flow中直译过来的。最直白的意思就是日常工作中相对固定的流程计算机化。 在此列举两个工作流简例&#xff1a; 客户到银行开户的工作流&#xff1a; 客户索取开户资料单——资料填写——营业员核对个人证件——营业员核对帐款…

什么是工作流?如何利用工作流引擎实现业务流程

工作流引擎是用来实现工作流的一种组件化工具&#xff0c;它是一整套解决方案&#xff0c;比如说一般工作流引擎包含这些功能&#xff1a;流程节点管理、流向管理等&#xff0c;是为了减小开发成本而推出的。因为在软件开发过程中&#xff0c;如果是从零开始实现工作流&#xf…

什么是工作流,flowable 与 Activiti对比

工作流 什么是工作流工作流是复杂版本的状态机Java工作流开源框架工作流对比Activiti设计器 Flowable兼容性 Camunda设计器兼容性&#xff1a;小结&#xff1a; 社区活跃度FlowableActivitiCamunda 总结 什么是工作流 工作流&#xff0c;是指“业务​过程的部分或整体在​计算…

工作流是什么

刚入职一家公司不久&#xff0c;昨天去和经理与客户对接需求的之前&#xff0c;经理问我接触过工作流没有之前。作为一个20年毕业的老人了&#xff0c;只能尴尬的说一句没有我下去会去了解下。这里我就暂且找一下别人总结的文章和大家一起学习下。 一、什么是工作流 工作流&a…

什么是工作流?

这里说的工作流是狭义的管理工作流程。 现代企业的日常活动中&#xff0c;70%以上都是有两个或两个以上的员工共同参与协作的的任务&#xff0c;比如生产流程、业务流程、各类行政申请流程、财务审批流程、人事处理流程、质量控制及客服流程等。一项工作&#xff0c;经过一个步…