📄 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -