基于matlab的(2,1,4)卷积编码与维特比译码的通信过程(附完整代码)

本文介绍了Matlab中用于卷积编码(conv214)和维特比译码(vitebi)的函数,通过加载本地数据并进行(2,1,4)卷积编码,然后解码,结果显示解码后的数据与原始数据一致。作者还提供了两种解码方法及其代码实现和可视化比较。

一、相关函数
matlab中有关于卷积编码与维特比译码的函数, 卷积编码函数为convenc(),维特比函数为vitdec(),同时需要设置卷积编码需要的网表函数poly2trellis()函数
由于时间关系,本文不具体介绍这几个函数的具体用法,但相关介绍可参见该博文:信道编码:MATLAB使用卷积编译码函数,里面有非常详细的函数介绍,相信可以解答疑惑。
二、代码实现内容
加载本地的一个mat文件(里面存储的是二进制0,1数据),卷积函数输入数据也可以是随机生成的0,1序列,但如果看了前面的函数讲解文章会知道,输入的序列长度需要大于等于译码回溯深度,本文所设置的回溯深度为20,因此若使用自己生成的随机数据用此代码进行编码,请令数据长度大于20。对数据进行(2,1,4)卷积编码,然后再将卷积编码后的数据进行维特比译码,译码数据与原始数据一致。
三、具体代码
敲黑板!
matlab的程序要求所有function函数必须在代码主体之后,这里为了方便介绍将函数调用与函数主体放在了一起,真正放到编辑器时请将所有function函数内容放到主要内容之后哦,否则会报错。
(1)加载数据部分(可将data换自己数据)

clear
clc
data = load('D:\Code\matlab\work\convolution\encode_data01.mat');
data = data.a13_moddata;
disp('卷积前数据:');

(2) 卷积编码部分
m为寄存器个数,[25 31]为两个输出抽头的二进制转十进制值,具体使用可以查阅上面所给介绍博客或其他介绍,此文只展示实现代码

[encode_num] = conv214(data);

function [encode_num] = conv214(x)
    trellis = poly2trellis(5, [25 31]);% 5是(n,k,m)编码的m加一
    encode_num = convenc(x,trellis);
end

(3)解码部分

[decode_data] = vitebi(encode_num);
disp("解码后数据")
whos("decode_data")


function [decode_num] = vitebi(x)
    L = 5; %(n,k,m)中的m+1
    tblen = 5*(L-1);% 码率为1/2,所以回溯深度是5倍的约束长度
    trellis = poly2trellis(L, [25 31]);
    decode_num = vitdec(x,trellis,tblen,'term','hard');% 回溯深度大约为寄存器个数加一
end

另一种解码实现方式函数:
此函数的vitedc中使用了cont格式,这一形式的解码有效信息为是从第二个回溯深度开始的,因此解码后需要从一个回溯深度之后取解码数据。且需要在输入数据补2个回溯深度的0,以使寄存器最后状态归零。这样才能得到完整正确的解码信息,与上面的term模式有所不同,可参见本文最开始推荐的文章查看具体区别。

function [decode_num] = vitebi(x)
    L = 5; %(n,k,m)中的m+1
    tblen = 5*(L-1);% 码率为1/2,所以回溯深度是5倍的约束长度
    zero=zeros(1,2*tblen);
    trellis = poly2trellis(L, [25 31]);
    k = log2(trellis.numInputSymbols);
    x=[x(:,1:end),zero];
    decode_num = vitdec(x,trellis,tblen,'cont','hard');% 此处使用了cont
    decode_num=decode_num(tblen*k+1:end) 
end

4)可以绘图查看原始信息与恢复信息的差距,代码如下

%可以画图查看原始信息与恢复信息的差距
figure(1);
stairs(data(1:end),':*r');
hold on;
stairs(decode_data(1:end),':+b');
ylim([-0.1,1.1]);
grid on;
legend('原始信息','恢复信息');

整个过程到这里就结束啦,可以自行打印信息查看对错,欢迎讨论!祝大家学习愉快!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值