📄 func_findmarg.m
字号:
% find margin%% yy, 01-july-2007function [runtime_BLER,runtime_marg] = ... func_findmarg(state,fd,t_rms,subN,F_LA,F_PA,Nframe,cdrt,M,... misnr,stp,mxsnr,targetFER,... Ptotal,BO_dB,use_HPA_flg,LA_thres,LA_marg,deltMG,buffer_length,... chnums,sampling_rate,flg_offset,flg_csi_err,DELAY,... N,cp_l,BW,Nsymbol,dirname,allow_load_oldres,Root_path)threshold = LA_thres + LA_marg;P_use = 10.^(-BO_dB/10);stbc = 1;T_Symbol = (N+cp_l)/(BW*sampling_rate);sys = {'SISO','MRC1x2','Alt2x1','EGC1x2','AS2x1','ALT2x2','AS2x2'};T_n=[1,1,2,1,2,2,2]; %Transmitter diversity branches [SIMO,MRC,MISO,EGC,MISO-AS]R_n=[1,2,1,2,1,2,2]; %Receiver diversity branches [SIMO,MRC,MISO,EGC,MISO-AS]T_div=T_n(state); %Specify transmitter diversity branchesR_div=R_n(state); %specify receiver diversity branchesch = channelgenerator2(t_rms,fd,sampling_rate,N,cp_l,BW,chnums + F_LA * Nsymbol + DELAY,T_div*R_div);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%filename = ['MG_','f',num2str(fd),'_t',num2str(t_rms),'_N',num2str(subN),'_L',num2str(F_LA),... '_M',num2str(M),'F',num2str(round(10*cdrt)),'_E',num2str(flg_csi_err),... 'c',num2str(flg_offset),'D',num2str(DELAY),'BO',num2str(BO_dB),'HPA',num2str(use_HPA_flg),'marg',num2str(LA_marg),'.mat'];dirname = [Root_path,'/sys_link_result/link_lv_result/',dirname];filepath = [dirname,'/',filename];if allow_load_oldres && exist(filepath,'file'), load(filepath);else %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% update_idx = 0; buffer_pointer = 0; rdstate = 4831; snr_ix = 0; Num_grp=floor(N/subN); for snr=misnr:stp:mxsnr snr_ix=snr_ix+1; frame_ix = 0; noisePowPerSubC = 1/10^(snr/10)/N; for la_ix=1:floor(Nframe/F_LA) rnd = randint(1,1,chnums) + 1; index = rnd: (rnd + F_LA * Nsymbol-1 + DELAY); h = ch(:,index,:); H = func_add_csi_err(h,N,flg_csi_err); [H_comb,H_LA,ps]=selectAntenna2(H,N,subN,state,T_div); g_subN = FixP_rx_subN_gain(H_comb,H_LA,N,subN,state,T_div,R_div); P_max = Ptotal * P_use/N/T_div*ones(floor(N/subN),1); % power per subCarrier if state == 5 || state == 7, P_mat = P_mat*T_div; end P_need = 10^((threshold)/10) * noisePowPerSubC ./g_subN; P = min(P_need,P_max); B = log2(M) * (P_max>=P_need); code_rate = cdrt * (P_max>=P_need); [T_mod,T_sent,coded,intleav,fact1,real_len,raw_len,t] = ... T_mod_cod_intlv(N,subN,B,P,Nsymbol,code_rate,rdstate,T_div,ps,state);% tf(snr_ix,la_ix) = sum(B~=0)*F_LA;%length(find(B~=0))*F_LA; % should be N/subN * F_LA% tb_u(snr_ix,la_ix) = sum(B)*subN*Nsymbol*F_LA;% tb_c(snr_ix,la_ix) = sum(raw_len)*F_LA; %for pa_ix = 1:F_LA/F_PA % index2 = (pa_ix-1)*F_PA*Nsymbol+1; if stbc == 1, T_trans=BT_alamouti(T_mod,Nsymbol,state); else T_trans=BT_alamouti2(T_mod,state,N); end for nf = 1:F_LA%F_PA % frame index within each PA window frame_ix = frame_ix + 1; buffer_pointer = mod(buffer_pointer,buffer_length) + 1; %g_multiSymbols = FixP_rx_subN_gain(H_comb,H_LA,N,subN,state,T_div,R_div,NaN); %Post_SNR_meas(snr_ix,frame_ix,1:Num_grp)=g_multiSymbols.*P/noisePowPerSubC; index3 = ((nf-1)*Nsymbol+1:nf*Nsymbol); %index3 = index2-1+((nf-1)*Nsymbol+1:nf*Nsymbol); %save yytmp index3 h2=h(:,index3+DELAY,:); % only in the channel part, and combining part, no delay R_dfs=BTR_ofdm(h2,N,cp_l,T_trans,snr,T_div,R_div,Nsymbol,flg_offset,fd,BW,sampling_rate,noisePowPerSubC); H2 = H_comb(:,index3+DELAY,:); % here, use H at the receiver, no delay if stbc == 1, R_comb=BR_combiner(R_dfs,H2,state); else R_comb=BR_combiner2(R_dfs,H2,state); end %sdnr_measured_each_frame(snr_ix,frame_ix)=mean(mean(abs(T_mod).^2))/(mean(mean(abs(T_mod-R_comb).^2))); % [blk_err_c(snr_ix,frame_ix,1:Num_grp),blk_tot_c(snr_ix,frame_ix,1:Num_grp),bit_err_u(snr_ix,frame_ix,1:Num_grp),bit_tot_u(snr_ix,frame_ix,1:Num_grp),bit_err_c(snr_ix,frame_ix,1:Num_grp),bit_tot_c(snr_ix,frame_ix,1:Num_grp),wb_u(snr_ix,frame_ix),wb_c(snr_ix,frame_ix),tp_uu(snr_ix,frame_ix),tp_cc(snr_ix,frame_ix),wf_u(snr_ix,frame_ix),wf_c(snr_ix,frame_ix)]...% = R_mod_cod_intlv(N,subN,R_comb,fact1,B,rdstate,code_rate,real_len,t,coded,T_sent,intleav); [blk_err_c(buffer_pointer,1:Num_grp),blk_tot_c(buffer_pointer,1:Num_grp)]... = R_mod_cod_intlv(N,subN,R_comb,fact1,B,rdstate,code_rate,real_len,t,coded,T_sent,intleav); if buffer_pointer == buffer_length % update margin BLER = sum(sum(blk_err_c)) / sum(sum(blk_tot_c)); if BLER > 1.2 * targetFER threshold = threshold + deltMG; elseif BLER < 0.8 * targetFER threshold = threshold - deltMG; end disp(['BLER:',num2str(BLER),'; Instant_thres:',num2str(threshold),'dB; Margin:',num2str(threshold - LA_thres),'dB']); update_idx = update_idx + 1; runtime_BLER(update_idx) = BLER; runtime_marg(update_idx) = threshold - LA_thres; end end end disp(['SNR= ',num2str(snr),'dB finished']); end if ~exist(dirname,'dir'), mkdir(dirname); end; desp = [sys{state},filename]; marg = threshold - LA_thres; save(filepath,'desp','LA_thres','marg','runtime_marg','runtime_BLER');end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -