% NOMA_2U_V1 LTE系统NOMA主程序——2用户 & 16-QAM调制 & 多径瑞利信道(有噪)(假设信道估计已知)
clear;
warning off;
%% 参数设置
N_carr=1200; %子载波数
N_fft=2048; %FFT点数
N_slot=200; %时隙数
N_symperslot=7; %每个时隙OFDM符号的个数
N_sym=N_slot*N_symperslot; %OFDM符号的个数
N_datasym=N_carr*N_sym; %传输的数据点数(调制符号数)
N_bitpersym=4; %每个调制符号的比特数(16-QAM调制中为4)
N_cp=100; %循环前缀点数
F_sym=30.72e6; %数据采样速率(每秒传输的数据点数)
% 用户1瑞利信道参数
F_doppler_u1=500; %最大多普勒频偏(Hz)
N_path_u1=3; %瑞利多径信道路径数
d1_u1=9; %第2径的延时(点数)
d2_u1=15; %第3径的延时(点数)
delay_u1p=[0 d1_u1 d2_u1]; %各路径的延时(点数)
delay_u1=delay_u1p/F_sym; %各路径的延时(s)
power_u1=[0 -16 -30]; %各路径的功率(dB)
SNR_u1=[0:4:20,22:2:30]; %不同的信噪比
% 用户2瑞利信道参数
F_doppler_u2=500; %最大多普勒频偏(Hz)
N_path_u2=3; %瑞利多径信道路径数
d1_u2=9; %第2径的延时(点数)
d2_u2=15; %第3径的延时(点数)
delay_u2p=[0 d1_u2 d2_u2]; %各路径的延时(点数)
delay_u2=delay_u2p/F_sym; %各路径的延时(s)
power_u2=[0 -16 -30]; %各路径的功率(dB)
SNR_u2=[10:4:30,32:2:40]; %不同的信噪比
% 两用户功率参数
Rp_db=10; %用户1与用户2的功率分配比dB值
Rp=10^(Rp_db/10); %用户1与用户2的功率分配比,Rp=p_1/p_2,(假设用户1分得的功率比用户2的大)
p_u1=Rp/(1+Rp); %p_1与p_2分别为用户1与用户2的功率分配系数,并假设 p_1+p_2=1
p_u2=1/(1+Rp);
%% 发射端
% 信源产生原始数据信号
initial_u1=round(rand(1,100)); %分别产生两个用户的m序列发生器的寄存器原始状态
initial_u2=round(rand(1,100));
sig_1_u1=m_sequence(initial_u1,N_datasym*N_bitpersym); %产生01伪随机序列
sig_1_u2=m_sequence(initial_u2,N_datasym*N_bitpersym);
% 16QAM调制
sig_2_u1=qam16(sig_1_u1,N_datasym*N_bitpersym);
sig_2_u2=qam16(sig_1_u2,N_datasym*N_bitpersym);
% 重叠码编码
sig_3=sqrt(p_u1)*sig_2_u1+sqrt(p_u2)*sig_2_u2;
% 串并转换
sig_4=reshape(sig_3,N_carr,N_sym); %变为N_carr行的矩阵
% 加入虚拟子载波
sig_5=[zeros((N_fft-N_carr)/2,N_sym);sig_4;zeros((N_fft-N_carr)/2,N_sym)];
% IFFT
sig_6=ifft(sig_5,N_fft,1); %对sig_5的列向量作N_fft点IFFT,频域信号转回时域
% 插入循环前缀
sig_7=[sig_6(N_fft-N_cp+1:N_fft,:);sig_6];
% 并串转换后发送数据
sig_trans=reshape(sig_7,1,(N_fft+N_cp)*N_sym);
%% 用户1信道
% 瑞利衰落
chan=rayleighchan(1/F_sym,F_doppler_u1,delay_u1,power_u1);
chan.StorePathGains=1; %记住各径各点的信道增益
sig_ray=filter(chan,sig_trans);
gain_u1=chan.PathGains;
for l=1:length(SNR_u1)
sig_rec=awgn(sig_ray,SNR_u1(l),'measured');
%% 用户1接收端
% 串并转换
resig_1=reshape(sig_rec,N_fft+N_cp,N_sym);
% 去掉循环前缀
resig_2=resig_1(N_cp+1:N_cp+N_fft,:);
% 消除信道影响(用解方程组的思想,由接收到的信号和信道各径系数,反解出发射信号)
x=est_ideal(resig_2,N_fft,N_sym,N_cp,gain_u1,delay_u1p);
% FFT
resig_3=fft(x,N_fft,1);
% 去掉两边的虚拟子载波
resig_4=resig_3((N_fft-N_carr)/2+1:(N_fft+N_carr)/2,:);
% 并串转换
resig_5=reshape(resig_4,1,N_carr*N_sym);
% 用户1直接16QAM解调判决
resig_6_u1=de_qam16(resig_5/sqrt(p_u1),N_datasym); %总信号除以用户1的功率系数,再进行解调
% 误比特率
[BE_num_u1(l),BER_u1(l)]=biterr(sig_1_u1,resig_6_u1);
disp(['user1 Rp=',num2str(Rp_db),' SNR=',num2str(SNR_u1(l)),' BER=',num2str(BER_u1(l))]);
end
%% 用户2信道
% 瑞利衰落
chan=rayleighchan(1/F_sym,F_doppler_u2,delay_u2,power_u2);
chan.StorePathGains=1; %记住各径各点的信道增益
sig_ray=filter(chan,sig_trans);
gain_u2=chan.PathGains;
for l=1:length(SNR_u2)
sig_rec=awgn(sig_ray,SNR_u2(l),'measured');
%% 用户2接收端
% 串并转换
resig_1=reshape(sig_rec,N_fft+N_cp,N_sym);
% 去掉循环前缀
resig_2=resig_1(N_cp+1:N_cp+N_fft,:);
% 消除信道影响(用解方程组的思想,由接收到的信号和信道各径系数,反解出发射信号)
x=est_ideal(resig_2,N_fft,N_sym,N_cp,gain_u2,delay_u2p);
% FFT
resig_3=fft(x,N_fft,1);
% 去掉两边的虚拟子载波
resig_4=resig_3((N_fft-N_carr)/2+1:(N_fft+N_carr)/2,:);
% 并串转换
resig_5=reshape(resig_4,1,N_carr*N_sym);
% 用户2采用SIC
sic_u1=de_qam16(resig_5/sqrt(p_u1),N_datasym); %先对功率较大的用户1进行解调判决
desic_u1=qam16(sic_u1,N_datasym*N_bitpersym); %重构用户1的信号
desic_u2=resig_5-desic_u1*sqrt(p_u1); %从总信号中减去重构出的用户1的部分
resig_6_u2=de_qam16(desic_u2/sqrt(p_u2),N_datasym); %对功率较小的用户2进行解调判决
% 误比特率
[BE_num_u2(l),BER_u2(l)]=biterr(sig_1_u2,resig_6_u2);
disp(['user2 Rp=',num2str(Rp_db),' SNR=',num2str(SNR_u2(l)),' BER=',num2str(BER_u2(l))]);
end
filenm = ['16QAM_16QAM_Rp', num2str(Rp_db),'.mat'];
save(filenm,'SNR_u1','BER_u1','SNR_u2','BER_u2','-mat');
% % 误比特率作图
% subplot(1,2,1);
% semilogy(SNR_u1,BER_u1);
% xlabel('信噪比SNR(dB)');
% ylabel('误比特率BER(dB)');
% title('用户1误比特率随信道信噪比变化的曲线图');
%
% subplot(1,2,2);
% semilogy(SNR_u2,BER_u2);
% xlabel('信噪比SNR(dB)');
% ylabel('误比特率BER(dB)');
% title('用户2误比特率随信道信噪比变化的曲线图');