微信公众号上线,搜索公众号小灰灰的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理论误比特率','硬判决误比特率','软判决误比特率');