📄 main.m
字号:
% main
% to simulation the performance of woven codec under case3 with
% JD
clear all;
% Write display messages to a text file
diary woven_sova.txt
% 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');
for nEN = 1:length(EbN0)
snr=EbN0(nEN) - 13.8; % 13.8 is get 10*lg for C/I = (Eb/No)*((Rc*lg..M)/(B*Q*Tc)), see 25928-401 P.94
% note: here the snr is refer to Ec/No means chip
% and noise radio. All the intercell interference
% is modeled as gaussian white noise.
en = 0.5*10^(snr/10); % convert Eb/N0 from unit db to normal numbers
L_c = 4 * sim_consts.a * en * R; % reliability value of the channel
% init parameter in each simulation of one snr
errs(nEN, 1:sim_consts.niter) = zeros(1, sim_consts.niter) ;
nferr(nEN, 1:sim_consts.niter) = zeros(1, sim_consts.niter) ;
nframe = 0; % init counter of transmitted blocks
% one snr simulation start
while (1)
% info block count
nframe = nframe + 1 ;
% source
x = randint(1, L_info*sim_consts.enco.k*sim_consts.Lo); % Random data
% woven encodec
[ en_output alpha]= ...
woven(x, sim_consts.Lo, sim_consts.Go, sim_consts.Li, sim_consts.Gi); % encoder output (+1/-1)
% rate match
L_b = 88*sim_consts.cNumber*sim_consts.tsNumber*sim_consts.subFrames;
en_output(size(en_output,2)+1:L_b) = en_output(size(en_output,2))*ones(1,L_b-size(en_output,2));
clear L_b;
% interleave
sort_output = sorts(en_output, sim_consts.sortT);
clear en_output;
% modulation
for kk=1:length(sort_output)/2
s_all(kk) = sort_output((kk-1)*2+1) + j*sort_output(kk*2) ;
end
clear sort_output;
% through the channel
% spread, frame, channel, estimate, JD, deframe and despread
L_f = 44*sim_consts.cNumber*sim_consts.tsNumber*sim_consts.subFrames;
L_sf = 44*sim_consts.cNumber*sim_consts.tsNumber;
r_all = zeros(L_f,1);
for fIdx = 1:sim_consts.subFrames
s = zeros(L_sf, 1);
s(:) = s_all((fIdx-1)*L_sf+1:fIdx*L_sf);
r_middle= send(s,snr); % child function, type 'help send' to see the detail
r_all((fIdx-1)*L_sf+1:fIdx*L_sf) = r_middle(:);
clear s r_middle;
end
clear L_sf;
% demodulation
for i=1:L_f
r_s((i-1)*2+1) = real(r_all(i)) ;
r_s(i*2) = imag(r_all(i)) ;
end
clear L_f;
% deinterleave
desort_r = desorts(r_s, sim_consts.sortT);
% woven decode field
r = zeros(1,sim_consts.L_o*sim_consts.enco.k*sim_consts.Lo/R);
r(:) = desort_r(1:sim_consts.L_o*sim_consts.enco.k*sim_consts.Lo/R);
yi = reshape(r, sim_consts.Li, size(r,2)/sim_consts.Li);
mmm(alpha') = extract(r, sim_consts.Gi, sim_consts.Li);
yo = reshape( mmm, sim_consts.Lo, sim_consts.L_o * sim_consts.enco.n);
clear mmm;
% yo = reshape(extract(r, sim_consts.Gi, sim_consts.Li), sim_consts.Lo, sim_consts.L_o * sim_consts.enco.n);
lle_o = zeros(sim_consts.Lo, sim_consts.L_o*sim_consts.enco.n);
lle_i = zeros(sim_consts.Li, sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n/sim_consts.Li);
ll_i = zeros(sim_consts.Li, sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n/sim_consts.Li);
ll_o = zeros(sim_consts.Lo, sim_consts.L_o*sim_consts.enco.n);
for iter = 1:sim_consts.niter
ll_i(1: sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n) = lle_o(:);
for num = 1:sim_consts.Li
[output_i(num, :) lle_i(num, :) ] = sovaI(yi(num, :), ll_i(num, :), sim_consts.ti, sim_consts.win, L_c); % inner sova decoder
end
mmm(alpha') = reshape(lle_i, 1, sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n);
lle_i = reshape(mmm,sim_consts.Li, sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n/sim_consts.Li);
clear mmm ;
ll_o(:) = lle_i(1: sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n);
for num = 1:sim_consts.Lo
[output_o(num, :) lle_o(num, :) ] = sovaO(yo(num, :), ll_o(num, :), sim_consts.win ); % outer sova decoder
end
mmm = reshape(lle_o,1, sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n);
lle_o = reshape(mmm(alpha'),sim_consts.Lo, sim_consts.L_o*sim_consts.enco.n);
clear mmm;
% record the error bit info and error frame bit of each
% iteraction
final_bits = zeros(1, L_info*sim_consts.enco.k*sim_consts.Lo);
final_bits(:) = output_o(1:L_info*sim_consts.enco.k*sim_consts.Lo) ;
% Number of bit errors in current iteration
err(iter) = length(find(final_bits>0 ~= x)) ;
% Count frame errors for the current iteration
if err(iter) > 0
nferr(nEN, iter) = nferr(nEN, iter) + 1 ;
end
end
% Total number of bit errors for all iterations
errs(nEN, 1:sim_consts.niter) = errs(nEN, 1:sim_consts.niter) + err(1:sim_consts.niter) ;
% print the middle simulation info to screen
if rem(nframe, 3) == 0 | nferr(nEN, sim_consts.niter) == sim_consts.ferrlim | nframe > sim_consts.nframeAll
ber(nEN, 1:sim_consts.niter) = errs(nEN, 1:sim_consts.niter)/(L_info*sim_consts.enco.k*sim_consts.Lo*nframe) ; % Bit error rate
fer(nEN, 1:sim_consts.niter) = nferr( nEN, 1:sim_consts.niter ) / nframe ; % Frame error rate
% Display intermediate results in process
fprintf( '************** Eb/N0 = %5.2f db **************\n', EbN0(nEN) );
fprintf( 'Frame size = %d \n', L_info );
fprintf( '%d frames transmitted, %d frames in error.\n', nframe, nferr( nEN, sim_consts.niter ) );
fprintf( 'Bit Error Rate (from iteration 1 to iteration %d):\n', sim_consts.niter );
for i = 1:sim_consts.niter
fprintf( '%8.4e ', ber( nEN, i ) );
end
fprintf( '\n' );
fprintf( 'Frame Error Rate (from iteration 1 to iteration %d):\n', sim_consts.niter ) ;
for i = 1:sim_consts.niter
fprintf( '%8.4e ', fer( nEN, i ) );
end
fprintf( '\n ' );
fprintf( '***********************************************\n\n' );
% Save intermediate results
save woven_sova EbN0 ber fer
if errs(nEN, sim_consts.niter) > sim_consts.errAll | nferr(nEN, sim_consts.niter) == sim_consts.ferrlim | nframe > sim_consts.nframeAll
break;
end
end
end
end
diary off
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -