clc;
close all;
clear all;
warning off;
Frame_Length = 120; %每次仿真数据个数
Error_Num = 100000; %统计误码的个数
EbNo = 0:2:20; %信噪比
Nt = 2; %发送天线
Nr = 2; %接收天线
P = 4; %调制数
tx2 = zeros(Frame_Length, Nt);
r = zeros(Frame_Length, Nr);
H = zeros(Frame_Length, Nt, Nr);
z = zeros(Frame_Length, Nr);
BERs = zeros(1, length(EbNo));
for kk = 1:length(EbNo)
kk
count = 0;
totalNumErr = 0;
SNR = 10^(EbNo(kk)/10);
sigma = 1/(sqrt(SNR)/2);
while(totalNumErr < Error_Num)
kk
totalNumErr
%产生数据
data = randint(Frame_Length,1,P);
%BPSK
tx = pskmod(data,P);
%DSTBC
%G2 = [s1 -s2 ]
% [s2* s1*]
%以中继输出作为D-STBC的输入
s1 = tx(1:Nt:end);
s2 = tx(2:Nt:end);
tx2(1:Nt:end, :) = [s1 -s2 ];
tx2(2:Nt:end, :) = [conj(s2) conj(s1)];
transmit = tx2;
%MIMO信道
H(1, :, :) = (randn(Nt,Nr)+j*randn(Nt,Nr))/sqrt(2);
H = H(ones(Frame_Length,1),:,:);
%信号接收
for i = 1:Nr
rr = size(sum(H(:, :, i).*transmit,2)/(Nt),1);
cc = size(sum(H(:, :, i).*transmit,2)/(Nt),2);
r(:, i) = sum(H(:, :, i).*transmit,2)/(Nt) + sigma*(randn(rr,cc)+sqrt(-1)*randn(rr,cc));
end
%DSTBC接收
%ML
hidx = 1:Nt:length(H);
for i = 1:Nr
z1(:, i) = r(1:Nt:end,i).* conj(H(hidx,1,i)) + conj(r(2:Nt:end,i)).* H(hidx,2,i);
z2(:, i) = -r(1:Nt:end,i).* conj(H(hidx,2,i)) + conj(r(2:Nt:end,i)).* H(hidx,1,i);
end
z(1:Nt:end,:) = z1;
z(2:Nt:end,:) = z2;
Rec_data = pskdemod(sum(z,2),P);
count = count + 1;
totalNumErr = totalNumErr + biterr(Rec_data, data);
end
BERs(kk) = totalNumErr/(2*count*Frame_Length);
end
figure;
semilogy(EbNo,BERs,'r-o');
set(gca,'yscale','log','xlim',[EbNo(1), EbNo(end)],'ylim',[1e-6 1]);
grid on;
save QPSK.mat EbNo BERs