Pre-ci test passed git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
182 lines
5.5 KiB
Matlab
182 lines
5.5 KiB
Matlab
La = 5;
|
|
M = 512;
|
|
L = 30;
|
|
ant = 2;
|
|
frames = 201:210;
|
|
%frames2 = frames;
|
|
frames2 = 501:510;
|
|
|
|
%method = 'tlsdeconv';
|
|
method = 'tlsdeconvangles';
|
|
|
|
|
|
%%
|
|
%H_UE2 = reshape(permute(H_UE(frames,2049:2560,:),[2 1 3]),512,[],2);
|
|
H_UE2 = reshape(permute(H_UE(:,2561:3072,:),[2 1 3]),512,[],2);
|
|
H_UE3 = complex(zeros(size(H_UE2)));
|
|
H_UE3(363:512,:,:) = H_UE2(6:155,:,:);
|
|
H_UE3(1:151,:,:) = H_UE2(156:306,:,:);
|
|
H_UE_t = ifft(conj(H_UE3),512,1); %the channel estimates are stored in conjugated format
|
|
H_UE_t = circshift(H_UE_t,[-15,0,0]); %shift the peak to the desired position
|
|
figure(2)
|
|
hold off
|
|
%waterfall(squeeze(20*log10(abs(H_UE_t))).')
|
|
plot(squeeze(20*log10(abs(H_UE_t(:,frames,ant)))))
|
|
title('PDP DL channel')
|
|
|
|
%%
|
|
H_eNB2 = reshape(permute(H_eNB(:,1501:1800,:),[2 1 3]),300,[],2);
|
|
H_eNB3 = complex(zeros(512,NFrames,2));
|
|
H_eNB3(363:512,:,:) = H_eNB2(1:150,:,:);
|
|
H_eNB3(1:150,:,:) = H_eNB2(151:300,:,:);
|
|
H_eNB_t = ifft(H_eNB3,512,1);
|
|
H_eNB_t = circshift(H_eNB_t,[8,0,0]);
|
|
figure(3)
|
|
hold off
|
|
%waterfall(squeeze(20*log10(abs(H_eNB_t))).')
|
|
plot(squeeze(20*log10(abs(H_eNB_t(:,frames,ant)))))
|
|
title('PDP UL channel')
|
|
|
|
%% compensate the time drift
|
|
Lanczos=@(x,a)sinc(x).*sinc(x/a);
|
|
Lt=@(t)toeplitz([Lanczos((0:-1:-La)+t,La).'; zeros(M-1-La,1)],[Lanczos((0:1:La)+t,La) zeros(1,M-1-La)]);
|
|
|
|
abs_timing_offset=double([estimates_UE(1:1000).timing_offset]);
|
|
slope = (abs_timing_offset(1000)-abs_timing_offset(122))./(1000-122);
|
|
rel_timing_offset=abs_timing_offset-abs_timing_offset(122)-slope*(-121:1000-122);
|
|
|
|
for i=1:NFrames
|
|
for j=1:2
|
|
H_UE_t(:,i,j) = Lt(rel_timing_offset(i))*H_UE_t(:,i,j);
|
|
H_eNB_t(:,i,j) = Lt(-rel_timing_offset(i))*H_eNB_t(:,i,j);
|
|
end
|
|
end
|
|
|
|
H_UE_t = H_UE_t(1:L,:,:);
|
|
H_eNB_t = H_eNB_t(1:L,:,:);
|
|
|
|
figure(12)
|
|
hold off
|
|
waterfall(squeeze(20*log10(abs(H_UE_t(:,frames,ant)))).')
|
|
title('PDP compensated DL channel')
|
|
figure(13)
|
|
hold off
|
|
waterfall(squeeze(20*log10(abs(H_eNB_t(:,frames,ant)))).')
|
|
title('PDP compensated UL channel')
|
|
|
|
%%
|
|
addpath('E:\Synchro\kaltenbe\My Documents\Matlab\reciprocity')
|
|
clear p
|
|
for j=1:2
|
|
if strcmp(method,'tlsdeconvangles')
|
|
fprintf('\ntlsdeconvangles\n')
|
|
[p(:,j),phi_hat,costnew(j)]=tlsdeconvangles(H_UE_t(:,frames,j),H_eNB_t(:,frames,j),20);
|
|
phi_hat_last(:,j) = phi_hat(:,end);
|
|
elseif strcmp(method,'tlsdeconv')
|
|
fprintf('\ntlsdeconv\n')
|
|
[p(:,j),costnew(j)]=tlsdeconv(H_UE_t(:,frames,j),H_eNB_t(:,frames,j),20);
|
|
phi_hat_last(:,j) = zeros(length(frames),1);
|
|
else
|
|
error('unknow method %s',method);
|
|
end
|
|
|
|
end
|
|
|
|
%%
|
|
colors=['b' 'g' 'r' 'c' 'm' 'y' 'k' 'b' 'g' 'r'];
|
|
|
|
if strcmp(method,'tlsdeconvangles')
|
|
figure(5)
|
|
clf; hold on
|
|
niter=size(phi_hat,2);
|
|
for k=2:size(phi_hat,1);
|
|
polar(phi_hat(k,:),1:niter,colors(k-1));
|
|
%polar(-reference(k)/180*pi,niter,[colors(k-1) 'o']);
|
|
end
|
|
end
|
|
|
|
figure(6)
|
|
hold off
|
|
plot(abs(p))
|
|
title('p')
|
|
|
|
%% test the estimated reciprocity filter p by applying it to a differnt part of the measurements
|
|
g = H_eNB_t(:,frames2,:);
|
|
h = H_UE_t(:,frames2,:);
|
|
% reconstruct g from h
|
|
for j=1:2
|
|
g_hat(:,:,j) = filter(p(:,j),1,h(:,:,j));
|
|
if all(frames==frames2)
|
|
for i=1:length(frames)
|
|
g_hat(:,i,j) = exp(-1j*phi_hat_last(i,j)).*g_hat(:,i,j);
|
|
end
|
|
end
|
|
end
|
|
G = fft(g,512,1);
|
|
G_hat = fft(g_hat,512,1);
|
|
H = fft(h,512,1);
|
|
|
|
% normalize G and G_hat
|
|
scale_G = sqrt(mean(mean(mean(abs(G).^2,1),2),3));
|
|
scale_G_hat = sqrt(mean(mean(mean(abs(G_hat).^2,1),2),3));
|
|
scale_H = sqrt(mean(mean(mean(abs(H).^2,1),2),3));
|
|
|
|
G=G./scale_G;
|
|
G_hat = G_hat./scale_G_hat;
|
|
H=H./scale_H;
|
|
|
|
%%
|
|
addpath('E:\Synchro\kaltenbe\My Documents\Matlab\reciprocity\ICC paper');
|
|
SNR_vec_dB = -10:10:40;
|
|
SNR_vec = 10.^(SNR_vec_dB./10);
|
|
C_CSIR = zeros(512,length(frames2),length(SNR_vec));
|
|
C_CSIT_perf = zeros(512,length(frames2),length(SNR_vec));
|
|
C_CSIT_calib = zeros(512,length(frames2),length(SNR_vec));
|
|
C_CSIT_nocalib = zeros(512,length(frames2),length(SNR_vec));
|
|
for i=1:512
|
|
for j=1:length(frames2)
|
|
[C_CSIR(i,j,:), C_CSIT_perf(i,j,:), C_CSIT_calib(i,j,:)] = cap_miso(squeeze(G(i,j,:)).', squeeze(G_hat(i,j,:)).', SNR_vec.');
|
|
[~, ~, C_CSIT_nocalib(i,j,:)] = cap_miso(squeeze(G(i,j,:)).', squeeze(H(i,j,:)).', SNR_vec.');
|
|
end
|
|
end
|
|
|
|
scale_C = 1/(1e-3/14) * 1/4.5e6;
|
|
|
|
%%
|
|
figure(10)
|
|
hold off
|
|
plot(SNR_vec_dB,scale_C*squeeze(mean(sum(C_CSIT_perf,1),2)),'ro--');
|
|
hold on
|
|
plot(SNR_vec_dB,scale_C*squeeze(mean(sum(C_CSIT_calib,1),2)),'mx:');
|
|
%plot(SNR_vec_dB,scale_C*squeeze(mean(sum(C_CSIT_calib_nofreqoff,1),2)),'c+:');
|
|
plot(SNR_vec_dB,scale_C*squeeze(mean(sum(C_CSIR,1),2)),'bs--');
|
|
plot(SNR_vec_dB,scale_C*squeeze(mean(sum(C_CSIT_nocalib,1),2)),'kd-');
|
|
%legend('CSIR + perfect CSIT', 'CSIR + calibrated CSIT', 'CSIR + calibrated no freq offset', ...
|
|
% 'CSIR only', 'CSIR + uncalibrated CSIT', 'Location', 'Northwest')
|
|
legend('CSIR + perfect CSIT', 'CSIR + calibrated CSIT', ...
|
|
'CSIR only', 'CSIR + uncalibrated CSIT', 'Location', 'Northwest')
|
|
xlabel('SNR [dB]')
|
|
ylabel('Capacity [bit/sec/Hz]')
|
|
|
|
%%
|
|
figure(7)
|
|
p = squeeze(20*log10(abs(g(:,:,ant)))).';
|
|
waterfall(max(p,zeros(size(p))))
|
|
zlim([0 50])
|
|
title('|g|^2 [dB]')
|
|
xlabel('Delay Time [samples]')
|
|
ylabel('Snapshots')
|
|
|
|
figure(8)
|
|
p = squeeze(20*log10(abs(g_hat(:,:,ant)))).';
|
|
waterfall(max(p,zeros(size(p))))
|
|
zlim([0 50])
|
|
title('|\hat{g}|^2 [dB]')
|
|
xlabel('Delay Time [samples]')
|
|
ylabel('Snapshots')
|
|
|
|
figure(9)
|
|
hold off
|
|
mse = abs(g-g_hat).^2./abs(g).^2;
|
|
surf(squeeze(10*log10(mse(:,:,ant))).')
|
|
title('mse [dB]') |