⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdm_qpsk.m

📁 OFDM
💻 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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -