beamforming.m 3.23 KB
Newer Older
1 2 3
% do some beamforming
signalA2B=zeros(N,4);
signalB2A=zeros(N,4);
4 5
signalB2A_prec_full=zeros(N,4);
signalB2A_prec_diag=zeros(N,4);
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
6 7
Da2b_R=zeros(Niter*120,Nantb*301);
Db2a_R=zeros(Niter*120,Nanta*301);
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

%%----------Node A to B transmission---------%%
for i=1:4
    if(active_rfA(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(i+1,:)=vec(fblock);
end
chanestsA2B=reshape(diag(repmat(Da2b_T,1,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=chanestsA2B(i,:).';
    F=Fs(:,:,i);
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
43 44 45
    Fd=Fds(:,:,i);
    BFs(:,i) = conj(F*YA)./norm(F*YA);
    BDs(:,i) = conj(Fd*YA)./norm(Fd*YA);
46 47 48 49 50 51 52
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)
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
53 54
        seqf_prec_full(:,i,j)=BFs(:,j)*seqf(i,j);
        seqf_prec_diag(:,i,j)=BDs(:,j)*seqf(i,j);
55 56 57
    end
end

Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
58 59 60 61
tmps_prec_diag = ofdm_mod(seqf_prec_full,amp);
tmps_prec_full = ofdm_mod(seqf_prec_diag,amp);

%%
62 63 64
for i=1:4
    if(active_rfB(i))
      signalB2A(:,i)=floor(tmps/sqrt(3))*2; %make sure LSB is 0 (switch=tx)
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
65 66
      signalB2A_prec_full(:,i)=tmps_prec_full(i-1,:)*2; %make sure LSB is 0 (switch=tx)
      signalB2A_prec_diag(:,i)=tmps_prec_diag(i-1,:)*2; %make sure LSB is 0 (switch=tx)
67
    else
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
68 69 70
      signalB2A(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
      signalB2A_prec_full(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
      signalB2A_prec_diag(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
71 72 73 74 75 76 77 78 79 80 81 82 83 84
    end
end

%% send normal signal
P_tx = 10*log10(sum(mean(abs(signalB2A(:,2:4)).^2)))
oarf_send_frame(card,signalB2A,n_bit);
%keyboard
sleep(0.01);
receivedB2A=oarf_get_frame(card);
sleep(0.01);
% measure SNR
P_rx = 10*log10(mean(abs(receivedB2A(:,1)).^2))

%% send beamformed DL signal
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
85 86 87 88 89 90 91 92 93 94 95 96
P_tx_prec_diag = 10*log10(sum(mean(abs(signalB2A_prec_diag(:,2:4)).^2)))
oarf_send_frame(card,signalB2A_prec_diag,n_bit);
%keyboard
sleep(0.01);
receivedB2A_prec_diag=oarf_get_frame(card);
sleep(0.01);
% measure SNR
P_rx_prec_diag = 10*log10(mean(abs(receivedB2A_prec_diag(:,1)).^2))

%% send beamformed DL signal
P_tx_prec_full = 10*log10(sum(mean(abs(signalB2A_prec_full(:,2:4)).^2)))
oarf_send_frame(card,signalB2A_prec_full,n_bit);
97 98
%keyboard
sleep(0.01);
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
99
receivedB2A_prec_full=oarf_get_frame(card);
100 101
sleep(0.01);
% measure SNR
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
102
P_rx_prec_full = 10*log10(mean(abs(receivedB2A_prec_full(:,1)).^2))
103 104

figure(10)
Florian Kaltenberger's avatar
 
Florian Kaltenberger committed
105 106
bar([P_tx P_tx_prec_diag P_tx_prec_full; P_rx P_rx_prec_diag P_rx_prec_full]);
legend('normal','beamformed F diag', 'beamformed F full')
107 108
ylim([0 60])
drawnow