Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenXG
OpenXG UE
Commits
596f4fa4
Commit
596f4fa4
authored
Nov 12, 2013
by
Florian Kaltenberger
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
git-svn-id:
http://svn.eurecom.fr/openair4G/trunk@4368
818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent
b77ad65d
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
213 additions
and
194 deletions
+213
-194
targets/PROJECTS/TDDREC/runmeas_full_duplex.m
targets/PROJECTS/TDDREC/runmeas_full_duplex.m
+213
-194
No files found.
targets/PROJECTS/TDDREC/runmeas_full_duplex.m
View file @
596f4fa4
#
% Author: Mirsad Cirkic, Florian Kaltenberger
#
% Organisation: Eurecom (and Linkoping University)
#
% E-mail: mirsad.cirkic@liu.se
% Author: Mirsad Cirkic, Florian Kaltenberger
% Organisation: Eurecom (and Linkoping University)
% E-mail: mirsad.cirkic@liu.se
if
(
paramsinitialized
&&
~
LSBSWITCH_FLAG
)
disp
([
"\n\n------------\nThis 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 and the "
...
"corresponding timestamps.\n------------"
])
disp
([
'\n\n------------\nThis 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 and the '
...
'corresponding timestamps.\n------------'
])
N
=
76800
;
M
=
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
if
(
Nanta
~=
1
)
error
(
'Node A can only have one antenna active\n'
);
end
Niter
=
1
;
if
(
Niter
!
=
1
)
error
(
"We should only use one get_frame at each run.\n"
);
endif
if
(
Niter
~=
1
)
error
(
'We should only use one get_frame at each run.\n'
);
end
Nmeas
=
10
;
#
%% ------- Prepare the signals for A2B ---------- %%
%% ------- Prepare the signals for A2B ---------- %%
signalA2B
=
zeros
(
N
,
4
);
signalB2A
=
zeros
(
N
,
4
);
ia
=
1
;
ib
=
1
;
...
...
@@ -33,30 +33,30 @@ if(paramsinitialized && ~LSBSWITCH_FLAG)
[
Da2b_T
,
tmps
]
=
genrandpskseq
(
N
,
M
,
amp
);
signalA2B
(:,
i
)
=
tmps
*
2
;
%make sure LSB is 0 (switch=tx)
signalB2A
(:,
i
)
=
repmat
(
1
+
1
j
,
76800
,
1
);
%make sure LSB is 1 (switch=rx)
if
(
length
(
indA
)
>
ia
)
ia
=
ia
+
1
;
endif
endif
if
(
length
(
indA
)
>
ia
)
ia
=
ia
+
1
;
end
end
% if(indB(ib)==i)
% % This part could be improved by creating fully orthogonal sequences
% [tmpd, tmps]=genrandpskseq(N,M,amp);
% signalB2A(:,i)=tmps*2;
% signalA2B(:,i)=repmat(1+1j,76800,1);
% Db2a_T=[Db2a_T tmpd];
% if(length(indB)> ib) ib=ib+1; endif
% endif
endfor
% if(length(indB)> ib) ib=ib+1; end
% end
end
#
%%------------Prepare the signals for B2A---------------%%
%%------------Prepare the signals for B2A---------------%%
for
i
=
1
:
4
if
(
indB
(
ib
)
==
i
)
[
tmpd
,
tmps
]
=
genrandpskseq
(
N
,
M
,
amp
);
signalB2A
(:,
i
)
=
tmps
*
2
;
%make sure LSB is 0 (switch=tx)
signalA2B
(:,
i
)
=
repmat
(
1
+
1
j
,
76800
,
1
);
%make sure LSB is 1 (switch=rx)
Db2a_T
=
[
Db2a_T
tmpd
];
if
(
length
(
indB
)
>
ib
)
ib
=
ib
+
1
;
endif
endif
endfor
if
(
length
(
indB
)
>
ib
)
ib
=
ib
+
1
;
end
end
end
if
(
!
chanest_full
)
if
(
~
chanest_full
)
signalB2A
(
1
:
38400
,
3
)
=
0
;
signalB2A
(
38401
:
end
,
2
)
=
0
;
Db2a_T
(
1
:
60
,
302
:
end
)
=
0
;
...
...
@@ -66,8 +66,8 @@ if(paramsinitialized && ~LSBSWITCH_FLAG)
Da2b_R
=
zeros
(
Niter
*
120
,
Nantb
*
301
,
Nmeas
);
Db2a_R
=
zeros
(
Niter
*
120
,
Nanta
*
301
,
Nmeas
);
for
meas
=
1
:
Nmeas
#
%% ------- Node A to B transmission ------- %%
for
meas
=
1
:
Nmeas
%% ------- Node A to B transmission ------- %%
oarf_send_frame
(
card
,
signalA2B
,
n_bit
);
%keyboard
sleep
(
0.01
);
...
...
@@ -75,14 +75,14 @@ for meas=1:Nmeas
%oarf_stop(card); %not good, since it does a reset
sleep
(
0.01
);
#
%%----------Node B to A transmission---------%%
%%----------Node B to A transmission---------%%
oarf_send_frame
(
card
,
signalB2A
,
n_bit
);
%keyboard
sleep
(
0.01
);
receivedB2A
=
oarf_get_frame
(
card
);
%oarf_stop(card); %not good, since it does a reset
#
%% ------- Do the A to B channel estimation ------- %%
%% ------- Do the A to B channel estimation ------- %%
for
i
=
0
:
119
;
ifblock
=
receivedA2B
(
i
*
640
+
[
1
:
640
],
indB
);
ifblock
(
1
:
128
,:)
=
[];
...
...
@@ -90,21 +90,21 @@ for meas=1:Nmeas
fblock
(
1
,:)
=
[];
fblock
(
151
:
360
,:)
=
[];
Da2b_R
((
Niter
-
1
)
*
120
+
i
+
1
,:,
meas
)
=
vec
(
fblock
);
endfor
end
HA2B
=
repmat
(
conj
(
Da2b_T
),
Niter
,
Nantb
)
.*
Da2b_R
(:,:,
meas
);
phasesA2B
=
unwrap
(
angle
(
HA2B
));
if
(
mean
(
var
(
phasesA2B
))
>
0.5
)
disp
(
"The phases of your estimates from A to B are a bit high (larger than 0.5 rad.), something is wrong."
);
endif
disp
(
'The phases of your estimates from A to B are a bit high (larger than 0.5 rad.), something is wrong.'
);
end
chanestsA2B
(:,:,
meas
)
=
reshape
(
diag
(
repmat
(
Da2b_T
,
Niter
,
Nantb
)
'*
Da2b_R
(:,:,
meas
))/
size
(
Da2b_T
,
1
),
301
,
Nantb
);
#
fchanestsA2B
=
zeros
(
512
,
Nantb
);
#
for
i
=
1
:
Nantb
#
fchanestsA2B
(:,
i
)
=
[
0
;
chanestsA2B
([
1
:
150
],
i
,
meas
);
zeros
(
210
,
1
);
chanestsA2B
(
151
:
301
,
i
,
meas
)];
#
endfor
%
fchanestsA2B=zeros(512,Nantb);
%
for i=1:Nantb
%
fchanestsA2B(:,i)=[0; chanestsA2B([1:150],i,meas); zeros(210,1); chanestsA2B(151:301,i,meas)];
%end
fchanestsA2B
(:,:,
meas
)
=
[
zeros
(
1
,
Nantb
);
chanestsA2B
([
1
:
150
],:,
meas
);
zeros
(
210
,
Nantb
);
chanestsA2B
(
151
:
301
,:,
meas
)];
tchanestsA2B
(:,:,
meas
)
=
ifft
(
fchanestsA2B
(:,:,
meas
));
%% ------- Do the B to A channel estimation ------- %%
%% ------- Do the B to A channel estimation ------- %%
for
i
=
0
:
119
;
ifblock
=
receivedB2A
(
i
*
640
+
[
1
:
640
],
indA
);
ifblock
(
1
:
128
,:)
=
[];
...
...
@@ -112,12 +112,12 @@ for meas=1:Nmeas
fblock
(
1
,:)
=
[];
fblock
(
151
:
360
,:)
=
[];
Db2a_R
((
Niter
-
1
)
*
120
+
i
+
1
,:,
meas
)
=
fblock
.'
;
endfor
end
HB2A
=
conj
(
repmat
(
Db2a_T
,
Niter
,
1
))
.*
repmat
(
Db2a_R
(:,:,
meas
),
1
,
Nantb
);
phasesB2A
=
unwrap
(
angle
(
HB2A
));
if
(
mean
(
var
(
phasesB2A
))
>
0.5
)
disp
(
"The phases of your estimates from B to A are a bit high (larger than 0.5 rad.), something is wrong."
);
endif
disp
(
'The phases of your estimates from B to A are a bit high (larger than 0.5 rad.), something is wrong.'
);
end
if
(
chanest_full
)
chanestsB2A
(:,:,
meas
)
=
zeros
(
301
,
Nantb
);
...
...
@@ -126,18 +126,18 @@ for meas=1:Nmeas
data
=
Db2a_T
(:,
ci
+
[
0
:
Nantb
-
1
]
*
301
);
rec
=
Db2a_R
(:,
ci
,
meas
);
chanestsB2A
(
ci
,:,
meas
)
=
(
inv
(
data
'*data)*data'
*
rec
)
.'
;
endfor
end
else
chanestsB2A
(:,:,
meas
)
=
reshape
(
diag
(
repmat
(
Db2a_T
,
Niter
,
1
)
'*
repmat
(
Db2a_R
(:,:,
meas
),
1
,
Nantb
)/(
Niter
*
60
)),
301
,
Nantb
);
end
#
fchanestsB2A
=
zeros
(
512
,
Nantb
);
#
for
i
=
1
:
Nantb
#
fchanestsB2A
(:,
i
)
=
[
0
;
chanestsB2A
([
1
:
150
],
i
);
zeros
(
210
,
1
);
chanestsB2A
(
151
:
301
,
i
)];
#
endfor
%
fchanestsB2A=zeros(512,Nantb);
%
for i=1:Nantb
%
fchanestsB2A(:,i)=[0; chanestsB2A([1:150],i); zeros(210,1); chanestsB2A(151:301,i)];
%end
fchanestsB2A
(:,:,
meas
)
=
[
zeros
(
1
,
Nantb
);
chanestsB2A
([
1
:
150
],:,
meas
);
zeros
(
210
,
Nantb
);
chanestsB2A
(
151
:
301
,:,
meas
)];
tchanestsB2A
(:,:,
meas
)
=
ifft
(
fchanestsB2A
(:,:,
meas
));
end
end
%% -- Some plotting code -- %% (you can uncomment what you see fit)
received
=
receivedB2A
;
...
...
@@ -149,7 +149,7 @@ end
figure
(
1
)
for
i
=
1
:
4
subplot
(
220
+
i
);
plot
(
20
*
log10
(
abs
(
fftshift
(
fft
(
received
(:,
i
))))));
endfor
end
figure
(
2
)
t
=
[
0
:
512
-
1
]/
512
*
1e-2
;
...
...
@@ -179,20 +179,39 @@ end
ylim
([
-
pi
pi
])
drawnow
;
pause
(
0.1
)
endfor
end
phavar
=
var
(
phases
);
plotphavar
=
[];
for
i
=
0
:
Nantb
-
1
plotphavar
=
[
plotphavar
;
phavar
([
1
:
301
]
+
i
*
301
)];
endfor
end
plot
([
1
:
150
362
:
512
],
plotphavar
,
'o'
);
%ylim([0 pi])
xlabel
(
'subcarrier'
)
ylabel
(
'phase variance'
)
end
%% estimate F matrix assuming it is diagonal for sanity checking
Fhatloc
=
zeros
(
Nmeas
,
301
,
Nantb
);
for
t
=
1
:
Nmeas
for
s
=
1
:
301
ya
=
chanestsB2A
(
s
,:,
t
);
yb
=
chanestsA2B
(
s
,:,
t
);
Fhatloc
(
t
,
s
,:)
=
(
yb
.*
conj
(
ya
))
.
/(
ya
.*
conj
(
ya
));
end
end
figure
(
5
)
plot_style
=
{
'rx'
,
'bo'
,
'gs'
};
hold
off
for
n
=
1
:
Nantb
plot
((
squeeze
(
Fhatloc
(:,:,
n
))),
plot_style
{
n
})
hold
on
end
else
if
(
LSBSWITCH_FLAG
)
error
(
"You have to unset the LSB switch flag (LSBSWITCH_FLAG) in initparams.m.\n"
)
else
error
(
"You have to run init.params.m first!"
)
endif
end
if
if
(
LSBSWITCH_FLAG
)
error
(
'You have to unset the LSB switch flag (LSBSWITCH_FLAG) in initparams.m.\n'
)
else
error
(
'You have to run init.params.m first!'
)
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment