Pre-ci test passed git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
123 lines
5.0 KiB
Matlab
123 lines
5.0 KiB
Matlab
% Channel Capacity of LTE mode 5 with the eNodeB with 2 antennas and 2
|
|
% single antenna users using the scheduling algorithm of aligning
|
|
% interference in the opposite quadrant
|
|
|
|
|
|
% clear;
|
|
% clc;
|
|
% close all;
|
|
% warning off all
|
|
% format('long');
|
|
|
|
% LTE with scheduling in opposite quadrant or without scheduling
|
|
%sigmasq_x2_all = 0:0.1:1;
|
|
%for i = 1:length(sigmasq_x2_all)
|
|
|
|
M1=4;% QAM on first antenna
|
|
M2=4;% QAM on second antenna
|
|
SNR = 0:9;
|
|
N_channel = 1000; % No of channel realizations
|
|
N_noise = 100; % No of noise realizations
|
|
|
|
alpha_1 =zeros(length(SNR),N);
|
|
beta_1 =zeros(length(SNR),N);
|
|
alpha_2 =zeros(length(SNR),N);
|
|
beta_2 =zeros(length(SNR),N);
|
|
chcap_lte_sch1 = zeros(length(SNR),N);
|
|
chcap_lte_sch2 = zeros(length(SNR),N);
|
|
chcap_lte_sch = zeros(length(SNR),N);
|
|
|
|
for v=1:length(SNR)
|
|
seed(1) = 13579;
|
|
seed(2) = 24680;
|
|
rand('state', seed(1));
|
|
randn('state', seed(2));
|
|
N0=10^(-SNR(v)/10);
|
|
sigmasq_x1 = 0.5;
|
|
sigmasq_x2 = 0.5;
|
|
[stream1]=sqrt(sigmasq_x1)*mapping(M1); %x1 1x648
|
|
[stream2]=sqrt(sigmasq_x2)*mapping(M2); %x2 1x648
|
|
for k=1:N %channel loop
|
|
fprintf('v=%d,k=%d\n',v,k);
|
|
[h1 h2]=channel;
|
|
H=[h1 h2]; %first row is the channel to user-1 and second row is the channel to user-2
|
|
match_precoder_norm=(1/sqrt(2))*[H(1,:)'/norm(H(1,:)) H(2,:)'/norm(H(2,:))]; %Frobenius norm is 1
|
|
lte_precoder=[(match_precoder_norm(1,1))'*match_precoder_norm(:,1) (match_precoder_norm(1,2))'*match_precoder_norm(:,2)];
|
|
lte_precoder_norm=[lte_precoder(:,1)/lte_precoder(1,1) lte_precoder(:,2)/lte_precoder(1,2)];
|
|
lte_std_precoder=[1 -1 sqrt(-1) -sqrt(-1)];
|
|
[val pos]=min([-real(lte_precoder(2,1)) real(lte_precoder(2,1)) -imag(lte_precoder(2,1)) imag(lte_precoder(2,1))]);
|
|
lte_precoder_norm1=[1;lte_std_precoder(pos)];
|
|
[val pos]=min([-real(lte_precoder(2,2)) real(lte_precoder(2,2)) -imag(lte_precoder(2,2)) imag(lte_precoder(2,2))]);
|
|
lte_precoder_norm2=[1;lte_std_precoder(pos)];
|
|
lte_precoder_qtz_orig=(1/sqrt(4))*[ lte_precoder_norm1 lte_precoder_norm2];
|
|
%Scheduling to put interference in the opposite quadrant
|
|
lte_precoder_qtz1=[ lte_precoder_qtz_orig(1,1) lte_precoder_qtz_orig(1,2); lte_precoder_qtz_orig(2,1) -lte_precoder_qtz_orig(2,1)]; %For opposite precoder
|
|
lte_precoder_qtz2=[ lte_precoder_qtz_orig(1,1) lte_precoder_qtz_orig(1,2); -lte_precoder_qtz_orig(2,2) lte_precoder_qtz_orig(2,2)]; %For opposite precoder
|
|
alpha_1(v,k)=H(1,:)*lte_precoder_qtz1(:,1);
|
|
beta_2(v,k)=H(1,:)*lte_precoder_qtz1(:,2);
|
|
beta_1(v,k)=H(2,:)*lte_precoder_qtz2(:,1);
|
|
alpha_2(v,k)=H(2,:)*lte_precoder_qtz2(:,2);
|
|
|
|
logsum_lte_sch1=0;
|
|
logsum_lte_sch2=0;
|
|
for l=1:10 %noise loop
|
|
z=sqrt(N0)*sqrt(1/2).*(randn(1,1)+sqrt(-1)*randn(1,1));
|
|
for s1=1:M1
|
|
x1=stream1(s1);
|
|
for s2=1:M2
|
|
x2=stream2(s2);
|
|
y_lte1=alpha_1(v,k)*x1+beta_2(v,k)*x2+z;
|
|
y_lte2=beta_1(v,k)*x1+alpha_2(v,k)*x2+z;
|
|
den_lte_sch1=0;
|
|
den_lte_sch2=0;
|
|
%For first stream
|
|
for t=1:M2
|
|
x2_d=stream2(t);
|
|
den_lte_sch1=den_lte_sch1+exp((-1/N0)*norm(y_lte1-H(1,:)*lte_precoder_qtz1(:,1)*x1-H(1,:)*lte_precoder_qtz1(:,2)*x2_d)^2);
|
|
end
|
|
% For second stream
|
|
for t=1:M1
|
|
x1_d=stream1(t);
|
|
den_lte_sch2=den_lte_sch2+exp((-1/N0)*norm(y_lte2-H(2,:)*lte_precoder_qtz2(:,1)*x1_d-H(2,:)*lte_precoder_qtz2(:,2)*x2)^2);
|
|
end
|
|
neu_lte_sch1=0;
|
|
neu_lte_sch2=0;
|
|
for g=1:M1;
|
|
x1_dd=stream1(g);
|
|
for h=1:M2
|
|
x2_dd=stream2(h);
|
|
neu_lte_sch1=neu_lte_sch1+exp((-1/N0)*norm(y_lte1-H(1,:)*lte_precoder_qtz1(:,1)*x1_dd-H(1,:)*lte_precoder_qtz1(:,2)*x2_dd)^2);
|
|
end
|
|
end
|
|
%For second stream
|
|
for g=1:M2;
|
|
x2_ddd=stream2(g);
|
|
for h=1:M1
|
|
x1_ddd=stream1(h);
|
|
neu_lte_sch2=neu_lte_sch2+exp((-1/N0)*norm(y_lte2-H(2,:)*lte_precoder_qtz2(:,1)*x1_ddd-H(2,:)*lte_precoder_qtz2(:,2)*x2_ddd)^2);
|
|
end
|
|
end
|
|
logsum_lte_sch1=logsum_lte_sch1+log2(neu_lte_sch1/den_lte_sch1);
|
|
logsum_lte_sch2=logsum_lte_sch2+log2(neu_lte_sch2/den_lte_sch2);
|
|
end
|
|
end
|
|
end
|
|
|
|
chcap_lte_sch1(v,k)=log2(M1)-logsum_lte_sch1/(M1*M2*N_noise);
|
|
chcap_lte_sch2(v,k)=log2(M2)-logsum_lte_sch2/(M1*M2*N_noise);
|
|
chcap_lte_sch(v,k)=log2(M1)-logsum_lte_sch1/(M1*M2*N_noise)+log2(M2)-logsum_lte_sch2/(M1*M2*N_noise);
|
|
|
|
end
|
|
|
|
end
|
|
%end
|
|
|
|
%save QPSK_QPSK_lte_Mode5.mat;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|