1 前言
在卷积码的编码过程中,对输入信息比特进行分组编码,每个码组的编码输出比特不仅与该分组的信息比特有关,还与前面时刻的其他分组的信息比特有关。同样,在卷积码的译码过程中,不仅从当前时刻收到的分组中获取译码信息,还要从前后关联的分组中提取相关信息。正是由于在卷积码的编码过程中充分利用了各组的相关性,使得卷积码具有相当好的性能增益
2 过程
本文的主要工作是将发送的数据经过卷积编码后,通过高斯/BEC信道,然后经过译码后,计算误码率,适合刚刚接触matlab仿真的阅读者。
卷积编码电路图如下,根据图,该卷积码系统为包含 2个输出,1组寄存器,该组包含的寄存器数量为3,为(2,1,3)卷积码
如图,根据上图可以得出状态转移图
卷积编码过程:
%%实现卷积编码
function C = encode_213(m,G)
len = length(m);
k=1; % 表示每次对k个码元进行编码
[n,N] = size(G);% n表示一个输入码元拥有几个输出,N表示每次监督的输入码元数
C = zeros(1,n*len);
% 在头尾补0,方便卷积输出和寄存器清洗
m_add0 = [zeros(1,N-1),m,zeros(1,N+1)];
% 循环每一位输入符号,获得输出矩阵
C_reg = fliplr(m_add0(1,1:N));
for i =1:len+N
%生成每一位输入符号的n位输出
C(n*i-(n-1):n*i) = mod(C_reg*G.',2);
%更新寄存器序列+待输出符号(共N个符号)
C_reg = [m_add0(i+N),C_reg];% 添加新符号
C_reg(end) = [];% 挤掉旧符号
end
维特比译码
以(n,k,N)为例
(1) 根据接收数据,计算出相应的分支度量值。
(2) 将进入某状态的2^k条分支度量与前面的状态度量累加求和。
(3) 比较到达同一状态的2条新的路径度量的大小,选择最小者作为新的状态度量存储起来,并记住与此路径(也就是幸存路径)对应的信息码元。
(4) 对所有的2^N个状态都实施 上述相加/比较/选择 三种运算。路径度量最小的一条路径作为译码数据输出
(5) 将译码时刻向前延申一步,重复上述操作,直至译码结束。
代码流程:
clear all
clc
setdemorandstream(2)
date_length = 800;
snrdB = -2:1:8;
bool_awgn = 1;
bool_bec = 0;
number =200; %Monte-Carlo number
ber_nocode = zeros(number,length(snrdB)); %临时存储矩阵
ber_code = zeros(number,length(snrdB)); %临时存储矩阵
for m=1:number
m
data = round(rand(1,date_length));% 生成原始序列
% (2,1,3)卷积码
G = [1,0,1,1;1,1,0,1];
codebook = encode_213(data,G);
% BPSK-AWGN
[~,ber_non] = BPSK_AWGN(data,snrdB);% 未编码,发送原始数据
[recieved_code,~] = BPSK_AWGN(codebook,snrdB);% 发送卷积码数据
%% decode
[errors,~] = decoder_213(G, data,recieved_code,snrdB,0,bool_awgn,bool_bec);
%caculate BER
BER_conv1 = errors/date_length; % 得到BER
ber_nocode(m,:) = ber_non; %每次蒙特卡罗实验 存入临时矩阵
ber_code(m,:) = BER_conv1; %每次蒙特卡罗实验 存入临时矩阵
end
ber_nocode_mean = mean(ber_nocode,1); %对蒙特卡罗实验结果,按列求均值
ber_code_mean = mean(ber_code,1); %对蒙特卡罗实验结果,按列求均值
% 画出BER-SNR曲线
figure(1)
semilogy(snrdB,ber_nocode_mean,'r-*',snrdB,ber_code_mean,'b-o');
grid on;
xlabel('SNR(dB)');
xticks([-2:1:8]);
ylabel('Bit error ratio');
grid on
legend('non-code','(2,1,3)conv');
title('Convolutional code with AWGN')
2. 1经过AWGN信道的代码流程如下:
发送数据 -> 2 1 3卷积编码 -> BSSK调制-> AWGN信道 -> BPSK解调 ->vitbi译码 -> 接收数据 -> 计算BER
2.2经过BEC信道的代码流程如下
发送数据 -> 2 1 3卷积编码 -> BEC信道 ->vitbi译码 -> 接收数据 -> 计算BER
3 仿真结果
可以看出 在信噪比低的时候,未经编码的系统信噪比 反而优于 经过卷积编码的系统。(原因和汉明的一样,按照汉明的解释即可)
可以看出,随着擦错概率的增加,系统的误码率显著增加。这是因为,擦除概率越大,发送数据在经过bec信道时,越容易转移到不确定的状态,导致误码率变大。
完整代码获取链接:完整代码
如有定做具体方向的需求,本专栏头像有联系方式,欢迎私聊。也十分欢迎热爱相关技术的朋友们私下交流