📄 main_ldpc_64k.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% game is begining
clear all;
diary 64k_ldpc;
% 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');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 生成 H
rows=1408;
cols=2816;
% h=gen_ldpc(rows,cols);%generates a 100 x 200 H matrix( the IG parity
%check matrix)
% [newh,rearranged_cols]=rearrange_cols(h);
% for i=1:rows
% for j=1:rows
% A(i,j)=newh(i,j);
% end
% end
% for i=1:rows
% for j=rows+1:cols
% B(i,j-rows)=newh(i,j);
% end
% end
% d=mul_GF2(inv_GF2(A),B);
% clear j;
%%%%%%%%%%%%%%%%%%%%%%%%% 生成 H 完成
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 设定 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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一个BER
% one snr simulation start
while ((errs_pernEN(nEN) < sim_consts.errAll) & (nframe < sim_consts.nframeAll))
% info block count
nframe = nframe + 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 信息产生
s=zeros(1,(cols-rows));
for i=1:cols-rows
s(i)=round(rand);
end
x=s;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 信息产生完毕
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 编码
s=s';
% d=mul_GF2(inv_GF2(A),B);
c=mul_GF2(d,s);
u1=c;
for i=rows+1:cols
u1(i)=s(i-rows);
end
u=reorder_bits(u1,rearranged_cols);
en_output=u';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 编码结束
% en_output=randint(1,2816); % 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(1408,1);
for fIdx = 1:4
s = zeros(352, 1);
s(:) = s_all((fIdx-1)*352+1:fIdx*352);
r_middle= send(s,snr); % child function, type 'help send' to see the detail
r_all((fIdx-1)*352+1:fIdx*352) = r_middle(:);
end
% demodulation
for i=1:length(sort_output)/2
r_s((i-1)*2+1) = real(r_all(i)) ;
r_s(i*2) = imag(r_all(i)) ;
end
% desort
desort_r = desorts(r_s, sim_consts.sortT);
% decode field
r = zeros(1,2816);
r(:) = desort_r(1:2816);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 译码
No=8/(10^(snr/10));
amp=1;
scale(1:length(r))=0.8862;
vhat=decode_ldpc(r,No,amp,h,scale);
final_bits=extract_mesg(vhat,rearranged_cols);
final_bits';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 译码结束
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 统计
err = length(find(final_bits>0 ~= x));
errs_pernEN(nEN)=errs_pernEN(nEN)+err;
if err>0
% nferr(nEN)=nferr(nEN)+1;
nferr_pernEN(nEN)=nferr_pernEN(nEN)+1;
end
% nferr_pernEN(nEN)=nferr_pernEN(nEN)+nferr(nEN);
% 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=(cols-rows)*nframe;
% errs_pernEN(nEN)=errs_pernEN(nEN);
% nferr_pernEN(nEN)=nferr_pernEN(nEN);
ber(nEN) = errs_pernEN(nEN)/((cols-rows)*nframe);
fer(nEN) = nferr_pernEN(nEN) / nframe;
end
fprintf('***** ber *****\n');
fprintf('%6.2e ', ber(:));
fprintf('\n');
fprintf('***** fer *****\n');
fprintf('%6.2e ',fer(:));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% EbN0 序列结束
semilogy(EbN0,ber,'*-');
hold on;
semilogy(EbN0,fer,'o-');
xlabel('Eb/No in dB');
ylabel('BER');
legend('N=2816,R=1/2',3);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% game is over
diary off;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -