clear all;
clc;
cycl = 50;
snr_db = 0:1:10;
% 输入信息
msg = randint(1,1024);
ber0 = zeros(cycl,length(snr_db));
ber1 = zeros(cycl,length(snr_db));
ber2 = zeros(cycl,length(snr_db));
% Trellises
trel = poly2trellis(3,[7 5]); %Define trellis for rate 1/2 code.
for n = 1:cycl
for x = 1:length(snr_db)
% Code words
code = convenc(msg,trel); % Encode.
% Interleaver
state = 10;
inter = randintrlv(code,state);
% BPSK 调制
s0 = sign(msg - 0.5);
s1 = sign(inter-0.5);
%s2 = sign(code-0.5);
% AWGN Channel
add_noise0=awgn(s0,snr_db(x),'measured');
add_noise1=awgn(s1,snr_db(x),'measured');
% Deinterleaver with noise for soft decoding
deinter_noise = randdeintrlv(add_noise1,state);
% 解调
r_0 = 0.5*sign(add_noise0) + 0.5;
r_1 = 0.5*sign(add_noise1) + 0.5;
% Deinterleaver
deinter_1 = randdeintrlv(r_1,state);
% Traceback length
tblen = 21;
% vitdec 硬判决
decoded1 = vitdec(deinter_1,trel,tblen,'cont','hard');
% vitdec 软判决
[y,qcode] = quantiz(deinter_noise,[-1.5 -1 -.5 0 .5 1 1.5 ],0:1:7);
decoded2 = vitdec(qcode,trel,tblen,'cont','soft',3);
% 比较误码率