📄 total_sim_c_1_siso_20.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ber, per] = total_sim_C_1_siso_20(Num_data_sym, Cycle, Mode, Noise_power, Doppler_Speed, GI_mode);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 岆傝晞崋掶惓: 忯傒崬傒晞崋
% Num_data_sym : % 憲怣僨乕僞僔儞儃儖 (No. Data Symbols in one packet)
% Cycle : % 帋峴夞悢 (No. Trials)
% Mode : % 捠怣儌乕僪 (Transmit Mode in IEEE802.11n siso 20Hz)
% Noise_power : % 嶨壒揹椡 (CNR Value)
% Doppler_Speed: % 僪僢僾儔乕懍搙 (1Hz .. 0.22km/h, 20Hz .. 4.32km/h, 50Hz .. 10.8km/h)
% GI_mode : % GI挿 400ns (1) / 800ns (0)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sub_per = 0;
syncro_miss = 0;
syncro_max = 0;
% 僨僶僢僌
% Num_data_sym=10;
% Cycle=10;
% Mode=7;
% Noise_power=100;
% Doppler_Speed=10.8;
% GI_mode=0;
randn('state',0);
rand('state',0);
%------------------------------------------------------------
for Z=1:Cycle
%憲怣僨乕僞偺惗惉 (Generating Transmit Data)
for I=1:Num_data_sym
source_dat(I, :)=source_generatorC_siso_20(Mode);
end
%僗僋儔儞僽儖 (Scramble)
for I=1:Num_data_sym
scramble_dat(I, :)=scrambleC_siso_20(source_dat(I, :), Mode);
end
%忯崬傒晞崋壔 (Convolutional Coding)
for I=1:Num_data_sym
coded_dat(I, :)=conv_encode_siso_20(scramble_dat(I, :), Mode);
end
%僀儞僞乕儕乕僶乮Interleaver乯
for I=1:Num_data_sym
inter_dat(I, :)=interleave_siso_20(coded_dat(I,:), Mode);
end
%儅僢僺儞僌 (Mapping)
for I=1:Num_data_sym
map_dat(I, :)=mapping_siso_20(inter_dat(I, :), Mode);
end
%僷僀儘僢僩怣崋偺憓擖 (Inserting Pilot Signals)
P = [1 1 1 -1];
for I=1:Num_data_sym
pilot_st(I, :) = [zeros(1, 1), map_dat(I, 1:6), P(3), ...
map_dat(I, 7:19), P(4),map_dat(I, 20:26), ...
zeros(1, 7), ...
map_dat(I, 27:33), P(1), map_dat(I, 34:46), P(2), ...
map_dat(I, 47:52)];
P=[P(2:end),P(1)];
end
% IFFT
for I=1:Num_data_sym
ifft_dat(I, :)=ifft(pilot_st(I, :), 64);
end
% GI晅壛 (Adding GI Symbols)
if GI_mode == 0
gi_length = 16; % 800nsec
elseif GI_mode == 1
gi_length = 8; % 400nsec
end
gi_add(:, :) = [ifft_dat(:, 64-gi_length+1:64), ifft_dat(:, :)];
%僾儕傾儞僽儖摍偺晅壛 (Adding Short and Long Preambles)
short_pre=preamble_s_siso_20;
long_pre=preamble_l_siso_20;
signal_fie=signal_field_siso_20;
trans_dat=[];
for I=1:Num_data_sym
trans_dat=[trans_dat, gi_add(I,:)];
end
trans_dat=[short_pre, long_pre, signal_fie, trans_dat];
% 揱攄楬 (Transmit Channel) -----------------------------------------------------
if(mod(Z, 500) == 0)
fprintf(1,'sumber%f', sum(sub_ber));
end
%儗僀儕乕僼僃乕僕儞僌 (Fading Channel)
if(Z==1)
%弶婜埵憡偲1廃婜暘偺億僀儞僩悢傪愝掕
sita = 2 * pi * rand(8,18);
phi = 2 * pi * rand(8,18);
Fading_Period = (1 / (Doppler_Speed * 4.6296)) / (50 * 10^(-9));
Fading_Count = 0;
else
%億僀儞僩悢傪僇僂儞僩丆1廃婜埲忋偱埵憡傪嵞愝掕
Fading_Count = Fading_Count + size(trans_dat,2);
if(Fading_Count > Fading_Period)
Fading_Count = 0;
sita = 2 * pi * rand(8,18);
phi = 2 * pi * rand(8,18);
end
end
for s=1:18
fading_add(s,:) = rayleigh_fading_period(trans_dat, 8, 5*10^9, Doppler_Speed, 20*10^6, 1, sita(:,s), phi(:,s), Fading_Count);
end
% 儅儖僠僷僗 (Multipath Model) -- HIPERLAN/2 Model A (5GHz懷)
multipath_add = multipath_channel_HIPERLAN2_Model_A_18path(fading_add);
% 敀怓嶨壒 (暋慺悢僲僀僘傪壛嶼) (White Noise Channel)
noise_add=awgn(multipath_add, Noise_power, 'measured');
% % 摨婜専弌奐巒売強傪儔儞僟儉偵愝掕 (Set a radom start point in timing synchronization)
% [shift_rec_dat, syncro_shift] = start_point_synchro(noise_add, Num_data_sym, GI_mode);
%
% % 摨婜専弌 (Detecting a frame boundary)
% max_add = synchro_cross_correlation(shift_rec_dat, short_pre, Num_data_sym) - 1;
%
% if max_add~=syncro_shift
% syncro_miss=syncro_miss + 1;
% if( abs(max_add - syncro_shift) > syncro_max)
% syncro_max = abs(max_add - syncro_shift);
% end
% end
%
% % 屻曽摨婜偢傟偵懳張偡傞偨傔5僒儞僾儖暘慜曽偵儅乕僕儞傪庢傞
% max_add = max_add - 5;
%
% % 僔儈儏儗乕僔儑儞僄儔乕夞旔
%
% if(max_add < 2)
% max_add = 1;
% end
%
% if(max_add > 400)
% max_add = 400;
% end
shift_rec_dat = noise_add;
max_add = 0;
%摨婜揰偵婎偯偄偰僨乕僞晹傪愗傝弌偡
for I=1:Num_data_sym
synchro_dat(I,:)= shift_rec_dat(480+max_add+(I-1)*(64+gi_length)+1 : 480+max_add+I*(64+gi_length));
end
%-----------------------------------------------------
% GI彍嫀 (Removing GI symbols)
gi_rem(:, :) = synchro_dat(:, gi_length+1:end);
% FFT
for I=1:Num_data_sym
fft_dat(I, :)=fft(gi_rem(I, :), 64);
end
%摍壔 (Channel Equalization) ---------------------------------------------
%摍壔梡僨乕僞偺FFT
% 僠儍僱儖摍壔怣崋傪儘儞僌僾儕傾儞僽儖偐傜庢傝弌偡
% (Extracting training symbols from long preambles)
rec_pream_fft=fft(shift_rec_dat(max_add+193:max_add+256), 64);
% 嶲徠怣崋 (Reference Symbols)
source_pream_fft=fft(long_pre(33:96), 64);
%曗惓検偺寁嶼 (Calculating Channel Distortion)
data_shift=rec_pream_fft./(source_pream_fft + 10^(-10));
%摍壔偺幚峴 (Correcting the channel)
for I=1:Num_data_sym
equ_dat(I, :)=fft_dat(I, :)./data_shift; %摍壙偁傝
end
%-------------------------------------------------
%埵憡僩儔僢僉儞僌, 枹幚憰 (Phase Tracking)
phrcv_dat=equ_dat;
%僷僀儘僢僩怣崋彍嫀 (Removing pilot symbols)
for I=1:Num_data_sym
pilot_rem(I, :)=[phrcv_dat(I, 2:7), phrcv_dat(I, 9:21), phrcv_dat(I, 23:29), phrcv_dat(I, 37:43), phrcv_dat(I, 45:57), phrcv_dat(I, 59:64)];
end
%僨丒儅僢僺儞僌 (De-mapping)
for I=1:Num_data_sym
demap_dat(I, :)=soft_demap_siso_20_approx(pilot_rem(I, :), Mode);
end
%僨丒僀儞僞乕儕乕僽(De-interleaver)
for I=1:Num_data_sym
deinter_dat(I, :)=deinterleave_siso_20(demap_dat(I, :), Mode);
end
% Viterbi暅崋壔 (Viterbi Decoding)
for I=1:Num_data_sym
viterbi_dat(I, :)=soft_viterbi_siso_20(deinter_dat(I, :), Mode);
end
% 僨丒僗僋儔儞僽儖 (De-scramble)
for I=1:Num_data_sym
descramble_dat(I, :)=scrambleC_siso_20(viterbi_dat(I, :), Mode);
end
% sub-BER應掕 (Evaluating BER)
sub_ber(Z)=ber_calc_siso_20(descramble_dat, source_dat, Mode, Num_data_sym);
% PER寁嶼 (Counting No. packet errors)
if(sub_ber(Z) ~= 0)
sub_per = sub_per + 1;
end
end
ber=sum(sub_ber)/Z;
per=sub_per/Z;
syr=syncro_miss/Z;
fprintf(1,'\nSynchroMiss %d Iteration %d Rate %3.7f\n', syncro_miss, Z, syr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -