% Alamouti_scheme.m
%MIMO-OFDM Wireless Communications with MATLAB㈢ Yong Soo Cho, Jaekwon Kim, Won Young Yang and Chung G. Kang
%2010 John Wiley & Sons (Asia) Pte Ltd
hold on;
fc=1e8;
VehicSpd=50;
C=3e8;
fd=VehicSpd*fc/C;
shadow_sigma=3;
d=0.5e3;
Gt=40;
Gr=15;
channel_length=100000;
fs=30e8;
n=1:channel_length;
t_interval=1/fs;
counter=0.1*fs;
L_frame=130; N_Packets=400; % Number of frames/packet and Number of packets
NT=2; NR=2; b=2;
EbN0dB=[0:5:30]; sq_NT=sqrt(NT); sq2=sqrt(2);
for iEbN0dB=1:length(EbN0dB)
SNRdB=EbN0dB(iEbN0dB);
for i_packet=1:N_Packets
msg_symbol=randint(L_frame*b*NT,1);
tx_bits=msg_symbol.'; tmp=[]; tmp1=[];
[tmp1,sym_tab,P] = modulator(tx_bits,b);
Sig=reshape(tmp1,[],NT);
%*** 大尺度 ****
pathloss = 32.44+20*log10(d/1000)+20*log10(fc/10^6) - Gr - Gt;
% pathloss=10;
R1=normrnd(0,shadow_sigma,1,length(Sig(1)));
PL1=pathloss+R1;
R2=normrnd(0,shadow_sigma,1,length(Sig(1)));
PL2=pathloss+R2;
X1_fading=Sig(:,1).*sqrt(10.^((-1)*PL1/10)); % 大尺度
X2_fading=Sig(:,2).*sqrt(10.^((-1)*PL2/10)); % 大尺度
%****** 计算高斯噪声方差 *******
Es_average=sum(X1_fading.*conj(X1_fading),1)/L_frame;
sigma=sqrt(Es_average/(10^(SNRdB/10)));
H=zeros(NT,L_frame,NR);
for nt=1:NT
for nr=1:NR
H(nt,:,nr)=rayleighnew(L_frame,t_interval,fd,counter*nr*nt);
end
end
H1=reshape(H(1,:,:),L_frame,[]); % h11,h12
H2=reshape(H(2,:,:),L_frame,[]); % h21 h22
R1=H1(:,1).*X1_fading+H1(:,2).*X2_fading+sigma*(randn(L_frame,1)+j*randn(L_frame,1));
R2=H2(:,1).*X1_fading+H2(:,2).*X2_fading+sigma*(randn(L_frame,1)+j*randn(L_frame,1));
for iSym=1:L_frame
h=[H1(iSym,1) H1(iSym,2);H2(iSym,1) H2(iSym,2)];
W=pinv(h);
input=[R1(iSym);R2(iSym)];
output1(iSym)=W(1,:)*input;
output2(iSym)=W(2,:)*input;
end
[Z1_real,Z1_img]=QPSK_denmod(output1);
k=1;
for i=1:2:2*L_frame
Z1_demod(i)=Z1_real(:,k);
Z1_demod(i+1)=Z1_img(:,k);
k=k+1;
end
[Z2_real,Z2_img]=QPSK_denmod(output2);
k=1;
for i=1:2:2*L_frame
Z2_demod(i)=Z2_real(:,k);
Z2_demod(i+1)=Z2_img(:,k);
k=k+1;
end
output=[Z1_demod Z2_demod];
input=reshape(msg_symbol,1,[]);
errorNum(i_packet)=sum(output~=input);
disp(['EbN0dB = ' num2str(EbN0dB(iEbN0dB)) '; Packet= ' num2str(i_packet) ';'' error bit = ' num2str(errorNum(i_packet)) ';']);
end % End of FOR loop for i_packet
errorTotal=sum(errorNum);
BER(iEbN0dB) = errorTotal/(N_Packets*L_frame*b);
end % End of FOR loop for i_SNR
semilogy(EbN0dB,BER,'-*b');
% axis([EbN0dB([1 end]) 1e-8 1e0]);
grid on; xlabel('SNR[dB]'); ylabel('BER');