clc;
clear all;
close all;
warning off;
addpath 'func\'
%OFDM长度
Nfft = 512;
%子载波数目
NCarrier = 100;
%符号数/载波
Nsymbols = 660;
%循环前缀长度
Ncp = 10;
Nadder = Nfft+Ncp;
Modes = 4;
%位数/符号
Nbits = log2(Modes);
%发送天线矩阵
Tr_matrix =[1 2;-2+j 1+j];
NTr_matrix= size(Tr_matrix,1);
Nt = size(Tr_matrix',2); %发射天线数目
Nr = 2; %接收天线数目
%发射
[Nxx,data_eta,data_delta,data_eps,data_cojm] = func_trans_x(Nt,Tr_matrix,NTr_matrix);
%子载波
Carriers = (1: NCarrier) + (floor(Nfft/4) - floor(NCarrier/2));
Len_carriers = Nfft-Carriers+2;
Tx_training = func_training_symbol(Nt,NCarrier);
Nbase = NCarrier * Nsymbols;
SNRs = [0:2:20];
%绘图信息存储矩阵
Bers=zeros(length(SNRs));
idx = 0;
for j_snr = SNRs
j_snr
idx = idx + 1;
Nerror = zeros(1,Nr);
data_buffer1 = zeros(NCarrier,Nsymbols,Nr);
data_bits = zeros(Nbase,Nbits,Nr);
%生成随机数用于仿真
Tsignal = round(rand(Nbase,Nbits));
Tsignal2 = bi2de(Tsignal);
%PSK调制
Tsignal_mod = pskmod(Tsignal2,Modes,0);
Tcar_mat = reshape(Tsignal_mod,NCarrier,Nsymbols);
for st1=1:Nt:Nsymbols
data = [];
for st2=1:Nt
data=[data;Tcar_mat(:,st1+st2-1)];
end
%STBC
data_stbc = func_stbc(data,Tr_matrix,NTr_matrix,NCarrier,Nt);
%添加训练序列
data_stbc = [Tx_training;data_stbc];
data_rec = zeros(1,Nadder*(NTr_matrix+1),Nr);
for st11=1:Nr
for st2=1:Nt
data_tra = reshape(data_stbc(:,st2),NCarrier,NTr_matrix+1);
data_tra_ifft = zeros(Nfft,NTr_matrix+1);
data_tra_ifft(Carriers,:) = data_tra(1:NCarrier,:);
data_tra_ifft(Len_carriers,:) = conj(data_tra(1:NCarrier,:));
%IFFT
time_matrix = ifft(data_tra_ifft);
time_matrix =[time_matrix((Nfft-Ncp+1):Nfft,:);time_matrix];
tx = time_matrix(:)';
%信道
txn = func_channel(tx,st2,j_snr);
data_rec(1,:,st11) = data_rec(1,:,st11)+txn;
end
%接收机
Rx_spec = reshape(data_rec(1,:,st11),Nadder,NTr_matrix+1);
[p,L,Wk,Y_buf] = func_rec_fft(Rx_spec,Ncp,Nt,Nadder,Nfft,NTr_matrix,Carriers,NCarrier,Tx_training);
h = p/NCarrier;
H_buf = func_H(h,NCarrier,Nt,L,Wk);
%获得接收数据
data_recf = func_rec_data(data_eta,data_cojm,data_eps,data_delta,Nxx,Y_buf,H_buf,NCarrier);
%解调
r_sym = pskdemod(data_recf,Modes,0);
data_buffer1(:,st1:st1+Nt-1,st11) = r_sym;
end
end
data_bufferf = zeros(Nbase,Nr);
for st11=1:Nr
tmps1 = data_buffer1(:,:,st11);
data_bufferf(:,st11) = tmps1(:);
data_bits(:,:,st11) = de2bi(data_bufferf(:,st11));
for st22=1:Nbase
for st33=1:Nbits
if data_bits(st22,st33,st11)~=Tsignal(st22,st33)
Nerror(st11) = Nerror(st11) + 1;
end
end
end
end
Bers(idx)=mean(Nerror/(Nbase));
end
figure;
semilogy(SNRs,Bers,'b-s');
xlabel('信噪比/dB');
ylabel('误码率');
grid on