- 经验
- 24
- 分贝
- 0
- 家园分
- 39
- 在线时间:
- 0 小时
- 最后登录:
- 2009-9-3
- 帖子:
- 4
- 精华:
- 0
- 注册时间:
- 2009-8-29
- UID:
- 427435
注册:2009-8-29
|
% A very simple case to start with
% Basic OFDM system with MIMO support.
% Fixed modulation & coding across the whole bandwidth
% Different Doppler & delay spread supported.
%
% yuanye, 22-October-2007
clear all;close all;clc
state = 1; % MIMO scheme, state = 1 means SISO
fd = 0; % Doppler frequency in Hz
t_rms = 0; % Delay spread in mu s
subN = 16; % No. of sub-carriers in each sub-channel
F_LA = 1; % Link Adaptation Resolusion, useless here.
Nframe = 100; % Total No. of frames to be simulated
cdrt = 1/2; % Coding rate
M = 4; % M-QAM
misnr = 0; % minimum simulated SNR in dB
stp = 3; % SNR simulation step
mxsnr = 15; % maximum simulated SNR in dB
chnums = 1000; % No. of channel realizations, should be larger than the total simulated symbols (frames * 6)
sampling_rate = 1.08; % over-sampling rate, 1.08 for wimax?, and 1.536 for 3gpp
flg_offset = 0; % no Carrier-frequency offset
flg_csi_err = 0; % no Channel state information error
N = 512; % FFT size & total No. of sub-carriers
cp_l = 128; % CP length
BW = 5e6; % system bandwidth, 5Hz
Nsymbol = 6; % 6 symbols within each frame
dirname = 'yynew'; % where the result is stored
allow_load_oldres = 1; % allow to load previous result
Root_path = '.'; % where the path starts
addpath('../comm_funcs');
DELAY=0; % no feedback delay
stbc = 1; % useful only for alamouti (MISO)
T_Symbol = (N+cp_l)/(BW*sampling_rate); % OFDM symbol duration
sys = {'SISO','MRC1x2','Alt2x1','EGC1x2','AS2x1','ALT2x2','AS2x2'}; % supported MIMO schemes
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 branches
R_div=R_n(state); %specify receiver diversity branches
ch = channelgenerator2(t_rms,fd,sampling_rate,N,cp_l,BW,chnums + F_LA * Nsymbol + DELAY,T_div*R_div); % channel generator. If t_rms = fd = 0, output is 1, i.e. AWGN only
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
filename = ['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),'.mat'];
dirname = [Root_path,'/',dirname];
filepath = [dirname,'/',filename];
if allow_load_oldres && exist(filepath,'file'),
load(filepath);
else
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
rdstate = 4831;
snr_ix = 0;
Num_grp=floor(N/subN);
blk_err_c=nan(length(misnr:stp:mxsnr),floor(Nframe/F_LA),Num_grp);
bit_err_u=nan(length(misnr:stp:mxsnr),floor(Nframe/F_LA),Num_grp);
bit_tot_u=nan(length(misnr:stp:mxsnr),floor(Nframe/F_LA),Num_grp);
bit_err_c=nan(length(misnr:stp:mxsnr),floor(Nframe/F_LA),Num_grp);
bit_tot_c=nan(length(misnr:stp:mxsnr),floor(Nframe/F_LA),Num_grp);
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; % randmize channel index for different LA intervals, avoid high time-correlation
index = (rnd: rnd + F_LA * Nsymbol-1 ) + DELAY;
h = ch(:,index,:);
H = func_add_csi_err(h,N,flg_csi_err); % add CSI error
[H_comb,H_LA,ps]=selectAntenna2(H,N,subN,state,T_div); % tx antenna selection
B=log2(M)*ones(floor(N/subN),1); % loaded bits per sub-carrier
P = 1/N/T_div*ones(floor(N/subN),1); % power per subCarrier
if state == 5 || state == 7,
P = P*T_div;
end
code_rate = cdrt*ones(floor(N/subN),1);
[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); % modulator & encoder & interleaver
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;
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;
index3 = ((nf-1)*Nsymbol+1:nf*Nsymbol);
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); % ofdm transiver
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
[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); % de-interleaver & de-coder & de-modulator
end
end
disp(['SNR= ',num2str(snr),'dB finished']);
end
%% calculate results
ber_u = sum(wb_u,2)./sum(tb_u,2);
ber_c = sum(wb_c,2)./sum(tb_c,2);
fer_u = sum(wf_u,2)./sum(tf,2);
fer_c = sum(wf_c,2)./sum(tf,2);
se_u = sum(tp_uu,2)./Nframe'/Nsymbol/T_Symbol/BW;
se_c = sum(tp_cc,2)./Nframe'/Nsymbol/T_Symbol/BW;
% save results
if ~exist(dirname,'dir'),
mkdir(dirname);
end;
desp = [sys{state},filename];
save(filepath,'desp','ber_u','fer_u','ber_c','fer_c','se_u','se_c','misnr','stp','mxsnr','t_rms','fd','state','M','cdrt','subN');
end
% plot results
figure;
subplot(3,2,1);
semilogy(misnr:stp:mxsnr,ber_u,'linewidth',2);
xlabel('Pre-SNR in dB','fontname','times','fontsize',10,'fontweight','b');
ylabel('Uncoded BER','fontname','times','fontsize',10,'fontweight','b');
title([num2str(M),'QAM,',sys{state},',t_{rms}=',num2str(t_rms),'\mu s,fd=',num2str(fd),'Hz'],'fontname','times','fontsize',10,'fontweight','b');
grid on; grid minor;
subplot(3,2,2);
semilogy(misnr:stp:mxsnr,ber_c,'linewidth',2);
xlabel('Pre-SNR in dB','fontname','times','fontsize',10,'fontweight','b');
ylabel('Coded BER','fontname','times','fontsize',10,'fontweight','b');
title([num2str(M),'QAM,',sys{state},',t_{rms}=',num2str(t_rms),'\mu s,fd=',num2str(fd),'Hz'],'fontname','times','fontsize',10,'fontweight','b');
grid on; grid minor;
subplot(3,2,3);
semilogy(misnr:stp:mxsnr,fer_u,'linewidth',2);
xlabel('Pre-SNR in dB','fontname','times','fontsize',10,'fontweight','b');
ylabel('Uncoded BLER','fontname','times','fontsize',10,'fontweight','b');
title([num2str(M),'QAM,',sys{state},',t_{rms}=',num2str(t_rms),'\mu s,fd=',num2str(fd),'Hz'],'fontname','times','fontsize',10,'fontweight','b');
grid on; grid minor;
subplot(3,2,4);
semilogy(misnr:stp:mxsnr,fer_c,'linewidth',2);
xlabel('Pre-SNR in dB','fontname','times','fontsize',10,'fontweight','b');
ylabel('Coded BLER','fontname','times','fontsize',10,'fontweight','b');
title([num2str(M),'QAM,',sys{state},',t_{rms}=',num2str(t_rms),'\mu s,fd=',num2str(fd),'Hz'],'fontname','times','fontsize',10,'fontweight','b');
grid on; grid minor;
subplot(3,2,5);
plot(misnr:stp:mxsnr,se_u,'linewidth',2);
xlabel('Pre-SNR in dB','fontname','times','fontsize',10,'fontweight','b');
ylabel('Uncoded SE','fontname','times','fontsize',10,'fontweight','b');
title([num2str(M),'QAM,',sys{state},',t_{rms}=',num2str(t_rms),'\mu s,fd=',num2str(fd),'Hz'],'fontname','times','fontsize',10,'fontweight','b');
grid on; grid minor;
subplot(3,2,6);
plot(misnr:stp:mxsnr,se_c,'linewidth',2);
xlabel('Pre-SNR in dB','fontname','times','fontsize',10,'fontweight','b');
ylabel('Coded SE','fontname','times','fontsize',10,'fontweight','b');
title([num2str(M),'QAM,',sys{state},',t_{rms}=',num2str(t_rms),'\mu s,fd=',num2str(fd),'Hz'],'fontname','times','fontsize',10,'fontweight','b');
grid on; grid minor;
|
|