viterbit 译码 卷积编码

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

 

学习网址:

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
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值