diff --git a/targets/PROJECTS/TDDREC/genorthpskseq.m b/targets/PROJECTS/TDDREC/genorthpskseq.m deleted file mode 100644 index 184485e871b5eb303ccc8f0aa2ea9b3e95cc39d1..0000000000000000000000000000000000000000 --- a/targets/PROJECTS/TDDREC/genorthpskseq.m +++ /dev/null @@ -1,32 +0,0 @@ -function [carrierdata, s]=genorthqpskseq(Ns,N,amp) - -if(N!=512*150) - error('The sequence length must be 76800.'); -endif - -s = zeros(N,Ns); -H=1; for k=1:log2(128) H=[H H; H -H]; end; H=H(:,1:120); -i=1; while(i<size(H,1)) h=H(i,:); inds=find(h*H'!=0); H(inds,:)=[]; H=[h; H]; i=i+1; end -Hc=H+sqrt(-1)*H; -if(sum(Hc*Hc'-240*eye(8))>0) error("The code is not orhtogonal\n"); endif - -carrierdata=zeros(120,Ns*301); -orthinds=1:8; -for i=1:301 - for k=1:Ns - randind=ceil((9-k)*rand()); - carrierdata(:,i+(k-1)*301)=Hc(orthinds(randind),:)'; - orthinds(randind)=[]; - endfor -endfor - -for k=1:Ns - for i=0:119 - fblock=[0 carrierdata(i,1:150) zeros(1,210) carrierdata(i,151:301)]; - ifblock=ifft(fblock,512); - block = [ifblock(end-127:end) ifblock]; # Cycl. prefix - s([1:640]+i*640,k)=floor(amp*block); - endfor -endfor - -endfunction \ No newline at end of file diff --git a/targets/PROJECTS/TDDREC/genorthqpskseq.m b/targets/PROJECTS/TDDREC/genorthqpskseq.m index b42d449d7f8eef4c9cbd8519fe1ec604eb8e79e6..fdec735ec91fa5d9d59d45e948e93f158e40e30b 100644 --- a/targets/PROJECTS/TDDREC/genorthqpskseq.m +++ b/targets/PROJECTS/TDDREC/genorthqpskseq.m @@ -1,3 +1,7 @@ +# % Author: Mirsad Cirkic +# % Organisation: Eurecom (and Linkoping University) +# % E-mail: mirsad.cirkic@liu.se + function [carrierdata, s]=genorthqpskseq(Ns,N,amp) if(N!=512*150) diff --git a/targets/PROJECTS/TDDREC/genrandpskseq.m b/targets/PROJECTS/TDDREC/genrandpskseq.m index 8d0030c13ce87696b5fea4e0d2c7ff3f5701e55f..9ff15d2845514eb185fa1de72dc11d12a14551a4 100644 --- a/targets/PROJECTS/TDDREC/genrandpskseq.m +++ b/targets/PROJECTS/TDDREC/genrandpskseq.m @@ -1,3 +1,8 @@ +# % Author: Mirsad Cirkic +# % Organisation: Eurecom (and Linkoping University) +# % E-mail: mirsad.cirkic@liu.se + + function [carrierdata, s]=genrandpskseq(N,M,amp) if(mod(N,640)~=0) diff --git a/targets/PROJECTS/TDDREC/initparams.m b/targets/PROJECTS/TDDREC/initparams.m index 222683a9a2ce403ec2aa5403314303ce8ea0fd83..3f3fd691993fc3868efecb9dcfd3fe54ae462aef 100644 --- a/targets/PROJECTS/TDDREC/initparams.m +++ b/targets/PROJECTS/TDDREC/initparams.m @@ -1,3 +1,7 @@ +# % Author: Mirsad Cirkic +# % Organisation: Eurecom (and Linkoping University) +# % E-mail: mirsad.cirkic@liu.se + clear paramsinitialized=false; limeparms; @@ -8,7 +12,7 @@ card = 0; Ntrx=4; dual_tx=0; active_rfA=[1 0 0 0]; -active_rfB=[0 1 1 0]; +active_rfB=[0 1 0 0]; active_rf=active_rfA+active_rfB; %fc = 2660000000; diff --git a/targets/PROJECTS/TDDREC/runmeas.m b/targets/PROJECTS/TDDREC/runmeas.m index 56ddd9d9c7765157448e2f7537dc92c7ff8c1556..3586e42d4f63bec056736e10d45b364947f8d2cd 100644 --- a/targets/PROJECTS/TDDREC/runmeas.m +++ b/targets/PROJECTS/TDDREC/runmeas.m @@ -1,3 +1,7 @@ +# % Author: Mirsad Cirkic +# % Organisation: Eurecom (and Linkoping University) +# % E-mail: mirsad.cirkic@liu.se + if(paramsinitialized) N=76800; M=4; @@ -116,7 +120,7 @@ if(paramsinitialized) oarf_stop(card); # # -- Do the channel estimation - chanests=reshape(diag(repmat(Db2a_T,Niter,1)'*repmat(Db2a_R,1,Nantb)/(Niter*120)),301,Nantb) + chanests=reshape(diag(repmat(Db2a_T,Niter,1)'*repmat(Db2a_R,1,Nantb)/(Niter*120)),301,Nantb); H=conj(repmat(Db2a_T,Niter,1)).*repmat(Db2a_R,1,Nantb); phases=unwrap(angle(H)); # for i=0:(Nantb-1) diff --git a/targets/PROJECTS/TDDREC/runmeas_woduplex.m b/targets/PROJECTS/TDDREC/runmeas_woduplex.m new file mode 100644 index 0000000000000000000000000000000000000000..232b4d876e36ebab506dceeb59841fd9570b857d --- /dev/null +++ b/targets/PROJECTS/TDDREC/runmeas_woduplex.m @@ -0,0 +1,141 @@ +# % Author: Mirsad Cirkic +# % Organisation: Eurecom (and Linkoping University) +# % E-mail: mirsad.cirkic@liu.se + +if(paramsinitialized) + disp("This code is so far only written for single runs. Multiple \ + runs will overwrite the previous measurement data, i.e., the \ + data structures are not defined for multiple runs. You will need to \ + add code in order to save the intermediate measurements.") + N=76800; + M=4; + signalB2A=zeros(N,1); + signalA2B=zeros(N,4); + indA=find(active_rfA==1); + indB=find(active_rfB==1); + Nanta=length(indA); + Nantb=length(indB); + if(Nanta!=1) error("Node A can only have one antenna active\n"); endif + Niter=1; + if(Niter!=1) error("We should only use one get_frame at each \ + run.\n"); + endif + +# %% ------- Prepare the signals for both A2B and B2A ------- %% + [Da2b_T, signalA2B]=genrandpskseq(N,M,amp); + signalA2B=repmat(signalA2B,1,4); + signalB2A=zeros(N,4); + [Db2a_T,tmps]=genorthqpskseq(Nantb,N,amp); + ind=1; + for i=1:4 + if(indB(ind)==i) + signalB2A(:,i)=tmps(:,ind); + if(length(indB)> ind) ind=ind+1; endif + endif + endfor + +# %% ------- Node A to B transmission/reception ------- %% + rf_mode_current = rf_mode + (DMAMODE_TX+TXEN)*active_rfA +(DMAMODE_RX+RXEN)*active_rfB; + oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rx_gain,tx_gain,eNB_flag,rf_mode_current,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal_mode); + oarf_send_frame(card,signalA2B,n_bit); + receivedB2A=oarf_get_frame(card); + oarf_stop(card); + +# %% ------- Node B to A transmission/reception ------- %% + rf_mode_current = rf_mode + (DMAMODE_TX+TXEN)*active_rfB +(DMAMODE_RX+RXEN)*active_rfA; + oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rx_gain,tx_gain,eNB_flag,rf_mode_current,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal_mode); + oarf_send_frame(card,signalB2A,n_bit); + receivedB2A=oarf_get_frame(card); + oarf_stop(card); + +# %% ------- Do the A to B channel estimation ------- %% + Da2b_R=zeros(Niter*120,Nantb*301); + for i=0:119; + ifblock=receivedA2B(i*640+[1:640],indB); + ifblock(1:128,:)=[]; + fblock=fft(ifblock); + fblock(1,:)=[]; + fblock(151:360,:)=[]; + Da2b_R(iter*120+i+1,:)=vec(fblock); + endfor + HA2B=conj(Da2b_T).*Da2b_R; + phasesA2B=unwrap(angle(HA2B)); + if(mean(var(phasesA2B))>0.5) + disp("The phases of your estimates are a bit high (larger than 0.5 rad.), something is wrong."); + endif + + chanestsA2B=diag(Da2b_T'*Da2b_R)/size(Da2b_T,1); + for i=0:(Nantb-1) + fchanestsA2B(:,i+1)=[0; chanestsA2B(301*i+[1:150]); zeros(210,1); chanestsA2B(301*i+[151:301])]; + endfor + tchanestsA2B=ifft(fchanestsA2B); + +%% ------- Do the B to A channel estimation ------- %% + Db2a_R=zeros(Niter*120,Nanta*301); + for i=0:119; + ifblock=receivedB2A(i*640+[1:640],indA); + ifblock(1:128,:)=[]; + fblock=fft(ifblock); + fblock(1,:)=[]; + fblock(151:360,:)=[]; + Db2a_R(iter*120+i+1,:)=fblock.'; + endfor + HB2A=conj(repmat(Db2a_T,Niter,1)).*repmat(Db2a_R,1,Nantb); + phasesB2A=unwrap(angle(HB2A)); + if(mean(var(phasesB2A))>0.5) + disp("The phases of your estimates are a bit high (larger than 0.5 rad.), something is wrong."); + endif + chanestsB2A=reshape(diag(repmat(Db2a_T,Niter,1)'*repmat(Db2a_R,1,Nantb)/(Niter*120)),301,Nantb); + +# %% -- Some plotting code -- %% (you can uncomment what you see fit) + # clf + # figure(1) + # for i=1:4 + # subplot(220+i);plot(20*log10(abs(fftshift(fft(receivedA2B(:,i)))))); + # endfor + + # figure(2) + # t=[0:512-1]/512*1e-2; + # plot(t,abs(tchanests)) + # xlabel('time') + # ylabel('|h|') + + # figure(3) + # % wndw = 50; + # % for i=1:5:Nantb*301 %# sliding window size + # % phamean = filter(ones(wndw,1)/wndw, 1, phases(:,i)); %# moving average + # % plot(phamean(wndw:end),'LineWidth',2); + # % title(['subcarrier ' num2str(i)]); + # % xlabel('time') + # % ylabel('phase') + # % ylim([-pi pi]) + # % drawnow; + # % pause(0.1) + # % endfor + # phavar=var(phases); + # plotphavar=[]; + # for i=0:Nantb-1 + # plotphavar=[plotphavar; phavar([1:301]+i*301)]; + # endfor + # plot([1:150 362:512],plotphavar,'o'); + # %ylim([0 pi]) + # xlabel('subcarrier') + # ylabel('phase variance') + + + # figure(4) + # plot(20*log10(abs(fchanests))), ylim([40 100]) + + # %end + # fprintf(' done\n') + + + # for i=0:(Nantb-1) + # fchanests(:,i+1)=[0; chanests(301*i+[1:150]); zeros(210,1); chanests(301*i+[151:301])]; + # endfor + # tchanests=ifft(fchanests); + + +else + error("You have to run init.params.m first!") +end