📄 runsim.asv
字号:
function runsim(sim_options)
% 调用set_sim_consts设置仿真中要用到的参数。
set_sim_consts;
fclose all;
delete wlan.dat;
snr_to_simulate=sim_options.SNR;
start_time = clock;
for nloop=1:length(snr_to_simulate)
% 设置随机数产生器的初始状态
rand('state',sum(100*clock));%resets it to a different state each time.
randn('state',sum(100*clock));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Main simulation loop
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Initialize trellis tables for Viterbi decoding
rx_init_viterbi;
num_right_detect_pack =0;
right_detpack_ratio =zeros(1,length(snr_to_simulate)); %分组检测率
pack_edge =zeros(1,sim_options.PktsToSimulate);
mean_pack_edge =zeros(1,length(snr_to_simulate)); %分组检测的均值
var_pack_edge =zeros(1,length(snr_to_simulate)); %分组检测的方差
% counters for information bits
num_inf_bits = 0;
num_inf_bit_errors = 0;
num_inf_packet_errors = 0;
inf_ber = zeros(1,length(snr_to_simulate));
inf_per = zeros(1,length(snr_to_simulate));
% counters for raw (uncoded) bits
num_raw_bits = 0;
num_raw_bit_errors = 0;
num_raw_packet_errors = 0;
raw_ber = zeros(1,length(snr_to_simulate));
raw_per = zeros(1,length(snr_to_simulate));
% Simulation the number of packets specified
packet_count = 0;
%while packet_count < sim_options.PktsToSimulate*(1+nloop*0.25)
while packet_count < sim_options.PktsToSimulate
packet_count = packet_count + 1;
% Simulate one packet with the current options
[flag, thres_idx, inf_bit_cnt, inf_bit_errors, raw_bits_cnt, raw_bit_errors] = ...
single_packet(sim_options,snr_to_simulate(nloop));
num_right_detect_pack =num_right_detect_pack + flag;
pack_edge(packet_count)=thres_idx;
num_inf_bits = num_inf_bits + inf_bit_cnt;
num_inf_bit_errors = num_inf_bit_errors + inf_bit_errors;
num_inf_packet_errors = num_inf_packet_errors + (inf_bit_errors~=0);
num_raw_bits = num_raw_bits + raw_bits_cnt;
num_raw_bit_errors = num_raw_bit_errors + raw_bit_errors;
num_raw_packet_errors = num_raw_packet_errors + (raw_bit_errors~=0);
end
right_detpack_ratio(nloop)=num_right_detect_pack/packet_count;
idx=find(pack_edge~=1);
mean_pack_edge(nloop) = sum(pack_edge(idx))/length(idx);
var_pack_edge(nloop) = sum((pack_edge(idx)-mean_pack_edge(nloop)).^2)/(length(idx)-1);
inf_ber(nloop) = num_inf_bit_errors/num_inf_bits;
inf_per(nloop) = num_inf_packet_errors/packet_count;
raw_ber(nloop) = num_raw_bit_errors/num_raw_bits;
raw_per(nloop) = num_raw_packet_errors/packet_count;
fprintf('%8s %8s %10s %10s %10s %9s %10s %8s %10s %10s %9s\n', ...
' SNR |', 'Packet|','pacdet rat|','m_pac_edge|','v_pac_edge|', 'raw errs |', ' raw BER |', 'data errs |',' data BER |', ' raw PER |', 'data PER');
fprintf('%7d|%7d |%10.2e |%10.2e |%10.2e |%8d |%10.2e |%10d |%10.2e |%10.2e |%10.2e\n',...
snr_to_simulate(nloop),packet_count,right_detpack_ratio(nloop),mean_pack_edge(nloop),var_pack_edge(nloop),num_raw_bit_errors, raw_ber(nloop), num_inf_bit_errors, inf_ber(nloop), raw_per(nloop), inf_per(nloop));
fid = fopen('wlan.dat','a');
fprintf(fid,'%7d\t%10.2e\t%10.2e\t%10.2e\t%10.2e\t%10.2e\t%7d\t%10.2e\n', ...
snr_to_simulate(nloop),raw_ber(nloop),inf_ber(nloop), raw_per(nloop), inf_per(nloop),right_detpack_ratio(nloop),mean_pack_edge(nloop),var_pack_edge(nloop));
fclose(fid);
end
stop_time = clock;
elapsed_time = etime(stop_time,start_time);
fprintf('Simulation duration: %g seconds\n',elapsed_time);
load wlan.dat;
snr_prac(:,1)=wlan(:,1);
raw_ber_prac(:,1)=wlan(:,2);
inf_ber_prac(:,1)=wlan(:,3);
raw_per_prac(:,1)=wlan(:,4);
inf_per_prac(:,1)=wlan(:,5);
pack_det_rat(:,1)=wlan(:,6);
mean_pac_edge(:,1)=wlan(:,7);
var_pac_edge(:,1)=wlan(:,8);
figure;
semilogy(snr_prac(:),raw_ber_prac(:),'k-*');
hold on;
semilogy(snr_prac(:),inf_ber_prac(:),'r-o');
ylabel('BER');
xlabel('SNR');
legend('未BER','INFBER')
grid on;
hold off;
figure;
semilogy(snr_prac(:),raw_per_prac(:),'g-+');
hold on;
semilogy(snr_prac(:),inf_per_prac(:),'b-^');
ylabel('PER');
xlabel('SNR');
legend('RAWPER','INFPER')
grid on;
hold off;
figure;
plot(snr_prac(:),pack_det_rat(:),'r-*');
xlabel('SNR');
ylabel('分组检测率');
grid on;
figure;
subplot(1,2,1);
plot(snr_prac(:),mean_pac_edge(:),'b-*');
axis([0 40 0 535]);
xlabel('SNR');
ylabel('分组检测的均值');
grid on;
subplot(1,2,2);
semilogy(snr_prac(:),var_pac_edge(:),'g-*');
xlabel('SNR');
ylabel('分组检测的方差');
grid on;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -