📄 total_sim_adaptive_blind.m
字号:
%
% SISO-OFDM Subcarrier-Adaptive
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ber, per, throughput, mean_SNRdB, Mode_err] = ...
total_sim_adaptive_blind(info_byte, Cycle, Coding_Rate, SNR, Model, Doppler_Speed, SNR_Th, sub_in_group, Blind_Detection)
%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%/ %%%%%%%%%%%%%%%%%%%%%
rand('state',0);
sub_per = 0;
sub_mean_SNRdB = zeros(1,Cycle);
sub_ber = zeros(1,Cycle);
sub_CBPS = zeros(1,Cycle);
sub_DBPP = zeros(1,Cycle);
packet_Mode_err = 0;
Num_trans_packet = Cycle;
act_sym = 6;
MAC_header = MAC_head; % LLC
v0_kmh = Doppler_Speed;
CarrierFrequency_Hz = 5.25e9;
Wavelength_m = 3e8/CarrierFrequency_Hz;
v0_ms = v0_kmh/3.6;
f_D_Hz = v0_ms/Wavelength_m;
fid = fopen('mode_est_error.txt','w');
fclose(fid);
switch(Model)
case 0
Multipath_Delay = 0;
Multipath_Gain = 0;
case 1
Multipath_Delay = [0 10 20 30 40 50 60 70 80 90 110 140 170 200 240 290 340 390] * 10^(-9);
Multipath_Gain = [0.0 -0.9 -1.7 -2.6 -3.5 -4.3 -5.2 -6.1 -6.9 -7.8 -4.7 -7.3 -9.9 -12.5 -13.7 -18.0 -22.4 -26.7];
case 2
Multipath_Delay = [0 10 20 30 50 80 110 140 180 230 280 330 400 490 600 730 880 1050] * 10^(-9);
Multipath_Gain = [-3.3 -3.6 -3.9 -4.2 0.0 -0.9 -1.7 -2.6 -1.5 -3.0 -4.4 -5.9 -5.3 -7.9 -9.4 -13.2 -16.3 -21.2];
case 3
Multipath_Delay = [0 10 20 40 70 100 140 190 240 320 430 560 710 880 1070 1280 1510 1760] * 10^(-9);
Multipath_Gain = [-4.9 -5.1 -5.2 -0.8 -1.3 -1.9 -0.3 -1.2 -2.1 0.0 -1.9 -2.8 -5.4 -7.3 -10.6 -13.4 -17.4 -20.9];
otherwise
error('Not prepared for this channel model.');
end
ch = rayleighchan(1/(80*10^6), f_D_Hz, Multipath_Delay, Multipath_Gain);
ch.ResetBeforeFiltering = 0;
% ------------ Mode --------------
for Z=0:Cycle
%Mapping decision
if Z == 0
Mode = 3*ones(1,480); %
Num_ofdm_sym = cal_symbol_adaptive(info_byte, Mode, Coding_Rate);
else
[Mode, SNRdB_each] = criterion2_group(feed_back_CSI, pwr_n, SNR_Th, sub_in_group);
sub_mean_SNRdB(Z) = mean(SNRdB_each);
Num_ofdm_sym = cal_symbol_adaptive(info_byte, Mode, Coding_Rate);
end
if ((Num_ofdm_sym >= 1) && (Num_ofdm_sym <= 70))
source_dat = source_generator_adaptive_code(info_byte, MAC_header, Num_ofdm_sym, Mode, Coding_Rate);
else
source_dat(1,1) = 'n';
end
if char(source_dat(1,1)) == 'n'
demap_dat = 110*ones(1,Num_ofdm_sym);
trans_dat = [];
Num_trans_packet = Num_trans_packet - 1;
else
coded_dat = conv_encord_adaptive(source_dat, Coding_Rate);
inter_dat = interleave_adaptive_new(coded_dat, Mode);%cmdadd
for I=1:Num_ofdm_sym
map_dat(:,I) = mapping_adaptive(inter_dat(:,I), Mode);
end
pilot_add=[zeros(1,Num_ofdm_sym); ...
map_dat(1:22,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(23:44,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(45:66,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(67:88,:); ...
-ones(1,Num_ofdm_sym); ...
map_dat(89:110,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(111:132,:); ...
-ones(1,Num_ofdm_sym); ...
map_dat(133:154,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(155:176,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(177:198,:); ...
-ones(1,Num_ofdm_sym); ...
map_dat(199:220,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(221:240,:); ...
zeros(11,Num_ofdm_sym); ...
map_dat(241:260,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(261:282,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(283:304,:); ...
-ones(1,Num_ofdm_sym); ...
map_dat(305:326,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(327:348,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(349:370,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(371:392,:); ...
-ones(1,Num_ofdm_sym); ...
map_dat(393:414,:); ...
-ones(1,Num_ofdm_sym); ...
map_dat(415:436,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(437:458,:); ...
ones(1,Num_ofdm_sym); ...
map_dat(459:480,:)];
ifft_dat = ifft(pilot_add, 512);
gi_add = [ifft_dat(449:512,:); ifft_dat];
trans_dat = reshape(gi_add,576*Num_ofdm_sym,1);
end
if (Multipath_Delay==0)
multipath_add = trans_dat;
else
multipath_add = filter(ch, trans_dat);
end
signal_power = mean(abs(trans_dat) .* abs(trans_dat));
SNR0 = SNR -10*log10(512/480);
noise_add = awgn(multipath_add, SNR0, 10*log10(signal_power), 'dB');
gi_rem = synchro_dat(65:576,:);
fft_dat = fft(gi_rem, 512);
pilot_rem = rem_pilot(fft_dat);
rec_pilot = ex_pilot(fft_dat);
end
rec_pream_fft1=fft(noise_add(288+1:800), 512);
rec_pream_fft2=fft(noise_add(800+1:1312), 512);
rec_pream_fft_ave = (rec_pream_fft1 + rec_pream_fft2) ./2;
source_pream_fft=fft(long_pre(128+1:640), 512);
data_shift = rec_pream_fft_ave ./ (source_pream_fft + 10^(-12));
feed_back_CSI = rem_pilot(data_shift);
pilot_h = ex_pilot(data_shift);
h = feed_back_CSI;
pwr_n = mean(abs(rec_pream_fft1-rec_pream_fft2).^2)/2;
if Z>=1 && char(source_dat(1,1)) ~= 'n'
Mode_est = mode_estimator_rev2(pilot_rem, h, sub_in_group, act_sym, Mode, SNR_Th, Blind_Detection);
end
if Z>=1 && char(source_dat(1,1)) ~= 'n'
temp_Mode_err = 0;
for I=1:480
if Mode_est(I) ~= Mode(I)
temp_Mode_err = temp_Mode_err + 1;
end
end
if sum(temp_Mode_err) == 0
for I=1:Num_ofdm_sym
equ_dat(:,I) = pilot_rem(:,I)./h;
end
for I = 1:Num_ofdm_sym
demap_dat(:,I) = soft_demap_adaptive_fast_CSI(equ_dat(:,I), Mode, h, pwr_n);
end
deinter_dat = deinterleave_adaptive_new(demap_dat,Mode);
for I=1:Num_ofdm_sym
viterbi_dat(:,I)=soft_viterbi_adaptive_fast(deinter_dat(:,I), Mode, Coding_Rate);
end
sub_ber(Z) = ber_calc(viterbi_dat, source_dat);
if(sub_ber(Z) ~= 0)
sub_per = sub_per + 1;
end
else % In case of Mode Estimation Error
packet_Mode_err = packet_Mode_err + 1;
sub_ber(Z) = 0.5;
sub_per = sub_per + 1;
end
end
y_ = filter(ch, ones(1,2000));
clear source_dat coded_dat inter_dat map_dat synchro_dat equ_dat demap_dat fading_add deinter_dat viterbi_dat;
end
if Num_trans_packet >= 1
Mode_err = packet_Mode_err/Num_trans_packet;
ber = sum(sub_ber)/Num_trans_packet;
per = sub_per/Num_trans_packet;
CBPS = sum(sub_CBPS)/Num_trans_packet;
DBPS = Coding_Rate * CBPS;
throughput = sum(sub_DBPP)/((Num_ofdm_sym*Num_trans_packet*7.2+Cycle*16.4)*10^(-6)); % Mbps 僽儔僀儞僪偺偨傔僔僌僫儖僔儞儃儖側偟
mean_SNRdB = sum(sub_mean_SNRdB)/Cycle;
else
Mode_err = 1;
ber = 1;
per = 1;
DBPS = 0;
throughput = 0;
mean_SNRdB = sum(sub_mean_SNRdB)/Cycle;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -