通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  新兵

注册:2009-8-29
跳转到指定楼层
1#
发表于 2009-8-29 02:27:56 |只看该作者 |倒序浏览
% 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;

举报本楼

本帖有 5 个回帖,您需要登录后才能浏览 登录 | 注册
您需要登录后才可以回帖 登录 | 注册 |

版规|手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2025-7-22 20:24 , Processed in 0.321448 second(s), 17 queries , Gzip On.

Copyright © 1999-2025 C114 All Rights Reserved

Discuz Licensed

回顶部