📄 hard_viterbi_decode.txt
字号:
%soft viterbi and hard viterbi decode algorithm
clc
clear all
%modifiable parameters
m=2;%totol momery of convolution coder
r=0.5;%code rate
info_length=1000;%info length
g1=[1 1 1];
g2=[1 0 1];
Eb_N0=[1 2 3 4 5 6 ];
%end modifiable parameters
%defaule constant
Lc=4.*Eb_N0;
%end defaule constant
%need calculated constant
sigma=sqrt(1./(2*r.*Eb_N0));
%sigma=0;
%end need calculaterd constant
%generate ramdon informations
info=randint(1,info_length);
%end generate informatons
%convolutional coding
conv_gene=[info,0 0;0 ,info,0;0 0,info];
conv_coded1=mod(g1*conv_gene,2);
conv_coded2=mod(g2*conv_gene,2);
%end convolutional coding
%bpsk modulation
conv_coded1=1-2*conv_coded1;
conv_coded2=1-2*conv_coded2;
%end bpsk modulation
%decode for each Eb_N0
for SNR_i=1:length(Eb_N0)
%generate noise for this Eb_N0 codition
noise=sigma(SNR_i).*randn(1,info_length);
noise=[noise 0 0];
%end generate noise for this Eb_N0 codition
%add noise
receive1=conv_coded1+noise;
receive2=conv_coded2+noise;
%end add noise
%viterbi decode
likelihood_soft_1_4=[0 0 0 0];%initialization to zeros
likelihood_hard_1_4=[0 0 0 0];%initialization to zeros
track=zeros(4,1);
track_temp=zeros(4,2);
for VA_decode_i=1:info_length+m
%hard decision
if receive1(VA_decode_i)>0
hard1_0=1;%error
hard1_1=0;%right
else
hard1_0=0;%right
hard1_1=1;%error
end
if receive2(VA_decode_i)>0
hard2_0=1;%error
hard2_1=0;%right
else
hard2_0=0;%right
hard2_1=1;%error
end
%end hard decision
hard=[hard1_1 hard2_1];
%updata four states accumulation (for hard)
%for S0 ( S0->S0 and S1->S0)
if likelihood_hard_1_4(1)+sum(abs([0 0]-hard))>likelihood_hard_1_4(2)+sum(abs([1 1]-hard))
likelihood_hard_1_4_temp(1)=likelihood_hard_1_4(2)+sum(abs([1 1]-hard));
track_temp(1,:)=[track(2,:) 0];
else
likelihood_hard_1_4_temp(1)=likelihood_hard_1_4(1)+sum(abs([0 0]-hard));
track_temp(1,:)=[track(1,:) 0];
end
%for S1 ( S2->S1 and S3->S1)
if likelihood_hard_1_4(3)+sum(abs([1 0]-hard))>likelihood_hard_1_4(4)+sum(abs([0 1]-hard))
likelihood_hard_1_4_temp(2)=likelihood_hard_1_4(4)+sum(abs([0 1]-hard));
track_temp(2,:)=[track(4,:) 0];
else
likelihood_hard_1_4_temp(2)=likelihood_hard_1_4(3)+sum(abs([1 0]-hard));
track_temp(2,:)=[track(3,:) 0];
end
%for S2 ( S0->S2 and S1->S2)
if likelihood_hard_1_4(1)+sum(abs([1 1]-hard))>likelihood_hard_1_4(2)+sum(abs([0 0]-hard))
likelihood_hard_1_4_temp(3)=likelihood_hard_1_4(2)+sum(abs([0 0]-hard));
track_temp(3,:)=[track(2,:) 1];
else
likelihood_hard_1_4_temp(3)=likelihood_hard_1_4(1)+sum(abs([1 1]-hard));
track_temp(3,:)=[track(1,:) 1];
end
%for S3( S2->S3 and S3->S3)
if likelihood_hard_1_4(3)+sum(abs([0 1]-hard))>likelihood_hard_1_4(4)+sum(abs([1 0]-hard))
likelihood_hard_1_4_temp(4)=likelihood_hard_1_4(4)+sum(abs([1 0]-hard));
track_temp(4,:)=[track(4,:) 1];
else
likelihood_hard_1_4_temp(4)=likelihood_hard_1_4(3)+sum(abs([0 1]-hard));
track_temp(4,:)=[track(3,:) 1];
end
%updata likelihood_hard and track
likelihood_hard_1_4=likelihood_hard_1_4_temp;
track=track_temp;
track_temp(:,VA_decode_i+2)=0;
%end updata likelihood_hard and track
end
%end viterbi decode (for special SNR)
decode_info=track(1,2:info_length+1);
error_num=sum(abs(decode_info-info));
error_rate(SNR_i)=error_num/info_length;
end
error_rate
%disp
semilogy(Eb_N0,error_rate)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -