matlab代码--卷积码通过不同信道的误码率分析

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信道时,越容易转移到不确定的状态,导致误码率变大。

完整代码获取链接:完整代码
如有定做具体方向的需求,本专栏头像有联系方式,欢迎私聊。也十分欢迎热爱相关技术的朋友们私下交流

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

通信仿真爱好者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值