%% 系统测试代码
clc;clear all;%close all;
%% 基本参数设置
Nss=2;
symbol_num=20;
MCS=9;
FFT=64;
DSC=52;
time=100;
%% MCS方式选择
switch(MCS)
case 8
Modulation='BPSK' ;R='1/2';
case 9
Modulation='QPSK' ;R='1/2';
case 10
Modulation='QPSK' ;R='3/4';
case 11
Modulation='16QAM' ;R='1/2';
case 12
Modulation='16QAM' ;R='3/4';
case 13
Modulation='64QAM' ;R='2/3';
case 14
Modulation='64QAM' ;R='3/4';
case 15
Modulation='64QAM' ;R='5/6';
end
switch(Modulation)
case 'BPSK'
Nbpscs=1; bit_per_symbol=52; M=2;
case 'QPSK'
Nbpscs=2; bit_per_symbol=104; M=4;
case '16QAM'
Nbpscs=4; bit_per_symbol=208; M=16;
case '64QAM'
Nbpscs=6; bit_per_symbol=312; M=64;
end
%% 发送端
%原始比特
bit_original = randint(1,bit_per_symbol*symbol_num*Nss);
%流解析
two_streams=reshape(bit_original,Nss,bit_per_symbol*symbol_num);
%调制
for i=1:Nss
mod_symbols(i,:) = tx_modulate(two_streams(i,:),Modulation);
end
%加导频以及虚子载波
mod_symbol=cell(1,Nss);
for i=1:Nss
mod_symbol{1,i}=reshape(mod_symbols(i,:),DSC,symbol_num).';
end
symbol_add_pilot=cell(1,Nss);
for i=1:Nss
symbol_add_pilot{1,i}=[mod_symbol{1,i}(:,1:7),ones(symbol_num,1),mod_symbol{1,i}(:,8:20),ones(symbol_num,1),...
mod_symbol{1,i}(:,21:32),ones(symbol_num,1),mod_symbol{1,i}(:,33:45),-ones(symbol_num,1),mod_symbol{1,i}(:,46:52)];
end
symbol_add_zero=cell(1,Nss);
for i=1:Nss
symbol_add_zero{1,i}=[zeros(symbol_num,4),symbol_add_pilot{1,i}(:,1:28),zeros(symbol_num,1),symbol_add_pilot{1,i}(:,29:56),zeros(symbol_num,3)];
end
%FFT
data=cell(1,2);
for i=1:Nss
data{1,i} = (FFT/sqrt(DSC))*ifft(fftshift(symbol_add_zero{1,i}.')).';
%data{1,i} = ifft(fftshift(symbol_add_zero{1,i}.')).';
data{1,i} = [data{1,i}(:,[49:64]) data{1,i}];
end
%加cp
for i=1:Nss
tx_signal(i,:)= reshape(data{1,i}.',1,symbol_num*80);
end
%% 过信道
EbN0dB = [0:10]; % bit to noise ratio
EsN0dB = EbN0dB + 10*log10(DSC/FFT) + 10*log10(64/80)+10*log10(Nbpscs);
for n=1:length(EbN0dB)
for t=1:time
noise_awgn = 1/sqrt(2)*[randn(Nss,symbol_num*80) + sqrt(-1)*randn(Nss,symbol_num*80)];
rx_singal=sqrt(80/FFT)*tx_signal+10^(-EsN0dB(n)/20) * noise_awgn;
%rx_singal=tx_signal+10^(-EsN0dB(n)/20) * noise_awgn;
%% 接收端
%去CP
rx_deCP=cell(1,2);
for i=1:Nss
rx_deCP{1,i} = reshape(rx_singal(i,:).',80,symbol_num).';
rx_deCP{1,i} = rx_deCP{1,i}(:,[17:80]);
end
% FFT
rx_fft=cell(1,2);
for i=1:Nss
rx_fft{1,i} = (sqrt(DSC)/FFT)*fftshift(fft(rx_deCP{1,i}.')).';
%rx_fft{1,i} = fftshift(fft(rx_deCP{1,i}.')).';
end
% 去导频和虚子载波
rx_symbol=cell(1,Nss);
for i=1:Nss
rx_symbol{1,i}=[rx_fft{1,i}(:,5:32), rx_fft{1,i}(:,34:61)];%去虚子载波
end
for i=1:Nss
rx_symbol{1,i}=[rx_symbol{1,i}(:,1:7),rx_symbol{1,i}(:,9:21),...
rx_symbol{1,i}(:,23:34),rx_symbol{1,i}(:,36:48),rx_symbol{1,i}(:,50:56)];%去导频
end
%解调
data_bit_cell=cell(1,Nss);
for i=1:Nss
for j=1:symbol_num
data_bit_cell{1,i}(j,:) = rx_demodulate_self(rx_symbol{1,i}(j,:),Modulation);
end
end
data_bit(1,:)=reshape(data_bit_cell{1,1}.',1,bit_per_symbol*symbol_num);
data_bit(2,:)=reshape(data_bit_cell{1,2}.',1,bit_per_symbol*symbol_num);
bit_hat=reshape(data_bit,bit_per_symbol*symbol_num*Nss,1).';
err(t) = size(find(bit_hat - bit_original),2);
end
nErr(n)=mean(err);
end
%%
simBer = nErr/(bit_per_symbol*symbol_num*Nss);
%theoryBer = 2*(M-1)/(M*log2(M))*qfunc(sqrt(6*log2(M)/(M^2-1)*10.^(EbN0dB/10)));
theoryBer=0.5*erfc(sqrt(10.^(EbN0dB/10)));
%close all; figure
semilogy(EbN0dB,theoryBer,'bs-','LineWidth',2);
hold on
semilogy(EbN0dB,simBer,'rx-','LineWidth',2);
%axis([0 10 10^-5 1])
grid on
legend('theory', 'simulation');
xlabel('Eb/No, dB')
ylabel('Bit Error Rate')
title('Bit error probability curve for BPSK using MIMO-OFDM')