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

📄 top.m

📁 此代码是LDPC码进行BP算法的重要参考代码
💻 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 + -