www.pudn.com > simulate_QPSK.rar > OFDM_QPSK.m


%%%%%%%%%%%%%%%   module: QPSK module for QPSK  %%%%%%%%%%%%%%%%%% 
%%%%%%%%%%%%%%%   date: 2007-08-29              %%%%%%%%%%%%%%%%%% 
%%%%%%%%%%%%%%%   name: Wanyiping               %%%%%%%%%%%%%%%%%% 
 
 
close all; 
clear all; 
SNR=0:2:10; 
for pp=1:length(SNR) 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  MOD  %%%%%%%%%%%%%%%%%%%%%%%%%%%% 
Indata = zeros(384*32,2);% 2 bits vector size(384*32,2) 
Indata(:,1) = (rand(1,384*32)>0.5);  
Indata(:,2) = (rand(1,384*32)>0.5); 
MOD_I = []; 
MOD_Q = []; 
for (ii = 1:384*32) 
if ( Indata(ii,2) ) 
    MOD_I = [MOD_I 45]; 
else 
    MOD_I = [MOD_I -45]; 
end 
if ( Indata(ii,1) ) 
    MOD_Q = [MOD_Q 45]; 
else 
    MOD_Q = [MOD_Q -45]; 
end 
end 
 
MOD_II = reshape(MOD_I,384,32); 
MOD_QQ = reshape(MOD_Q,384,32); 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  DRC   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
DataI = zeros(384,36); 
DataQ = zeros(384,36); 
Pilot = [1-j, 1-j, -1-j, 1+j, 1-j, 1-j, -1+j, 1-j, 1-j, 1-j, 1+j, -1-j, 1+j, 1+j, -1-j, 1+j, -1-j, -1-j, 1-j, -1+j, 1-j, 1-j, -1-j, 1+j, 1-j, 1-j, -1+j, 1-j, 1-j, 1-j, 1+j, -1-j, 1+j, 1+j, -1-j, 1+j, -1-j, -1-j, 1-j, -1+j, 1-j, 1-j, -1-j, 1+j, 1-j, 1-j, -1+j, 1-j, 1-j, 1-j, 1+j, -1-j, 1+j, 1+j, -1-j, 1+j, -1-j, -1-j, 1-j, -1+j, 1+j, 1+j, 1-j, -1+j, 1+j, 1+j, -1-j, 1+j, 1+j, 1+j, -1+j, 1-j, -1+j, -1+j, 1-j, -1+j, 1-j, 1-j,1+j, -1-j, -1-j, -1-j, -1+j, 1-j, -1-j, -1-j, 1+j, -1-j, -1-j, -1-j, 1-j, -1+j, 1-j, 1-j, -1+j, 1-j, -1+j,-1+j, -1-j, 1+j, -1-j, 1+j, -1+j, -1+j, -1-j, 1+j, 1+j, 1+j, -1-j, 1+j, 1-j, 1-j, 1-j, -1+j, -1+j, -1+j, -1+j, 1-j, -1-j, -1-j, -1+j, 1-j, 1+j, 1+j, -1+j, 1-j, 1-j, 1-j, -1+j, 1-j, -1-j, -1-j, -1-j, 1+j,1+j, 1+j, 1+j, -1-j, -1+j, -1+j, 1+j, -1-j, 1-j, 1-j, 1+j, -1-j, -1-j, -1-j, 1+j, -1-j, -1+j, -1+j, -1+j, 1-j, 1-j, 1-j, 1-j, -1+j, 1+j, 1+j, -1-j, 1+j, -1+j, -1+j, -1-j, 1+j, 1+j, 1+j, -1-j, 1+j, 1-j, 1-j, 1-j, -1+j, -1+j, -1+j, -1+j, 1-j, -1-j, -1-j, 1-j, -1+j, -1-j, -1-j, 1-j, -1+j, -1+j, -1+j, 1-j, -1+j,1+j, 1+j, 1+j, -1-j, -1-j, -1-j, -1-j, 1+j, 1-j, 1-j, 1-j, 1-j, -1-j, 1+j, 1-j, 1-j, -1+j, 1-j, 1-j, 1-j, 1+j, -1-j, 1+j, 1+j, -1-j, 1+j, -1-j, -1-j, 1-j, -1+j, 1-j, 1-j, -1-j, 1+j, 1-j, 1-j, -1+j, 1-j, 1-j, 1-j, 1+j, -1-j, 1+j, 1+j, -1-j, 1+j, -1-j, -1-j, 1-j, -1+j, 1-j, 1-j, -1-j, 1+j, 1-j, 1-j, -1+j, 1-j, 1-j, 1-j, 1+j, -1-j, 1+j, 1+j, -1-j, 1+j, -1-j, -1-j, 1-j, -1+j, 1+j, 1+j, 1-j, -1+j, 1+j, 1+j, -1-j, 1+j, 1+j, 1+j, -1+j, 1-j, -1+j, -1+j, 1-j, -1+j, 1-j, 1-j,1+j, -1-j, -1-j, -1-j, -1+j, 1-j, -1-j, -1-j, 1+j, -1-j, -1-j, -1-j, 1-j, -1+j, 1-j, 1-j, -1+j, 1-j, -1+j,-1+j, -1-j, 1+j, -1-j, 1+j, -1+j, -1+j, -1-j, 1+j, 1+j, 1+j, -1-j, 1+j, 1-j, 1-j, 1-j, -1+j, -1+j, -1+j, -1+j, 1-j, -1-j, -1-j, -1+j, 1-j, 1+j, 1+j, -1+j, 1-j, 1-j, 1-j, -1+j, 1-j, -1-j, -1-j, -1-j, 1+j,1+j, 1+j, 1+j, -1-j, -1+j, -1+j, 1+j, -1-j, 1-j, 1-j, 1+j, -1-j, -1-j, -1-j, 1+j, -1-j, -1+j, -1+j, -1+j, 1-j, 1-j, 1-j, 1-j, -1+j, 1+j, 1+j, -1-j, 1+j, -1+j, -1+j, -1-j, 1+j, 1+j, 1+j, -1-j, 1+j, 1-j, 1-j, 1-j, -1+j, -1+j, -1+j, -1+j, 1-j, -1-j, -1-j, 1-j, -1+j, -1-j, -1-j].*45; 
PilotI = real(Pilot); % 384 vector; 
PilotQ = imag(Pilot); 
% insert pilot symbol 
for (kk=1:36) 
    if ((kk==1)|(kk==10)|(kk==19)|(kk==28)) 
        DataI(:,kk) = PilotI; 
        DataQ(:,kk) = PilotQ; 
    elseif((kk>1) && (kk<10)) 
        DataI(:,kk) = MOD_II(:,kk-1); 
        DataQ(:,kk) = MOD_QQ(:,kk-1); 
    elseif((kk>10) && (kk<19))  
        DataI(:,kk) = MOD_II(:,kk-2); 
        DataQ(:,kk) = MOD_QQ(:,kk-2);     
    elseif((kk>19) && (kk<28))  
        DataI(:,kk) = MOD_II(:,kk-3); 
        DataQ(:,kk) = MOD_QQ(:,kk-3);     
    else  %(kk>28)  
        DataI(:,kk) = MOD_II(:,kk-4); 
        DataQ(:,kk) = MOD_QQ(:,kk-4);  
    end 
end 
% insert 0 carrier  
DataII = zeros(512,36); 
DataQQ = zeros(512,36); 
DataII(5:196,:) = DataI(1:192,:); 
DataII(318:509,:) = DataI(193:384,:); 
DataQQ(5:196,:) = DataQ(1:192,:); 
DataQQ(318:509,:) = DataQ(193:384,:); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%  IFC    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
x = DataII+j*DataQQ; 
y = ifft(x); 
TdataI = real(y); 
TdataQ = imag(y); 
scale_factor = 2^11./max(max(max(abs(TdataI))),max(max(abs(TdataQ)))); 
TdataII = round( TdataI.*scale_factor ); 
TdataQQ = round( TdataQ.*scale_factor ); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%         CPC      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
CPdataII = zeros(640,36); 
CPdataQQ = zeros(640,36); 
CPdataII(1:128,:) = TdataII(385:512,:); 
CPdataII(129:640,:) = TdataII(1:512,:); 
CPdataQQ(1:128,:) = TdataQQ(385:512,:); 
CPdataQQ(129:640,:) = TdataQQ(1:512,:); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%         AHC        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
AHdataII = zeros(1,640*36+1152); 
AHdataQQ = zeros(1,640*36+1152); 
AHdataI = reshape(CPdataII,1,640*36); 
AHdataQ = reshape(CPdataQQ,1,640*36); 
[long_pre, seq1, seq2] = get_agc_seq();   %  
head_seq = [kron(ones(1,6),seq1),kron(ones(1,4),seq2),long_pre,long_pre]; 
scale_factor = 2^11./max(max(max(abs(real(head_seq))),max(abs(imag(head_seq))))); 
head_seq_us = round(head_seq.*scale_factor); 
AHdataII = [real(head_seq_us),AHdataI]; 
AHdataQQ = [imag(head_seq_us),AHdataQ]; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%   interpolation    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
load coeff72.mat;  % 9 bits vector 
FIR_coeff = coeff72; 
INTdata = AHdataII + j*AHdataQQ; 
FIR_be = upsample(INTdata,8); 
FIR_af = conv(FIR_be,FIR_coeff); 
INTdataI = real(FIR_af); 
INTdataQ = imag(FIR_af); 
scale_factor = round(2^9./max(max(max(abs(INTdataI)),max(abs(INTdataQ))))); 
INTdataII = round(INTdataI.*scale_factor); 
INTdataQQ = round(INTdataQ.*scale_factor); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%    channel simulate    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
signal_in = INTdataII + j * INTdataQQ; 
signal_power = signal_in*signal_in'; 
noise_power = signal_power*10^(-SNR(pp)/10); 
len = length(signal_in); 
noise = randn(1,len) + j*randn(1,len); 
noise = noise*sqrt(noise_power/(noise*noise')); 
 
signal_out = signal_in + noise; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%    receive module      %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%     down sample        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%         
load coeff72.mat;  % 9 bits vector 
FIR_coeff = coeff72; 
% CHdata = INTdataII + j * INTdataQQ; 
COVdata = conv(signal_out,FIR_coeff); 
Downdata = COVdata(1:8:end); 
DownI = real(Downdata); 
DownQ = imag(Downdata); 
scale_factor = round(2^9./max(max(max(abs(DownI)),max(abs(DownQ))))); 
DownII = round(DownI.*scale_factor); 
DownQQ = round(DownQ.*scale_factor); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%    synchronization     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%         
SYNdata_us = DownII+j*DownQQ;  %DownII + j*DownQQ; 
[long_pre, seq1, seq2] = get_agc_seq(); 
cor = zeros(1,2000); 
for ff = 1:1000 
    cor(ff) = SYNdata_us(ff:ff+256-1)*long_pre'; 
end 
[val,index] = max(abs(cor)); 
if(index>800) 
SYNdataII = DownII(index+256:index+256+640*36-1); 
SYNdataQQ = DownQQ(index+256:index+256+640*36-1); 
else 
SYNdataII = DownII(index+512:index+512+640*36-1); 
SYNdataQQ = DownQQ(index+512:index+512+640*36-1); 
end 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%       DECPC            %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
DECPC_II = zeros(512,36); 
DECPC_QQ = zeros(512,36); 
DECPC_I = reshape(SYNdataII,640,36); 
DECPC_Q = reshape(SYNdataQQ,640,36); 
DECPC_II = DECPC_I(129:640,:); 
DECPC_QQ = DECPC_Q(129:640,:); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%        FCU             %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
FCU_us = DECPC_II +j*DECPC_QQ; 
FCU_data = fft(FCU_us); 
FCU_I = real(FCU_data); 
FCU_Q = imag(FCU_data); 
scale_factor = 2^9./max(max(max(abs(FCU_I))),max(max(abs(FCU_Q)))); 
FCU_II = round(FCU_I.*scale_factor); 
FCU_QQ = round(FCU_Q.*scale_factor); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%        DCU             %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
DCU_I = zeros(384,36); 
DCU_Q = zeros(384,36); 
DCU_I(1:192,:) = FCU_II(5:196,:); 
DCU_I(193:384,:) = FCU_II(318:509,:); 
DCU_Q(1:192,:) = FCU_QQ(5:196,:); 
DCU_Q(193:384,:) = FCU_QQ(318:509,:); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%        CEU             %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
CEU_data = zeros(384,32); 
CEU_us = DCU_I + j*DCU_Q; 
angle_scale = Pilot.*(CEU_us(:,1))'; 
scale_factor = 2^9./max(max(max(abs(real(angle_scale))),max(abs(imag(angle_scale))))); 
angle_scale_us =  round(angle_scale.*scale_factor); 
angle_scale_vector = kron(ones(1,8),angle_scale_us); 
angle_scale_matrix = reshape(angle_scale_vector,384,8); 
CEU_data(:,1:8) = angle_scale_matrix.*CEU_us(:,2:9); 
 
angle_scale = Pilot.*(CEU_us(:,10))'; 
scale_factor = 2^9./max(max(max(abs(real(angle_scale))),max(abs(imag(angle_scale))))); 
angle_scale_us =  round(angle_scale.*scale_factor); 
angle_scale_vector = kron(ones(1,8),angle_scale_us); 
angle_scale_matrix = reshape(angle_scale_vector,384,8); 
CEU_data(:,9:16) = angle_scale_matrix.*CEU_us(:,11:18);     
 
angle_scale = Pilot.*(CEU_us(:,19))'; 
scale_factor = 2^9./max(max(max(abs(real(angle_scale))),max(abs(imag(angle_scale))))); 
angle_scale_us =  round(angle_scale.*scale_factor); 
angle_scale_vector = kron(ones(1,8),angle_scale_us); 
angle_scale_matrix = reshape(angle_scale_vector,384,8); 
CEU_data(:,17:24) = angle_scale_matrix.*CEU_us(:,20:27); 
 
angle_scale = Pilot.*(CEU_us(:,28))'; 
scale_factor = 2^9./max(max(max(abs(real(angle_scale))),max(abs(imag(angle_scale))))); 
angle_scale_us =  round(angle_scale.*scale_factor); 
angle_scale_vector = kron(ones(1,8),angle_scale_us); 
angle_scale_matrix = reshape(angle_scale_vector,384,8); 
CEU_data(:,25:32) = angle_scale_matrix.*CEU_us(:,29:36); 
 
CEU_II = real(CEU_data); 
CEU_QQ = imag(CEU_data); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%       DEMOD            %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
DEMOD_I = zeros(1,384*32); 
DEMOD_Q = zeros(1,384*32); 
DEMOD_I = reshape(CEU_II,1,384*32); 
DEMOD_Q = reshape(CEU_QQ,1,384*32); 
DEMOD_II = (DEMOD_I>0); 
DEMOD_QQ = (DEMOD_Q>0); 
DEMOD_out = zeros(384*32,2); 
DEMOD_out(:,2) = DEMOD_II'; 
DEMOD_out(:,1) = DEMOD_QQ'; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%test CEU 
% DEMOD_I = zeros(384,32); 
% DEMOD_Q = zeros(384,32); 
% for (kk=1:36) 
%     if((kk>1) && (kk<10)) 
%         DEMOD_I(:,kk-1) = DCU_I(:,kk); 
%         DEMOD_Q(:,kk-1) = DCU_Q(:,kk); 
%     elseif((kk>10) && (kk<19))  
%         DEMOD_I(:,kk-2) = DCU_I(:,kk); 
%         DEMOD_Q(:,kk-2) = DCU_Q(:,kk);     
%     elseif((kk>19) && (kk<28))  
%         DEMOD_I(:,kk-3) = DCU_I(:,kk); 
%         DEMOD_Q(:,kk-3) = DCU_Q(:,kk);     
%     elseif(kk>28)  
%         DEMOD_I(:,kk-4) = DCU_I(:,kk); 
%         DEMOD_Q(:,kk-4) = DCU_Q(:,kk);  
%     end 
% end 
% DEMOD_II = reshape(DEMOD_I,1,384*32); 
% DEMOD_QQ = reshape(DEMOD_Q,1,384*32); 
% DEMOD_III = (DEMOD_II>0); 
% DEMOD_QQQ = (DEMOD_QQ>0); 
% DEMOD_out = zeros(384*32,2); 
% DEMOD_out(:,2) = DEMOD_III'; 
% DEMOD_out(:,1) = DEMOD_QQQ'; 
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%           BER           %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
couti = 0; 
coutq = 0; 
for ii=1:384*32 
    if(DEMOD_out(ii,1)~=Indata(ii,1)) 
      coutq = coutq+1; 
    end 
    if(DEMOD_out(ii,2)~=Indata(ii,2)) 
      couti = couti+1; 
    end 
end 
ber(pp) = (couti+coutq)./(384*32*2);         
 
end 
 
figure; 
semilog(SNR,ber,'-*'); 
grid on;