clear all
close all
clc
tic
%%
Mod_Order_User1 = 2; % 16QAM
Mod_Order_User2 = 2; % QPSK
SymLen = 1e3;
%% Power Allocation
alpha = 1 - 0.952; % 64QAM = 16QAM + QPSK
P1 = sqrt(alpha); P2 = sqrt(1-alpha);
%% Simulation Parameters
SNR_dB = 0:2:20;
MaxFer = 1e2;
MaxFrame = 1e4;
BerRatio1 = zeros(1,length(SNR_dB));
FerRatio1 = zeros(1,length(SNR_dB));
BerRatio2 = zeros(1,length(SNR_dB));
FerRatio2 = zeros(1,length(SNR_dB));
for SNR_cnt = 1:length(SNR_dB)
SNR = SNR_dB(SNR_cnt);
sigma = 10^(SNR/10);
FrameNum = 0;
ErrNum1 = 0; FerNum1 = 0;
ErrNum2 = 0; FerNum2 = 0;
while (FerNum1<MaxFer)&&(FrameNum<MaxFrame);
FrameNum = FrameNum + 1;
%% Transmitter
info_bit_user1 = round(rand([1,SymLen*Mod_Order_User1]));
info_bit_user2 = round(rand([1,SymLen*Mod_Order_User2]));
[info_symbol_user1,Aster_user1] = lte_modulation(info_bit_user1,Mod_Order_User1);
[info_symbol_user2,Aster_user2] = lte_modulation(info_bit_user2,Mod_Order_User2);
% ==================================== subplot(2,3,1) ====================================
subplot(2,3,1); plot(real(info_symbol_user1),imag(info_symbol_user1),'o'); title('Transmitter Constellation of UE1');axis([-1,1,-1,1]);
subplot(2,3,2); plot(real(info_symbol_user2),imag(info_symbol_user2),'o'); title('Transmitter Constellation of UE2');axis([-1,1,-1,1]);
TX_Symbol = P1*info_symbol_user1 + P2*info_symbol_user2;
% ==================================== subplot(2,3,3) ====================================
subplot(2,3,3);plot(real(TX_Symbol),imag(TX_Symbol),'o');title('Transmitter Constellation of UE1+UE2');axis([-1,1,-1,1]);
%% AWGN channel
rate_user1 = Mod_Order_User1;
PowS1 = info_symbol_user1*info_symbol_user1'/SymLen;
Sigma_user1 = P1*sqrt(PowS1/(2*rate_user1*10^(SNR_dB(SNR_cnt)/10)));
Noise_user1 = Sigma_user1*(randn(1,length(TX_Symbol))+1j*randn(1,length(TX_Symbol)));
rate_user2 = Mod_Order_User2;
PowS2 = info_symbol_user2*info_symbol_user2'/SymLen;
Sigma_user2 = P2*sqrt(PowS2/(2*rate_user2*10^((SNR_dB(SNR_cnt))/10)));
Noise_user2 = Sigma_user2*(randn(1,length(TX_Symbol))+1j*randn(1,length(TX_Symbol)));
Rx_Symbol_user1 = TX_Symbol + Noise_user1;
Rx_Symbol_user2 = TX_Symbol + Noise_user2;
PowS = TX_Symbol*TX_Symbol'/SymLen;
% ==================================== subplot(2,3,4-5) ====================================
subplot(2,3,4); plot(real(Rx_Symbol_user1),imag(Rx_Symbol_user1),'o');title('Receive Constellation of UE1)');
subplot(2,3,5); plot(real(Rx_Symbol_user2),imag(Rx_Symbol_user2),'o');title('Receive Constellation of UE2)');
%% Receiver for UE2
Aster_Table_user2 = repmat(Aster_user2*P2,[1,SymLen]);
Rx_Symbol_user2_table = repmat(Rx_Symbol_user2,[2^Mod_Order_User2,1]);
[~,index] = min(Rx_Symbol_user2_table-Aster_Table_user2);
Temp = fliplr(de2bi(index-1,Mod_Order_User2));
demodulated_bit_User2 = reshape(Temp',1,[]);
Error_User2 = length(find(demodulated_bit_User2~=info_bit_user2));
if Error_User2 ~= 0
ErrNum2 = ErrNum2 + Error_User2;
FerNum2 = FerNum2 + 1;
end
%% Receiver for UE1
Aster_Table_user2 = repmat(Aster_user2*P2,[1,SymLen]);
Rx_Symbol_user2_table = repmat(Rx_Symbol_user1,[2^Mod_Order_User2,1]);
[~,index] = min(Rx_Symbol_user2_table-Aster_Table_user2);
Temp = fliplr(de2bi(index-1,Mod_Order_User2));
demodulated_bit_User2 = reshape(Temp',1,[]);
[Reconstrcut_symbol_user2,~] = lte_modulation(demodulated_bit_User2,Mod_Order_User2);
SIC_Symbol_user1 = Rx_Symbol_user1 - Reconstrcut_symbol_user2*P2;
Aster_Table_user1 = repmat(Aster_user1*P1,[1,SymLen]);
% ==================================== subplot(2,3,4-5) ====================================
subplot(2,3,6);plot(real(SIC_Symbol_user1),imag(SIC_Symbol_user1),'o');title('Receive Constellationl of UE1 after SIC');
Rx_Symbol_user1_table = repmat(SIC_Symbol_user1,[2^Mod_Order_User1,1]);
[~,index] = min(Rx_Symbol_user1_table-Aster_Table_user1);
Temp = fliplr(de2bi(index-1,Mod_Order_User1));
demodulated_bit_User1 = reshape(Temp',1,[]);
Error_User1 = length(find(demodulated_bit_User1~=info_bit_user1));
if Error_User1 ~= 0
ErrNum1 = ErrNum1 + Error_User1;
FerNum1 = FerNum1 + 1;
end
%%%% Display Simulation Info. %%%%
clc
fprintf('\n Simulation of Multi-user Superposition Transmission Scheme \n');
fprintf('\n Eb/N0(dB) = %4.2f\n',SNR_dB(SNR_cnt));
% Current Eb/N0
fprintf('\n Frame number = %d\n',FrameNum);
% Transmitted Frame
fprintf('\n Current bit error of UE1 = %d\n',Error_User1);
% Current bit error
fprintf('\n Current bit error of UE2 = %d\n',Error_User2);
% Current bit error
fprintf('\n Current frame error = %d\n',FerNum1);
% Current frame error
fprintf('\n Current frame error = %d\n',FerNum2);
% Current frame error
BerRatio1(SNR_cnt) = ErrNum1/(Mod_Order_User1*SymLen*FrameNum);
BerRatio2(SNR_cnt) = ErrNum2/(Mod_Order_User2*SymLen*FrameNum);
% Calculate bit error ratio
FerRatio1(SNR_cnt) = FerNum1/FrameNum;
FerRatio2(SNR_cnt) = FerNum2/FrameNum;
% Calculate frame error ratio
fprintf('\n Current bit error ratio of UE1 = %4.2e\n',BerRatio1(SNR_cnt));
% Current bit Error ratio
fprintf('\n Current frame error ratio of UE1 = %4.2e\n',FerRatio1(SNR_cnt));
% Current frame error ratio
fprintf('\n Current bit error ratio of UE2 = %4.2e\n',BerRatio2(SNR_cnt));
% Current bit Error ratio
fprintf('\n Current frame error ratio of UE2 = %4.2e\n',FerRatio2(SNR_cnt));
% Current frame error ratio
end
if BerRatio1(SNR_cnt) == 0
break;
end
end
clc
fprintf('\n*******Okay! MSUT simulation finisheded!*******\n');
fprintf('\n Time used = %4.2e\n',toc);
figure
semilogy(SNR_dB,BerRatio1,'b-o','LineWidth',2);hold on;
semilogy(SNR_dB,BerRatio2,'r-s','LineWidth',2);grid on;
xlabel('SNR(dB)');ylabel('BER');
legend('UE_N,QPSK,alpha=0.762,AWGN,basic MUST','UE_F,QPSK,alpha=0.762,AWGN,basic MUST');
str=strcat('BER Performance of direct superposition Scheme');
title(str);
str='BER Performance of basic MUST Scheme under AWGN channel with QQ762';
saveas(gcf,str);
评论0