📄 main_conv.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% game is begining
clear all;
% set global simulation parameters
set_sim_consts;
global sim_consts;
% init
EbN0 = sim_consts.EbN0 ;
% R = sim_consts.Ro * sim_consts.Ri ; % code rate
% L_info = sim_consts.L_o - sim_consts.mo ; % length to passing into outer encodec
% printf info to the screen
fprintf('\n-----------------------------------------------------------------\n');
fprintf('+ + + + Please be patient. Wait a while to get the result. + + + +\n');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
leg=9;
codegenerate=[557 663 711];
trellies=poly2trellis(leg,codegenerate);
tablen=9;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 设定 EbN0 序列
errs_pernEN=zeros(1,length(EbN0));
nferr_pernEN=zeros(1,length(EbN0));
% nferr=zeros(1,length(EbN0));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% EbN0 序列
for nEN = 1:length(EbN0)
snr=EbN0(nEN)-9;
% en = 0.5*10^(snr/10); % convert Eb/N0 from unit db to normal numbers
errs_pernEN(nEN)=0;
nfeer_pernEN(nEN)=0;
nframe = 0; % init counter of transmitted blocks
nferr=0; % init counter of transmitted blocks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一个BER
% one snr simulation start
while ((errs_pernEN(nEN) < sim_consts.errAll) & (nframe < sim_consts.nframeAll))
% info block count
nframe = nframe + 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 信息产生
x=randint(1,234);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 信息产生完毕
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 编码
source=convenc(x,trellies);
en_output=[source zeros(1,2)];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 编码结束
% en_output=randint(1,704); for test
% rate match
en_output(703:704) = [en_output(702) en_output(702)];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 交织
sort_output = sorts(en_output, sim_consts.sortT);
% modulation
for kk=1:length(sort_output)/2
s_all(kk) = (sort_output((kk-1)*2+1)*2-1) + j*(sort_output(kk*2)*2-1);
end
clear i j;
% through the channel
% spread, frame, channel, estimate, JD, deframe and despread
r_all = zeros(352,1);
for fIdx = 1:4
s = zeros(88, 1);
s(:) = s_all((fIdx-1)*88+1:fIdx*88);
r_middle= send(s,snr); % child function, type 'help send' to see the detail
r_all((fIdx-1)*88+1:fIdx*88) = r_middle(:);
end
% demodulation
for i=1:length(sort_output)/2
r_s((i-1)*2+1) = real(r_all(i))>0 ;
r_s(i*2) = imag(r_all(i))>0 ;
end
% desort
desort_r = desorts(r_s, sim_consts.sortT);
% decode field
% r = zeros(1,704);
% r(:) = desort_r(1:704);
r = zeros(1,702);
r(:) = desort_r(1:702);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 译码
resource=r(1:702);
final_bits=vitdec(resource,trellies,tablen,'trunc','hard');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 译码结束
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 统计
err = length(find(final_bits>0 ~= x));
errs_pernEN(nEN)=errs_pernEN(nEN)+err;
if err>0
nferr=nferr+1;
end
nferr_pernEN(nEN)=nferr_pernEN(nEN)+nferr;
% Count frame errors for the current iteration
% for i = 1:sim_consts.niter
% fprintf( '%8.4e ', ber( nEN, i ) );
% fprintf( '\n ' );
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fprintf( '************** Eb/N0 = %5.2f db **************\n', EbN0(nEN) );
bits_in=234*nframe;
errs_pernEN(nEN)=errs_pernEN(nEN);
nferr_pernEN(nEN)=nferr_pernEN(nEN);
ber(nEN) = errs_pernEN(nEN)/(234*nframe);
fer(nEN) = nferr_pernEN(nEN) / nframe;
end
fprintf('%6.2e ', ber(:));
fprintf('\n');
fprintf('%6.2e ',fer(:));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% EbN0 序列结束
semilogy(EbN0,ber,'*-');
hold on;
semilogy(EbN0,fer,'o-');
xlabel('Eb/No in dB');
ylabel('BER vs FER');
legend('CONV,N=702,R=1/3',3);
diary conv_1_3;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% game is over
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -