📄 top.m
字号:
function top
global sim_consts;
global sim_options;
global preamble;
global rows;
global cols;
global h1i;
global h1j;
global psm1j;
global Gp1;
global rearranged_cols;
% Write display messages to a text file
diary sim_log.txt
start_time = clock;
% 固定参数
sim_consts = struct(...
'SampFreq' , 20e6, ...
'NumSubc', 52, ...
'UsedSubcIdx', [7:32 34:59]', ...
'ShortTrainingSymbols', sqrt(13/6)*[0 0 1+j 0 0 0 -1-j 0 0 0 1+j 0 0 0 -1-j 0 0 0 -1-j 0 0 0 1+j 0 0 0 0 0 0 -1-j 0 0 0 -1-j 0 0 0 ...
1+j 0 0 0 1+j 0 0 0 1+j 0 0 0 1+j 0 0], ...
'LongTrainingSymbols', [1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 ...
1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1 1], ...
'PilotScramble', [1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 1 1 1 ...
1 1 -1 1 1 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 1 -1 -1 1 ...
1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 1 -1 1 -1 1 -1 1 -1 ...
-1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1], ...
'NumDataSubc', 48, ...
'NumPilotSubc' , 4, ...
'DataSubcIdx', [7:11 13:25 27:32 34:39 41:53 55:59]', ...
'PilotSubcIdx', [12 26 40 54]', ...
'PilotSubcPatt', [6 20 33 47]', ...
'DataSubcPatt', [1:5 7:19 21:26 27:32 34:46 48:52]', ...
'PilotSubcSymbols' , [1;1;1;-1]);
% 可变参数
sim_options = struct(...
...% 包长度(bits)
'PacketLength', 1008, ...
...% 待仿真的包的个数
'PktsToSimulate', 1000, ...
...% 调制(映射)方式,可选项为'BPSK'、'QPSK'
'Modulation', 'BPSK',...
...% 信噪比,单位dB
'EbNo', 10:0.5:13,...
...% LDPC译码最大尝试次数
'DecMaxIter', 20);
% Set Random number generators initial state
% reset random number generators based on current clock value
rand('state',sum(100*clock));
randn('state',sum(100*clock));
n_bits_per_sym = get_bits_per_symbol(sim_options.Modulation);
rows=504;
cols=1008;
load genH1_504x1008.mat
[h1i h1j]=find(H==1);
h1i=h1i'-1;
h1j=h1j'-1;
f=find(newH(:,cols)==1);
Tsize=f(1);
%因为先进行了转置,所以下标j在前面
[psm1j psm1i]=find((newH(1:Tsize, :)')~=0);
psm1j=psm1j';
% Construction of the preamble
% 构建帧头
preamble = tx_gen_preamble(sim_options);
EbNo=sim_options.EbNo;
SNR=EbNo...
-10*log10(cols/(cols-rows))...%LDPC编码的信噪比损失
-10*log10(sim_consts.NumSubc/sim_consts.NumDataSubc)...%插入导频的信噪比损失
-10*log10(80/64)...%循环前缀的信噪比损失
-10*log10(sqrt(64))...%接收端作FFT导致的信噪比损失
+10*log10(n_bits_per_sym);%MPSK的信噪比增益??
tot_inf_bits = sim_options.PktsToSimulate*sim_options.PacketLength;
tot_raw_bits = tot_inf_bits*(cols/(cols-rows));
disp(['Packets = ' num2str(sim_options.PktsToSimulate) '; tot_inf_bits = ' num2str(tot_inf_bits) '; '...
'tot_raw_bits = ' num2str(tot_raw_bits)]);
fprintf('\n');
inf_bit_errs_mat=zeros(1,length(SNR));
inf_packet_errs_mat=zeros(1,length(SNR));
inf_ber_mat=zeros(1,length(SNR));
inf_per_mat=zeros(1,length(SNR));
raw_bit_errs_mat=zeros(1,length(SNR));
raw_packet_errs_mat=zeros(1,length(SNR));
raw_ber_mat=zeros(1,length(SNR));
raw_per_mat=zeros(1,length(SNR));
for snrloop=1:length(SNR)
snr_start_time = clock;
disp(['EbNo = ' num2str(sim_options.EbNo(snrloop)) 'dB; SNR = ' num2str(SNR(snrloop)) 'dB;']);
% counters for information bits
num_inf_bit_errors = 0;
num_inf_packet_errors = 0;
% counters for raw (uncoded) bits
num_raw_bit_errors = 0;
num_raw_packet_errors = 0;
for packet_count=1:sim_options.PktsToSimulate
[txsignal, tx_inf_bits, tx_raw_bits] = transmitter(sim_options);
rxsignal = channel(txsignal, SNR(snrloop));
[rx_inf_bits, rx_raw_bits] = receiver(rxsignal, sim_options, SNR(snrloop));
raw_bit_errors = length(find(rx_raw_bits~=tx_raw_bits));
inf_bit_errors = length(find(rx_inf_bits~=tx_inf_bits));
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_bit_errors = num_raw_bit_errors + raw_bit_errors;
num_raw_packet_errors = num_raw_packet_errors + (raw_bit_errors~=0);
end
inf_ber = num_inf_bit_errors/tot_inf_bits;
inf_per = num_inf_packet_errors/packet_count;
raw_ber = num_raw_bit_errors/tot_raw_bits;
raw_per = num_raw_packet_errors/packet_count;
inf_bit_errs_mat(snrloop)=num_inf_bit_errors;
inf_packet_errs_mat(snrloop)=num_inf_packet_errors;
inf_ber_mat(snrloop)=inf_ber;
inf_per_mat(snrloop)=inf_per;
raw_bit_errs_mat(snrloop)=num_raw_bit_errors;
raw_packet_errs_mat(snrloop)=num_raw_packet_errors;
raw_ber_mat(snrloop)=raw_ber;
raw_per_mat(snrloop)=raw_per;
save sim_result.mat packet_count tot_inf_bits inf_bit_errs_mat inf_packet_errs_mat inf_ber_mat inf_per_mat...
EbNo SNR tot_raw_bits raw_bit_errs_mat raw_packet_errs_mat raw_ber_mat raw_per_mat;
disp(' data errs | data BER | data PER | raw errs | raw BER | raw PER');
fprintf(' %10d | %10f | %10f | %10d | %10f | %10f\n',...
num_inf_bit_errors, inf_ber, inf_per, num_raw_bit_errors, raw_ber, raw_per);
snr_stop_time = clock;
snr_elapsed_time = etime(snr_stop_time,snr_start_time);
fprintf('This SNR loop Simulation duration: %g seconds\n\n',snr_elapsed_time);
end
stop_time = clock;
elapsed_time = etime(stop_time,start_time);
fprintf('Total Simulation duration: %g seconds\n',elapsed_time);
diary off
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -