Matlab通信仿真系列——卷积码(Convolutional Code)仿真

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等
在这里插入图片描述
本节目录

一、卷积码
1、卷积码的原理
2、卷积码的描述
3、卷积码的译码
二、卷积码的Matlab仿真
三、Matlab源码

本节内容
一、卷积码

卷积码(Convolutional Code),又称为连环码。
卷积码的每个(n,k)码段内的n个码元不仅仅与该码段内的信息元有关,而且与前面m端的信息元有关。通常m为编码存储,用(n,k,m)表示。
1、卷积码的原理
以(2,1,2)卷积码的编码器为例,由移位寄存器、模二加法器及开关电路组成。
在这里插入图片描述

起始状态,各级移位寄存器为0,即S1S2S3为000。
S1表示当前输入数据,S2S3表示移位寄存器状态,存储以前的数据。
输出码字C,C1和C2。
C1=S1⊕S2⊕S3;C2=S2⊕S3。
在这里插入图片描述

2、卷积码的描述
卷积码,通常有3种图解方式:树图、状态图和格图。
①树图
树图描述的是在任何数据序列输入时,码字所有可能的输出。
以S1S2S3=000作为起点,用a=00,b=01,c=10,d=11来表示S3S2的4种可能的状态。
在这里插入图片描述

②状态图
图中4个节点a/b/c/d,分别表示S3S2的4种可能。每个节点有两条线,实线表示输入数据为0,虚线表示输入数据为1,线旁的数字即为输出码字。
在这里插入图片描述

③格图
格图,或网络图,状态图在时间上展开而得到的。
在这里插入图片描述

3、卷积码的译码
卷积码的译码可分为代数译码和概率译码两大类。
代数译码是利用生成矩阵和监督矩阵来译码,最主要的方法是大数逻辑译码。
概率译码有维特比译码和序列译码,是卷积码最主要的译码方法。
①维特比译码(Viterbi)
维特比译码,是一种最大似然译码算法。最大似然译码算法的原理,把接收码字和所有可能的码字比较,选择一种码距最小的码字作为解码输出。
维特比译码,把接收码字分段累接处理,每接收一段码字,计算比较一次,保留码距最小的路径,直到译完整个序列。
②序列译码
序列译码法,译码先从码树的起始节点开始,把接收到的第一个子码的n个码元与自始节点出发的两条分支按照最小汉明距离比较,验证差异最小的分支走向第二个节点。在第二个节点上,采用同样原理,最后得到一条路径。
二、卷积码的Matlab仿真
Matlab提供了卷积码的编码函数convenc和相应的Viterbi译码函数vitdec。
code=convenc(msg,treills),表示完成输入信号msg的卷积编码,treills代码编码多项式。
decoded=vitdec(code,treills,tblen,opmode,dectype)表示对码字code进行Viterbi译码,treills表示产生码字的卷积编码器,tblen表示回溯的深度,opmode表示译码器的操作模式,dectype表示译码器判决的类型,比如软判决和硬判决。
matlab代码示例:
仿真BPSK调制在awgn信道下分别使用卷积码和不使用卷积码的性能,其中卷积码的约束长度为7,生成多项式为[171,133],码率为1/2,译码分别采用硬判决和软判决译码。
在这里插入图片描述
在这里插入图片描述

三、Matlab源码

clear all;
clc;
close all;
%SNR的范围
EbNo=0:10;
%消息比特的个数
N=1000000;
%BPSK调制
M=2;
%约束长度
L=7;
%卷积码生成多项式
trel=poly2trellis(L,[171 133]);
%Viterbi译码器回溯深度
tblen=6*L;
%消息比特
msg=randi([0 1],1,N);
%卷积编码
msg1=convenc(msg,trel);
%BPSK调制
x1=pskmod(msg1,M);
for ii=1:length(EbNo)
    %加入高斯白噪声,码率为1/2,减去3dB
    y=awgn(x1,EbNo(ii)-3);
    %硬判决
    y1=pskdemod(y,M);
    %Viterbi译码
    y1=vitdec(y1,trel,tblen,'cont','hard');
    %误比特率
    [err,ber1(ii)]=biterr(y1(tblen+1:end),msg(1:end-tblen));
    
    %软判决
    y2=vitdec(real(y),trel,tblen,'cont','unquant');
     %误比特率
    [err,ber2(ii)]=biterr(y2(tblen+1:end),msg(1:end-tblen));
end
%BPSK调制理论误比特率
ber=berawgn(EbNo,'psk',2,'nodiff');
semilogy(EbNo,ber,'-ko',EbNo,ber1,'-k*',EbNo,ber2,'-k.');
title('卷积码性能');
xlabel('Eb/No');
ylabel('误比特率');
legend('BPSK理论误比特率','硬判决误比特率','软判决误比特率');
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
卷积码是在信息序列通过有限状态移位寄存器的过程中产生的。通常,移存器包含N级(每级A比特),并对应有基于生成多项式的m个线性代数方程,输入数据每次以A位(比特)移入移位寄存器,在此同时有n位(比特)数据作为己编码序列输出,编码效率为A/n。参数N被称作约束长度,它指明了当前的输出数据与多少输入数据有关。它决定了编码的复杂度。 译码器的功能就是,运用一种可以将错误的发生减小到最低程度的规则或方法,从已编码的码字中解出原始信息。在信息序列和码序列之间有一对一的关系。此外,任何信息序列和码序列将与网格图中的唯一一条路径相联系。因而,卷积译码器的工作就是找到网格图中的这一条路径。 Viterbi算法可被描述如下; 把在时刻i,状态 所对应的网格图节点记作 ,每个网相节点被分配一个值 。节点值按如下方式计算: (1)设 , 。 (2)在时刻i,对于进入每个节点的所有路径计算其不完全路径的长度。 (3)令 为在i时刻,到达与状态 。相对应的节点 的最小不完全路径长度。通过在前一节点随机选择一条路径就可产生新的结果。非存留支胳将从网格图中删除。以这种方式,可以从 。处生成一组最小路径。 (4)当L表示输入编码段的数目,其中每段为k比特,m为编码器中的最大穆存器的长度,如果 ,那么令 ,返回第二步。 一旦计算出所有节点值,则从 时刻,状态 。开始,沿网格图中的存留支路反向追寻即可。这样被定义的支路与解码输出将是一一对应的。关于不完全路径长度,硬判决解码将采用Hamming距离,而软判决解码将采用Euclidean距离。
PSK调制是一种常用的数字调制方式,可以将数字信号转换为模拟信号进行传输。在传输过程中,通常需要采用卷积码进行编码,以提高传输的可靠性。维特比软判决译码是一种常见的卷积码译码算法,能够有效地纠正传输中的错误。下面是一个MATLAB仿真示例,展示了如何进行PSK调制和卷积码维特比软判决译码: ```matlab % 生成一个(2,1,3)卷积码 trellis = poly2trellis(3, [7 5]); % 随机生成一组数据 data = randi([0 1], 100, 1); % 卷积码编码 codedData = convenc(data, trellis); % PSK调制 M = 4; % PSK调制阶数 modData = pskmod(codedData, M); % 添加高斯噪声 SNR = 10; % 信噪比 noisyData = awgn(modData, SNR); % PSK解调 demodData = pskdemod(noisyData, M); % 维特比软判决译码 decodedData = vitdec(demodData, trellis, 5, 'trunc', 'unquant'); % 比较译码结果和原数据 errors = sum(decodedData ~= data); disp(['Bit errors: ' num2str(errors)]); ``` 上述代码示例中,首先定义了一个(2,1,3)卷积码,然后随机生成了一组数据,并进行了卷积码编码。接着,对编码后的数据进行PSK调制,模拟信道传输,添加高斯噪声,并进行PSK解调。最后,使用维特比软判决译码对解调后的数据进行译码,并比较译码结果和原数据,计算译码误差。 需要注意的是,上述代码示例中的参数设置仅供参考,实际应用中需要根据具体情况进行调整。例如,PSK调制阶数和信噪比都会影响信号的传输效果和译码精度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰的FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值