一、相关函数
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('原始信息','恢复信息');
整个过程到这里就结束啦,可以自行打印信息查看对错,欢迎讨论!祝大家学习愉快!
本文介绍了Matlab中用于卷积编码(conv214)和维特比译码(vitebi)的函数,通过加载本地数据并进行(2,1,4)卷积编码,然后解码,结果显示解码后的数据与原始数据一致。作者还提供了两种解码方法及其代码实现和可视化比较。
2万+

被折叠的 条评论
为什么被折叠?



