gusucode.com > m4k20功率分配图 mimo功率优化,OFDM典型仿真程序,贪婪算法仿真程序 > code/test_16qam/qpsk_ofdm_ce.m

    % Program 4-8
% ofdmce.m
%
% Simulation program to realize OFDM transmission system
%
% Programmed by T.Yamamura and H.Harada
%
% GI CE GI data GI data...(data 6symbols)
% (CE: Chanel estimation symbol, GI Guard interval)
%

%********************** preparation part ***************************

%para=52;    % Number of parallel channel to transmit (points)
para=128;
%fftlen=64;  % FFT length
fftlen=128;  % FFT length
%noc=53;     % Number of carriers
nd=6;       % Number of information OFDM symbol for one loop
knd=1;      % Number of known channel estimation (CE) OFDM symbol
ml=4;       % Modulation level : 16qam
sr=250000;  % OFDM symbol rate (250 ksyombol/s)
br=sr.*ml;  % Bit rate per carrier
%gilen=16;   % Length of guard interval (points)
gilen=32;   % Length of guard interval (points)
%ebn0=3;     % Eb/N0
ebn0=5:5:50;
for m=1:10


%%%%%%%%%%%%% fading initialization %%%%%%%%%%%

%tstp=1/sr/(fftlen+gilen); % Time resolution
tstp=1/sr/(fftlen+gilen); % Time resolution
%itau=[0];       % Arrival time for each multipath normalized by tstp 
itau=[0,1,2,3];       % Arrival time for each multipath normalized by tstp 
%dlvl1=[0];      % Mean power for each multipath normalized by direct wave.
dlvl1=[0,2,10,20];      % Mean power for each multipath normalized by direct wave.
%n0=[6];	        % Number of waves to generate fading n0(1),n0(2)
n0=[6,7,6,7];	        % Number of waves to generate fading n0(1),n0(2)
%th1=[0.0];      % Initial Phase of delayed wave
th1=[0.0,0.0,0.0,0.0];      % Initial Phase of delayed wave
%itnd1=[1000];   % set fading counter        
%itnd1=[1000,2000];   % set fading counter    
itnd1=[1000,2000,3000,4000];   % set fading counter  
itnd21=[1000,2000,3000,4000];
itnd22=[100000,102000,10300,10400];
%now1=1;         % Number of directwave + Number of delayed wave
now1=4;         % Number of directwave + Number of delayed wave
fd=150;         % Maximum Doppler frequency
flat=0;         % Flat or not (see ofdm_fading.m)
%itnd0=nd*(fftlen+gilen)*20; % Number of fading counter to skip 
itnd0=nd*(fftlen+gilen)*20; % Number of fading counter to skip 

%************************** main loop part **************************

nloop=325;  % Number of simulation loops

noe = 0;    % Number of error data
noe0 = 0;    % Number of error data
nod = 0;    % Number of transmitted data
eop=0;      % Number of error packet
nop=0;      % Number of transmitted packet

%************************** transmitter *****************************
for iii=1:nloop
   
seridata=rand(1,para*nd*ml)>0.5;  %  DC=0

%paradata=reshape(seridata,para,nd*ml); %size(51  *  nd*ml)

%-------------- ml modulation ---------------- 

[ich,qch]=qammod(seridata,1,para*nd,ml);
ch0=ich+sqrt(-1).*qch;
ch1=ch0;

%-------------------stbc--------------------
[st_out1,st_out2]=st2tr(ch1,para);
ch11=reshape(st_out1,para,nd);
ch12=reshape(st_out2,para,nd);
ch10=reshape(ch1,para,nd);

%------------------- IFFT  -------------------

ch20=ifft(ch10);
ch21=ifft(ch11);
ch22=ifft(ch12);

%---------- Gurad interval insertion ---------

ch30= giins(ch20,fftlen,gilen,nd);
ch31= giins(ch21,fftlen,gilen,nd);
ch32= giins(ch22,fftlen,gilen,nd);
fftlen2=fftlen+gilen;
ch31=(1/sqrt(2)).*ch31;
ch32=(1/sqrt(2)).*ch32;
ich30=real(ch30);
qch30=imag(ch30);
% ich41=real(ch41);
% qch41=imag(ch41);
% ich42=real(ch42);
% qch42=imag(ch42);

%---------- Attenuation Calculation ----------

spow=sum(ich30.^2+qch30.^2)/nd./para;
attn=0.5*spow*sr/br*10.^(-ebn0(m)/10);
attn=sqrt(attn);


%********************** fading channel ****************************** 

[ch40]=sefade(ch30,itau,dlvl1,th1,n0,itnd1,now1,length(ch30),tstp,fd,flat);
[ch41]=sefade(ch31,itau,dlvl1,th1,n0,itnd21,now1,length(ch31),tstp,fd,flat);
[ch42]=sefade(ch32,itau,dlvl1,th1,n0,itnd22,now1,length(ch32),tstp,fd,flat);
itnd1 = itnd1+itnd0;  % Updata fading counter
itnd21 = itnd21+itnd0;
itnd22 = itnd22+itnd0; 
h0=calcha(ch20,ch40,para,fftlen2,gilen,nd);
h21=calcha(ch21,ch41,para,fftlen2,gilen,nd);
h22=calcha(ch22,ch42,para,fftlen2,gilen,nd);

%***************************  Receiver  *****************************
%--------------- AWGN addition --------------- 
% 
ch5=comb1(ch42,ch41,attn);
ch50=comb1(ch40,0,attn);
% ch5=comb1(ch42,ch41,0);
% ch50=comb1(ch40,0,0);

%----Perfect fading compensation for one path fading ----
%If you would like to simulate performance under perfect compensation, please remove "*"
%from the following four sentenses
%ifade2=1./ramp.*(rcos(1,:).*ich5+rsin(1,:).*qch5);
%qfade2=1./ramp.*(-rsin(1,:).*ich5+rcos(1,:).*qch5);
%ich5=ifade2;
%qch5=qfade2;

%----------- Guard interval removal ----------

ch60= girem(ch50,fftlen2,gilen,nd);
ch6= girem(ch5,fftlen2,gilen,nd);
% ch6=reshape(ch5,para,(nd+1));
% ch60=reshape(ch50,para,(nd+1));
% ch61=reshape(ch51,para,(nd+1));
% ch62=reshape(ch52,para,(nd+1));

%------------------  FFT  --------------------

ch70=fft(ch60);
ch7=fft(ch6);
ch7=reshape(ch7,1,para*nd);
ch70=reshape(ch70,1,para*nd);
ch70=ch70./h0;

%----------------signal combine-------------
%h1=1;
%h2=1;                                                    %理想信道
s=signalcombine21(ch7,h21,h22,fftlen,nd);%signalcombine2t1r:
                                                  %2发射天线一接收天线的信号合并
                                                  
                                                  %---------------空时解码--------------------
for n=1:para*nd              %de_st(n) 是空时解码的输出
    de_st(n)=de_st_out(s(n),h21(n),h22(n));    %这里的de_st_out是对16qam的空时解码
end

ch8=de_st;
ich8=real(ch8);
qch8=imag(ch8);
ch80=ch70;
ich80=real(ch80);
qch80=imag(ch80);



%----------------- demoduration --------------

[demodata0]=qamdemod(ich80,qch80,1,para*nd,ml);   
[demodata]=qamdemod(ich8,qch8,1,para*nd,ml);  
 
%--------------  error calculation  ----------

demodata0=reshape(demodata0,1,para*nd*ml);
demodata=reshape(demodata,1,para*nd*ml);
noe2=sum(abs(demodata-seridata));           % 2-发射天线
noe1=sum(abs(demodata0-seridata));          % 1-发射天线
nod2=length(seridata);

% calculating BER
noe=noe+noe2;
noe0=noe0+noe1;
nod=nod+nod2;

%fprintf('%d\t%e\t%d\n',iii,noe2/nod2,eop);
   
end
m
ber(m)=noe/nod
ber0(m)=noe0/nod;
%ber_stand(m)=(3/8)*(1-1/sqrt(1+5/10^(0.1*ebn0(m)/2)))
ber_stand(m)=(3/8)*(1-1/sqrt(1+5/(2*10^(0.1*ebn0(m)))));

%********************** Output result ***************************

%fprintf('%f\t%e\t%e\t%d\t%d\n',ebn0,ber,per,nloop,fd);
  
%fid = fopen('BERofdmce.dat','a');
%fprintf(fid,'%f\t%e\t%e\t%d\t\n',ebn0,ber,per,nloop);
%fclose(fid);

%******************** end of file ***************************
end
semilogy(ebn0,ber,'s-r',ebn0,ber0,'*-b',ebn0,ber_stand,'g');
xlabel('SNR  (dB)');
ylabel('BER');
legend('2Tx-1Rx OFDM','1Tx-1Rx OFDM','theory');
title('Performance over COST 207 4 path channel using 16QAM')
grid;