📄 main.m
字号:
% main
% to simulation the performance of woven codec under AWGN
clear all;
% Write display messages to a text file
diary woven_sova.txt
set_sim_consts
global sim_consts;
% init
EbN0 = sim_consts.EbN0 ;
error_bits = 0; % Error bits overall
R = sim_consts.Ro * sim_consts.Ri ;
L_info = sim_consts.L_o - sim_consts.mo ;
fprintf('\n-----------------------------------------------------------------\n');
fprintf('+ + + + Please be patient. Wait a while to get the result. + + + +\n');
for nEN = 1:length(EbN0)
en = 10^(EbN0(nEN)/10); % convert Eb/N0 from unit db to normal numbers
L_c = 4 * sim_consts.a * en * R; % reliability value of the channel
sigma = 1/sqrt(2*R*en); % standard deviation of AWGN noise
errs(nEN, 1:sim_consts.niter) = zeros(1, sim_consts.niter) ;
nferr(nEN, 1:sim_consts.niter) = zeros(1, sim_consts.niter) ;
nframe = 0; % clear counter of transmitted frames
while nferr(nEN, sim_consts.niter) < sim_consts.ferrlim
nframe = nframe + 1;
if nframe > sim_consts.nframeAll
break;
end
x = randint(1, L_info*sim_consts.enco.k*sim_consts.Lo); % Random data
[en_output test] = woven(x, sim_consts.Lo, sim_consts.Go, sim_consts.Li, sim_consts.Gi); % encoder output (+1/-1)
r = L_c*(en_output + sigma*randn(size(en_output))); % received bits
yi = reshape(r, sim_consts.Li, size(r,2)/sim_consts.Li);
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
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
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) ;
if rem(nframe, 3) == 0 | nferr(nEN, sim_consts.niter) == sim_consts.ferrlim | errs(nEN, sim_consts.niter) > 20
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) > 20
break;
end
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -