From f60f4109475dc95f394cb79352a833ae95c5c390 Mon Sep 17 00:00:00 2001
From: Florian Kaltenberger <florian.kaltenberger@eurecom.fr>
Date: Mon, 7 Oct 2013 13:33:16 +0000
Subject: [PATCH] adding files to test reciprocity beamforming

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4179 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 targets/PROJECTS/TDDREC/alterproj.m           |  37 ++++++
 .../PROJECTS/TDDREC/calibration_beamforming.m | 122 ++++++++++++++++++
 2 files changed, 159 insertions(+)
 create mode 100644 targets/PROJECTS/TDDREC/alterproj.m
 create mode 100644 targets/PROJECTS/TDDREC/calibration_beamforming.m

diff --git a/targets/PROJECTS/TDDREC/alterproj.m b/targets/PROJECTS/TDDREC/alterproj.m
new file mode 100644
index 0000000000..79dabb18dc
--- /dev/null
+++ b/targets/PROJECTS/TDDREC/alterproj.m
@@ -0,0 +1,37 @@
+function [F, HA]=alterproj(CHB2A,CHA2B, s, N, Nl, Nt)
+for l=1:Nl
+    YA(:,((l-1)*Nt+1):(l*Nt))=squeeze(CHB2A{l}(s,:,:));
+    YB(:,((l-1)*Nt+1):(l*Nt))=squeeze(CHA2B{l}(s,:,:));
+end
+
+HA=zeros(N,Nl);
+for l=1:Nl
+    for t=1:Nt
+        HA(:,l)=HA(:,l)+YA(:,t+(l-1)*Nt);
+    end
+    HA(:,l)=HA(:,l)/Nt;
+end
+GA=kron(HA,ones(1,Nt));
+F=YB*GA'*inv(GA*GA');
+oldobj=1e14;
+newobj=norm(YB-F*GA)^2+norm(YA-GA)^2;
+
+while(oldobj-newobj>1e-10)
+    oldobj=newobj;
+    FI=repmat([F; eye(N)],Nt,1);
+    YBA=reshape([YB; YA],2*N*Nt,Nl);
+    FIFI=FI'*FI;
+    if(cond(FIFI)>30)
+        warning(['The cond. number in HA est is ' num2str(cond(FIFI))])
+    end
+    HA=inv(FIFI)*FI'*YBA;
+    GA=kron(HA,ones(1,Nt));
+    GAGA=GA*GA';
+    if(cond(GAGA)>30)
+        warning(['The cond. number in F est. is '  num2str(cond(GAGA))])
+    end
+    F=YB*GA'*inv(GAGA);
+    newobj=norm(YB-F*GA)^2+norm(YA-GA)^2;
+end
+end
+
diff --git a/targets/PROJECTS/TDDREC/calibration_beamforming.m b/targets/PROJECTS/TDDREC/calibration_beamforming.m
new file mode 100644
index 0000000000..4419503669
--- /dev/null
+++ b/targets/PROJECTS/TDDREC/calibration_beamforming.m
@@ -0,0 +1,122 @@
+initparams;
+N = 100; % N is number ofr time-measurements
+Nt = 3; % Nt is the number of antennas at node B
+N_loc = 3; %check
+CHA2B = {}; %this should be a cell array
+CHB2A = {}; %this should be a cell array
+
+% run measurements for all location
+for loc = 1:N_loc
+    run_measwoduplex;
+    % alternatively load the measurements from file for testing
+    % now you should have chanestA2B, fchanestA2B, tchanestA2B, chanestB2A,
+    % fchanestB2A, tchanestB2A
+    CHA2B{loc} = chanestA2B; %to check
+    CHA2B{loc} = chanestA2B; %to check
+    disp('Please move the antenna to another location and press key when finished')
+    pause
+end
+
+%% calculate full F matrix
+for s=1:301
+	[F, HA]=alterproj(CHB2A,CHA2B, s, N, N_loc, Nt); 
+	Fs{s}=F;
+	HAs{s}=HA;
+end
+
+%% plot F
+figure(1)
+clf
+hold on;
+for s=1:size(Fs,3);
+  F=Fs(:,:,s);
+  plot(diag(F),'bo')
+  plot(diag(F,1),'r+')
+  plot(diag(F,2),'gx')
+end
+%axis([-1 1 -1 1])
+hold off;
+
+% do some beamforming
+signalA2B=zeros(N,4);
+signalB2A=zeros(N,4);
+signalB2A_prec=zeros(N,4);
+
+%%----------Node A to B transmission---------%%
+for i=1:4
+    if(indA(ia)==i)
+        [Da2b_T, tmps]=genrandpskseq(N,M,amp);
+        signalA2B(:,i)=tmps*2; %make sure LSB is 0 (switch=tx)
+    else
+        signalA2B(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
+    end
+end
+
+oarf_send_frame(card,signalA2B,n_bit);
+%keyboard
+sleep(0.01);
+receivedA2B=oarf_get_frame(card);
+%oarf_stop(card); %not good, since it does a reset
+sleep(0.01);
+
+%% ------- Do the A to B channel estimation ------- %%
+for i=0:119;
+    ifblock=receivedA2B(i*640+[1:640],indB);
+    ifblock(1:128,:)=[];
+    fblock=fft(ifblock);
+    fblock(1,:)=[];
+    fblock(151:360,:)=[];
+    Da2b_R=vec(fblock);
+end
+chanestsA2B=reshape(diag(repmat(Da2b_T,Nantb)'*Da2b_R)/size(Da2b_T,1),301,Nantb);
+%fchanestsA2B(:,:,meas)=[zeros(1,Nantb); chanestsA2B([1:150],:,meas); zeros(210,Nantb); chanestsA2B(151:301,:,meas)];
+%tchanestsA2B(:,:,meas)=ifft(fchanestsA2B(:,:,meas));
+
+%% calculate beamformer based on chanestA2B 
+for i=1:301
+    YA=squeeze(chanestA2B(i,:,:));
+    F=Fs(:,:,i);
+    Bd(:,i) = conj(F*YA);
+end
+
+%% generate normal and beamformed signals
+[seqf, tmps]=genrandpskseq(N,M,amp);
+for i=1:size(seqf,1)
+    % precoding
+    for j=1:size(seqf,2)
+        symbol_prec(:,j)=Bd(:,j)*seqf(i,j);
+    end
+    % insert zero subcarriers
+    symbol_prec=cat(2,zeros(3,1),symbol_prec(:,1:150),zeros(3,210),symbol_prec(:,151:301));
+    % ofdm modulation
+    symbol_prec_t=ifft(symbol_prec,512,2);
+    % Adding cycl. prefix making the block of 640 elements
+    symbol_prec_cp = cat(2,symbol_prec_t(:,end-127:end), symbol_prec_t);
+    tmps_prec(:,[1:640]+i*640)=floor(amp*symbol_prec_cp);
+end
+
+for i=1:4
+    if(indB(ib)==i)
+        signalB2A(:,i)=tmps*2; %make sure LSB is 0 (switch=tx)
+        signalB2A_prec(:,i)=tmps_prec(i,:)*2; %make sure LSB is 0 (switch=tx)
+    else
+        signalB2A(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
+        signalB2A_prec(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
+    end
+end
+
+%% send normal signal
+oarf_send_frame(card,signalB2A,n_bit);
+%keyboard
+sleep(0.01);
+receivedB2A=oarf_get_frame(card);
+sleep(0.01);
+% measure SNR
+
+%% send beamformed DL signal
+oarf_send_frame(card,signalB2A_prec,n_bit);
+%keyboard
+sleep(0.01);
+receivedB2A=oarf_get_frame(card);
+sleep(0.01);
+% measure SNR
-- 
GitLab