⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 runsim.asv

📁 MATLAB Simulation of OFDM System
💻 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 + -