viterbi decoding

  • Follow


Hi I need some help on my project. My project is base on convolutional code and using Abhijith. S and ANOOP GOPAN coding as references but Im not able to interpret on how the decoding part on viterbi is done on the transition table part and also how the trace back work. The matlab code is as below

%Hard Decision Viterbi Decoder
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Function gets an encoded message 'rcvd(encoded by a convolutional encoder) 
%as argument and returns the decoded message 'dec_op' 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [dec_op]=viterbidec(rcvd)

close all;
clc
%Concatenate two consecutive bits of recieved encoded sequence to 
%make up a symbol
rcvd=[0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 ];
input=[];
for j=1:2:length(rcvd)
   input=[ input (rcvd(j))* 2 + (rcvd(j+1))];
end

%initializing all arrays
%op_table=[00 00 11; 01 11 00; 10 10 01; 11 01 10]; %OUTPUT array
op_table=[0 0 3; 1 3 0; 2 2 1; 3 1 2]; %OUTPUT array
ns_table=[0 0 2; 1 0 2; 2 1 3; 3 1 3]; %NEXT STATE array
transition_table=[0 1 1 55; 0 0 1 1; 55 0 55 1; 55 0 55 1];
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                    A R R A Y S - U P D A T I N G  Part
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

st_hist(1:4, 1:17)=55; %STATE HISTORY array
aem=zeros(4, 34); %ACCUMULATED ERROR METRIC (AEM) array
ssq=zeros(1, 17); %STATE SEQUENCE array

% input=rcvd;
%input(1, :)=bin2dec(rcvd)
%input=[0 3 3 0 1 2 1 3 3 2 0 0 3 0 3 2 3]    %INPUT vector  
%rcvd=['00';'11';'11';'00';'01';'10';'01';'11';'11';'10';'00';'00';'11';'00';'11';'10'; '11']

lim=length(input); %number of clock cycles
for t=1:1:lim %clock loop
%     disp('------------------------------------------------------')
    t; %display current clock instance
    st_hist(1,1)=0;
    if t==0
        st_hist(1,1)=0;        %start at state 00
    else
        temp_state=[];%vector to store possible states at an instant
        temp_metric=[];%vector to store metrics of possible states  
        temp_parent=[];%vector to store parent states of possible states 
        
        for i=1:1:4,
            i; 
            in=input(t);
            if st_hist(i, t)==55  %if invalid state
                %do nothing
            else    
                ns_a=ns_table(i, 2)+1;    %next possible state-1
                ns_b=ns_table(i, 3)+1;    %next possible state-2 
        
                op_a=op_table(i, 2);      %next possible output-1
                op_b=op_table(i, 3);      %next possible output-2
                
                cus=i-1;                   %current state
                    
                M_a=hamm_dist(in, op_a);  %branch metric for ns_a
                M_b=hamm_dist(in, op_b);  %branch metric for ns_b
          
                indicator=0; %flag to indicate redundant states
                
                for k=1:1:length(temp_state) %check redundant next states
                    %if next possible state-1 redundant
                    if temp_state(1,k)==ns_a 
                        indicator=1;
                        %ADD-COMPARE-SELECT Operation
                        %em_c: error metric of current state
                        %em_r: error metric of redundant state
                        em_c=M_a + aem(i,t);
                        em_r=temp_metric(1,k) + aem(temp_parent(1, k)+1,t);                        
                        if em_c< em_r%compare the two error metrics
                            st_hist(ns_a,t+1)=cus;%select state with low AEM
                            temp_metric(1,k)=M_a;
                            temp_parent(1,k)=cus;
                        end
                    end
                    %if next possible state-2 redundant
                    if temp_state(1,k)==ns_b
                        indicator=1;
                        em_c=M_b + aem(i,t);
                        em_r=temp_metric(1,k) + aem(temp_parent(1, k)+1,t);
                        
                        if em_c < em_r %compare the two error metrics
                            st_hist(ns_b,t+1)=cus;%select state with low AEM
                            temp_metric(1,k)=M_b;
                            temp_parent(1,k)=cus;
                        end 
                    end 
                end     
                %if none of the 2 possible states are redundant
                if indicator~=1
                    %update state history table
                    st_hist(ns_a,t+1)=cus; 
                    st_hist(ns_b,t+1)=cus;
                    %update the temp vectors accordingly                   
                    temp_parent=[temp_parent cus cus];
                    temp_state=[temp_state ns_a ns_b];
                    temp_metric=[temp_metric M_a, M_b];
                end
                %print the temp vectors
                temp_parent;
                temp_state;
                temp_metric;  
            end   
        end
        %update the AEMs (accumulative error metrics) for all states for
        %current instant 't'
        for h=1:1:length(temp_state)
            xx1=temp_state(1, h);
            xx2=temp_parent(1, h)+1;
            aem(xx1, t+1)=temp_metric(1, h) + aem(xx2, t);
        end 
    end
end %end of clock loop

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                       T R A C E - B A C K   Part
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for t=1:1:lim
   % slm=min(aem(:, t));
    %slm_loc=find( aem(:, t)==slm );
    slm=min(aem(:, t+1));
    slm_loc=find( aem(:, t+1)==slm );
    sseq(t+1)=slm_loc(1)-1;
end

dec_op=[];
for p=1:1:length(sseq)-1
    p;
    dec_op=[dec_op, transition_table((sseq(p)+1), (sseq(p+1)+1))];
end
0
Reply kayabread 1/23/2010 9:38:05 AM


0 Replies
320 Views

(page loaded in 4.84 seconds)

Similiar Articles:













7/20/2012 4:12:23 AM


Reply: