学习网址:
https://www.zhihu.com/question/20136144
https://www.doc88.com/p-5436827857500.html


%实现1/2卷积编码。
% function y=encoder_12(data)
clc;
clear all;
%
% data = [ 1 0 0 0 1 0 0 ]; %验证[1,1,1,0,1,1,0,0,1,1,1,0,1,1];
data = [ 1 0 0 1 0 1 1 ];
D1=0;D2=0;
for i=1:length(data)
D0=data(i);
D3=mod(D0+D1+D2,2);%输出数据B g0=(171)8=(1111001)2
D4=mod(D0+D2,2);%输出数据A g0=(133)8=(1011011)2
D2=D1;
D1=D0;
y(1,i)=D3;%输出数据A 按照S(x)=x^6+x^5+x^3+x^2+1实现的 A对应的删除码为:110
y(2,i)=D4;%输出数据B 按照S(x)=x^6+x^3+x^2+x+1实现的 B对应的删除码为:101
end
y
tt = zeros (1,14);
tt (1:2:13) = y(1,:);
tt (2:2:end) = y(2,:);
tt
% %实现1/2卷积编码。
% function y=encoder_12(data)
% D1=0;D2=0;D3=0;D4=0;D5=0;D6=0;
% for i=1:length(data)
% D0=data(i);
% D8=mod(D0+D1+D2+D3+D6,2);%输出数据B g0=(171)8=(1111001)2
% D7=mod(D0+D2+D3+D5+D6,2);%输出数据A g0=(133)8=(1011011)2
% D6=D5;
% D5=D4;
% D4=D3;
% D3=D2;
% D2=D1;
% D1=D0;
% y(1,i)=D7;%输出数据A 按照S(x)=x^6+x^5+x^3+x^2+1实现的 A对应的删除码为:110
% y(2,i)=D8;%输出数据B 按照S(x)=x^6+x^3+x^2+x+1实现的 B对应的删除码为:101
% end
%子函数:计算(m,n)到(g,h)的汉明距离
function d=dis(m,n,g,h)
d=xor(m,g)+xor(n,h);
close all;clear all; clc;
%卷积编码器g1=111,g2=101 (二进制表示)
%配套连接 http://www.doc88.com/p-5436827857500.html
%x为输入的待译码序列
% x =[1,1,1,0,1,1,1,1,1,0,0,0,0,1] %这个验证不对啊,不知道为什么
x = [1,1,1,0,1,1,0,0,1,1,1,0,1,1]; %1000100验证
a=size(x); %输入序列的长度
s=a(2)/2; %译码后的m序列长度为x的一半
m=zeros(1,s); %最终结果存放
ma=zeros(1,s+1); %存放Fa路径的
mb=zeros(1,s+1); %存放Fb路径的
mc=zeros(1,s+1); %存放Fc路径的
md=zeros(1,s+1); %存放Fd路径的
tempma=zeros(1,s+1);
tempmb=zeros(1,s+1);
tempmc=zeros(1,s+1);
tempmd=zeros(1,s+1);
Fa=0;
Fb=0;
Fc=0;
Fd=0;
for i=1:s
if i==1
d0=dis(x(1),x(2),0,0); %计算接收序列和编码输出的汉明距离。编码输出结果根据状态跳变和编码多项式得出。
d3=dis(x(1),x(2),1,1);
Fa=Fa+d0; %1T时刻,状态00 是由前一时刻的状态00 加上此处的汉明距离d0而来。
Fb=Fb+d3;
ma(i)=0;
mb(i)=0;
mc(i)=0;
md(i)=0;
continue;
elseif i==2
d0=dis(x(3),x(4),0,0); %d0 --对应编码值00
d1=dis(x(3),x(4),0,1); %d1 --对应编码值01
d2=dis(x(3),x(4),1,0); %d2 --对应编码值10
d3=dis(x(3),x(4),1,1); %d3 --对应编码值11
%注意下面的顺序,不能错,否则会产生数据相关,要么加中间变量。
Fc=Fb+d2;
Fd=Fb+d1;
Fb=Fa+d3; %比如这里,就不能把Fa写在Fb的前面。因为,MATLAB是串行执行,Fa值被提前更改了,肯定就影响了Fb
Fa=Fa+d0;
ma(i)=0;
mb(i)=0;
mc(i)=2;
md(i)=2;
continue;
elseif i>2
d0=dis(x(2*i-1),x(2*i),0,0);
d1=dis(x(2*i-1),x(2*i),0,1);
d2=dis(x(2*i-1),x(2*i),1,0);
d3=dis(x(2*i-1),x(2*i),1,1);
%下面开始进行加比较选,选F值小的路径
tempa=Fa;
tempb=Fb;
tempc=Fc;
tempd=Fd;
if Fa+d0<Fc+d3 %根据图来,看当前值 是由上一个时刻的那个状态加上 汉明距离而来。取最小值
tempa=Fa+d0; %累计汉明距离
tempma=ma; %路径保存
tempma(i)=0;%表示,上一个时刻的路径是0.
else
tempa=Fc+d3;
tempma=mc;
tempma(i)=1;
end
if Fa+d3<Fc+d0
tempb=Fa+d3;
tempmb=ma;
tempmb(i)=0;
else
tempb=Fc+d0;
tempmb=mc;
tempmb(i)=1;
end
if Fb+d2<Fd+d1
tempc=Fb+d2;
tempmc=mb;
tempmc(i)=2;
else
tempc=Fd+d1;
tempmc=md;
tempmc(i)=3;
end
if Fb+d1<Fd+d2
tempd=Fb+d1;
tempmd=mb;
tempmd(i)=2;
else
tempd=Fd+d2;
tempmd=md;
tempmd(i)=3;
end
Fa=tempa;
Fb=tempb;
Fc=tempc;
Fd=tempd;
ma=tempma;
mb=tempmb;
mc=tempmc;
md=tempmd;
end
end
%最后F取最小值的那条路径为最优路径,
%同时标记那个数组的最后一个元素为相应的数字
%并将最后的路径算出来
temp_min=min([Fa,Fb,Fc,Fd])
len = 9;
temp = zeros(1 , len);
temp(9) = temp_min +1;%%最后一个状态,累计最小距离对应的 状态的位置。然后根据这个位置,对比trace进行路径回溯。加1 是为了在 路径回溯的时候
trace = [ma;mc;mb;md]
trace = trace +1
for i = 1:8
temp(len-i) = trace(temp(len-i+1) , len-i); %路径回溯
end
dout = zeros(1 ,9);
for i =1:9 %根据转移图,看回溯路径,找到原值
if (temp(i)==1) dout(i) = 0;
elseif (temp(i)==2) dout(i) = 0;
elseif (temp(i)==3) dout(i) = 1;
else
dout(i) = 1;
end
end
%%下面是原本的程序,跑出来的结果也不对啊
% temp=min([Fa,Fb,Fc,Fd]);
% if Fa==temp
% % ma(6)=0;
% for t=1:5
% if ma(t)<ma(t+1)
% m(t)=1;
% elseif (ma(t)==ma(t+1)) && (ma(t)==3)
% m(t)=1;
% else
% m(t)=0;
% end
% end
% elseif Fb==temp
% mb(6)=2;
% for t=1:5
% if mb(t)<mb(t+1)
% m(t)=1;
% elseif (mb(t)==mb(t+1)) && (mb(t)==3)
% m(t)=1;
% else
% m(t)=0;
% end
% end
% elseif Fc==temp
% mc(6)=1
% for t=1:5
% if mc(t)<mc(t+1)
% m(t)=1;
% elseif (mc(t)==mc(t+1)) && (mc(t)==3)
% m(t)=1;
% else
% m(t)=0;
% end
% end
% elseif Fd==temp
% md(6)=3
% for t=1:5
% if md(t)<md(t+1)
% m(t)=1;
% elseif (md(t)==md(t+1)) && (md(t)==3)
% m(t)=1;
% else
% m(t)=0;
% end
% end
% end
%
% m

本文介绍了Viterbi译码的基本原理及其在卷积编码中的应用。通过学习链接,读者可以深入了解Viterbi算法如何有效地解码卷积编码,提高通信系统的可靠性。

7370

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



