% 2Tx+1Rx SFBC+OFDM system in Rayleigh fading channel using Jakes' model
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Initialing %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
clc;
fs = 800000; %%%采样速率
d=1;%%时延扩展
fm=200;%%%%%%%%%最大多普勒频移
N_packet=1000;%%1000次循环
M=26;%%信道长度(多径)
Nr=1;
Nt=2;
b=2 %%%QPSK % sampling rate/Bandwidth
Ncarr = 256; % number of subcarriers
GIlen = 288; % length of OFDM symbol plus cyclic prefix
CPlen = GIlen - Ncarr;
X_receive=[];
SNRdBs=[0:2:30];
% length of cyclic prefix
for i_SNR=1:length(SNRdBs)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Channel source %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SNRdB=SNRdBs(i_SNR);
for i_packet=1:N_packet
% generate infomation bits
%X_info = randint(1,Ncarr); % binary bits
%X_send = 2*X_info - 1; % BPSK modulation
%产生QPSK符号
X_info =randi([0 1],1,Ncarr*b);
[X_send,~,~]=modulator(X_info,b); % QPSK modulation
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% separate the sent bits to 2 branches
X_send1(1:2:Ncarr) = X_send(1:2:Ncarr) ; % transmitter1
X_send1(2:2:Ncarr) = -conj(X_send(2:2:Ncarr)); % [X1, -conj(X2)]
X_send2(1:2:Ncarr) = X_send(2:2:Ncarr) ; % transmitter2
X_send2(2:2:Ncarr) = conj(X_send(1:2:Ncarr)); % [X2, conj(X1)]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% IFFT %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ifft with length Slen
z_ifft1 = sqrt(Ncarr)*ifft(X_send1,Ncarr); % sqrt(Ncarr) should be mutiplied to maintain the Power
z_ifft2 = sqrt(Ncarr)*ifft(X_send2,Ncarr); % sqrt(Ncarr) should be mutiplied to maintain the Power
% adding cyclic prefix
Z_ofdm1 = [z_ifft1(Ncarr-CPlen+1:Ncarr) z_ifft1]; % final OFDM sampled signals with CP
Z_ofdm2 = [z_ifft2(Ncarr-CPlen+1:Ncarr) z_ifft2]; % final OFDM sampled signals with CP
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% channel %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% generate random channel matrix "h" with rayleigh distribution and Doppler shift by Jakes' model % received signal
% multi paths channel following exponential delay model
Hr1 = zeros(M , Ncarr); % channel matrix
Hr2 = zeros(M , Ncarr); % channel matrix
r = zeros(1 , Ncarr); % received signa
%TapGain = sqrt( (1-exp(-1/d)) / (1-exp(-M/d)) / 2 );
for i = 1:M
Hr1(i,:) = jakes(Ncarr,fm,fs);
Hr2(i,:) = jakes(Ncarr,fm,fs);
r = r + Hr1(i,:).*Z_ofdm1( (CPlen-i+2):(GIlen-i+1) ) + Hr2(i,:).*Z_ofdm2( (CPlen-i+2):(GIlen-i+1) );
end
R = awgn(r,SNRdB); % AWGN
%R = r;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% IFFT %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% fft
z_fft = fft(R,Ncarr)/sqrt(Ncarr); % 1/sqrt(Ncarr) should be multiplied
% separate the sig nals on odd and even subcarriers
X_odd = z_fft(1:2:Ncarr); % R1 = h11* X1 + h21* X2
X_even = z_fft(2:2:Ncarr); % R2 = -h12*conj(X2) - h22*conj(X1)
% Calculate the frequecy domain response
h_est1 = sum(Hr1,2)/Ncarr;
C1 = fft([h_est1;zeros(Ncarr-M,1)]);
h_est2 = sum(Hr2,2)/Ncarr;
C2 = fft([h_est2; zeros(Ncarr-M,1)]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% detection %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
H11_1 = C1(1:2:Ncarr); H21_1 = C2(1:2:Ncarr); % R1 = h11* X1 + h21* X2
H12_1 = C1(2:2:Ncarr); H22_1 = C2(2:2:Ncarr); % R2 = -h12*conj(X2)+ h22*conj(X1)
%最大化分集方案1
%X_receive= SML_decode(H11_1, H12_1, H21_1, H22_1, X_odd, X_even, Ncarr);
%线性检测ZF
%X_receive= ZF_decode(H11_1, H12_1, H21_1, H22_1, X_odd, X_even, Ncarr);
%%%%%MRC+OSIC检测
H=cell(1,Ncarr/2);
X_receive=[];
for i=1:Ncarr/2
y=[];
y=[X_odd(i);X_even(i)'];
H{i}=[H11_1(i),H21_1(i);conj(H22_1(i)) conj(-1.*H12_1(i))];
temp=[];
temp=OSIC_detector1(y,H{i},2);
X_receive=[X_receive temp];
end
%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Demodulate %%%%%
%%%%% Error counts %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%将QPSK映射为信息比特
x_sliced=[];
x_sliced=QPSK_slicer(X_receive);
temp1=[];
for i=1:length(x_sliced)
temp=[];
[temp,~]=XQPSK_demapper1(x_sliced(i));
temp1=[temp1 temp];
end
% bit error ratio
noeb_p(i_packet)=sum(X_info~=temp1); % Coventional SML Detection
end
BER(i_SNR) = sum(noeb_p)/(N_packet*b*Ncarr);
end
semilogy(SNRdBs,BER), hold on, axis([SNRdBs([1 end]) 1e-6 1e0]);
xlabel('SNR[dB]'), ylabel('BER');
grid on, set(gca,'fontsize',9);
save('SFBC_MRC+SIC_26','BER');
legend('Alamouti检测',4);
title('Iakes模型生成瑞利信道下的 2Tx-1Rx SFBC误码率仿真曲线')
%%%%%%%%%%%%%%