Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
oai
openairinterface5G
Commits
06f2889b
Commit
06f2889b
authored
May 12, 2017
by
Cédric Roux
Browse files
Merge remote-tracking branch 'origin/UE_TDD_Fix' into develop
parents
9107d283
5904734d
Changes
12
Hide whitespace changes
Inline
Side-by-side
openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
View file @
06f2889b
...
...
@@ -23,6 +23,7 @@
#include
<string.h>
#endif
#include
"defs.h"
#include
"SCHED/defs.h"
#include
"PHY/defs.h"
#include
"filt96_32.h"
#include
"T.h"
...
...
@@ -637,105 +638,129 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
32767
-
ue
->
ch_est_alpha
,
dl_ch
-
(
ue
->
frame_parms
.
ofdm_symbol_size
<<
1
),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
else
{
// high_speed_flag == 1
if
(
symbol
==
0
)
{
// printf("Interpolating %d->0\n",4-ue->frame_parms.Ncp);
// dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][(4-ue->frame_parms.Ncp)*(ue->frame_parms.ofdm_symbol_size)];
if
(
(
symbol
==
0
)
)
{
// printf("Interpolating %d->0\n",4-ue->frame_parms.Ncp);
// dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][(4-ue->frame_parms.Ncp)*(ue->frame_parms.ofdm_symbol_size)];
if
(((
Ns
>>
1
)
!=
0
)
||
(
((
Ns
>>
1
)
==
0
)
&&
interpolateS11S12
))
{
//LOG_D(PHY,"Interpolate s11-->s0 to get s12 and s13 Ns %d \n", Ns);
dl_ch_prev
=
(
int16_t
*
)
&
dl_ch_estimates_previous
[(
p
<<
1
)
+
aarx
][
pilot3
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)];
//LOG_I(PHY,"Interpolate s11-->s0 to get s12 and s13 Ns %d \n", Ns);
dl_ch_prev
=
(
int16_t
*
)
&
dl_ch_estimates_previous
[(
p
<<
1
)
+
aarx
][
pilot3
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)];
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
10923
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
10923
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
21845
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
interpolateS11S12
=
1
;
}
// this is 1/3,2/3 combination for pilots spaced by 3 symbols
else
if
(
symbol
==
pilot1
)
{
dl_ch_prev
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
0
];
//LOG_I(PHY,"Interpolate s0-->s4 to get s1 s2 and s3 Ns %d \n", Ns);
if
(
ue
->
frame_parms
.
Ncp
==
0
)
{
// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
uint8_t
previous_subframe
;
if
(
Ns
>>
1
==
0
)
previous_subframe
=
9
;
else
previous_subframe
=
((
Ns
>>
1
)
-
1
)
%
9
;
if
((
subframe_select
(
&
ue
->
frame_parms
,
previous_subframe
)
==
SF_UL
))
{
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
328
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
32440
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
328
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
32440
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
8192
,
dl_ch_prev
+
(
3
*
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
32440
,
dl_ch_prev
+
(
3
*
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
else
{
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
24576
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
8192
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
16384
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
16384
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
8192
,
dl_ch_prev
+
(
3
*
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
24576
,
dl_ch_prev
+
(
3
*
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
}
else
{
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
328
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
10923
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
// pilot spacing 3 symbols (1/3,2/3 combination)
}
else
if
(
symbol
==
pilot2
)
{
dl_ch_prev
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
pilot1
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)];
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
10923
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
10923
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
21845
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
interpolateS11S12
=
1
;
}
// this is 1/3,2/3 combination for pilots spaced by 3 symbols
else
if
(
symbol
==
pilot1
)
{
dl_ch_prev
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
0
];
if
(
ue
->
frame_parms
.
Ncp
==
0
)
{
// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
24576
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
8192
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
16384
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
16384
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
8192
,
dl_ch_prev
+
(
3
*
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
24576
,
dl_ch_prev
+
(
3
*
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
else
{
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
10923
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
10923
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
// pilot spacing 3 symbols (1/3,2/3 combination)
}
else
if
(
symbol
==
pilot2
)
{
dl_ch_prev
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
pilot1
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)];
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
10923
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
10923
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
21845
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
else
{
// symbol == pilot3
// printf("Interpolating 0->%d\n",4-ue->frame_parms.Ncp);
dl_ch_prev
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
pilot2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)];
if
(
ue
->
frame_parms
.
Ncp
==
0
)
{
// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
24576
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
8192
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
16384
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
16384
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
8192
,
dl_ch_prev
+
(
3
*
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
24576
,
dl_ch_prev
+
(
3
*
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
else
{
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
10923
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
10923
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
// pilot spacing 3 symbols (1/3,2/3 combination)
if
((
ue
->
rx_offset_diff
!=
0
)
&&
((
Ns
>>
1
)
==
9
))
{
//LOG_D(PHY,"Extrapolate s7-->s11 to get s12 and s13 Ns %d\n", Ns);
interpolateS11S12
=
0
;
//LOG_E(PHY,"Interpolate s7--s11 s12 s13 pilot 3 Ns %d l %d symbol %d \n", Ns, l, symbol);
int16_t
*
dlChEst_ofdm11
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
pilot3
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)];
int16_t
*
dlChEst_ofdm7
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
pilot2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)];
// interpolate ofdm s12: 5/4*ofdms11 + -1/4*ofdms7 5/4 q1.15 40960 -1/4 q1.15 8192
int16_t
*
dlChEst_ofdm12
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
12
*
ue
->
frame_parms
.
ofdm_symbol_size
];
for
(
int
i
=
0
;
i
<
(
2
*
ue
->
frame_parms
.
ofdm_symbol_size
);
i
++
)
{
int64_t
tmp_mult
=
0
;
tmp_mult
=
((
int64_t
)
dlChEst_ofdm11
[
i
]
*
40960
-
(
int64_t
)
dlChEst_ofdm7
[
i
]
*
8192
);
}
else
{
// symbol == pilot3
// printf("Interpolating 0->%d\n",4-ue->frame_parms.Ncp);
dl_ch_prev
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
pilot2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)];
tmp_mult
=
tmp_mult
>>
15
;
dlChEst_ofdm12
[
i
]
=
tmp_mult
;
}
if
(
ue
->
frame_parms
.
Ncp
==
0
)
{
// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
24576
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
)
;
multadd_complex_vector_real_scalar
(
dl_ch
,
8192
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
// interpolate ofdm s13: 3/2*ofdms11 + -1/2*ofdms7 3/2 q1.15 49152 1/2 q1.15 16384
int16_t
*
dlChEst_ofdm13
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
13
*
ue
->
frame_parms
.
ofdm_symbol_size
];
for
(
int
i
=
0
;
i
<
(
2
*
ue
->
frame_parms
.
ofdm_symbol_size
);
i
++
)
{
int64_t
tmp_mult
=
0
;
tmp_mult
=
((
int64_t
)
dlChEst_ofdm11
[
i
]
*
49152
-
(
int64_t
)
dlChEst_ofdm7
[
i
]
*
16384
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
16384
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
16384
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
8192
,
dl_ch_prev
+
(
3
*
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
24576
,
dl_ch_prev
+
(
3
*
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
else
{
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
10923
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch_prev
,
21845
,
dl_ch_prev
+
(
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
),
1
,
ue
->
frame_parms
.
ofdm_symbol_size
);
multadd_complex_vector_real_scalar
(
dl_ch
,
10923
,
dl_ch_prev
+
(
2
*
((
ue
->
frame_parms
.
ofdm_symbol_size
)
<<
1
)),
0
,
ue
->
frame_parms
.
ofdm_symbol_size
);
}
// pilot spacing 3 symbols (1/3,2/3 combination)
tmp_mult
=
tmp_mult
>>
15
;
dlChEst_ofdm13
[
i
]
=
tmp_mult
;
if
((
ue
->
rx_offset_diff
!=
0
)
&&
((
Ns
>>
1
)
==
9
))
{
//LOG_I(PHY,"Extrapolate s7-->s11 to get s12 and s13 Ns %d\n", Ns);
interpolateS11S12
=
0
;
//LOG_E(PHY,"Interpolate s7--s11 s12 s13 pilot 3 Ns %d l %d symbol %d \n", Ns, l, symbol);
int16_t
*
dlChEst_ofdm11
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
pilot3
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)];
int16_t
*
dlChEst_ofdm7
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
pilot2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)];
// interpolate ofdm s12: 5/4*ofdms11 + -1/4*ofdms7 5/4 q1.15 40960 -1/4 q1.15 8192
int16_t
*
dlChEst_ofdm12
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
12
*
ue
->
frame_parms
.
ofdm_symbol_size
];
for
(
int
i
=
0
;
i
<
(
2
*
ue
->
frame_parms
.
ofdm_symbol_size
);
i
++
)
{
int64_t
tmp_mult
=
0
;
tmp_mult
=
((
int64_t
)
dlChEst_ofdm11
[
i
]
*
40960
-
(
int64_t
)
dlChEst_ofdm7
[
i
]
*
8192
);
tmp_mult
=
tmp_mult
>>
15
;
dlChEst_ofdm12
[
i
]
=
tmp_mult
;
}
// interpolate ofdm s13: 3/2*ofdms11 + -1/2*ofdms7 3/2 q1.15 49152 1/2 q1.15 16384
int16_t
*
dlChEst_ofdm13
=
(
int16_t
*
)
&
dl_ch_estimates
[(
p
<<
1
)
+
aarx
][
13
*
ue
->
frame_parms
.
ofdm_symbol_size
];
for
(
int
i
=
0
;
i
<
(
2
*
ue
->
frame_parms
.
ofdm_symbol_size
);
i
++
)
{
int64_t
tmp_mult
=
0
;
tmp_mult
=
((
int64_t
)
dlChEst_ofdm11
[
i
]
*
49152
-
(
int64_t
)
dlChEst_ofdm7
[
i
]
*
16384
);
tmp_mult
=
tmp_mult
>>
15
;
dlChEst_ofdm13
[
i
]
=
tmp_mult
;
}
}
}
}
}
}
}
}
...
...
openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
View file @
06f2889b
...
...
@@ -171,20 +171,25 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
{
uint8_t
subframe
=
slot
>>
1
;
int
aarx
,
rb
,
n
;
int
aarx
,
rb
;
uint8_t
pss_symb
;
uint8_t
sss_symb
;
int32_t
**
rxdataF
;
int16_t
*
rxF
,
*
rxF_pss
,
*
rxF_sss
;
uint16_t
Nid_cell
=
ue
->
frame_parms
.
Nid_cell
;
uint8_t
eNB_offset
,
nu
,
l
,
nushift
,
k
;
uint16_t
off
;
uint8_t
isPss
;
// indicate if this is a slot for extracting PSS
uint8_t
isSss
;
// indicate if this is a slot for extracting SSS
int32_t
pss_ext
[
4
][
72
];
// contain the extracted 6*12 REs for mapping the PSS
int32_t
sss_ext
[
4
][
72
];
// contain the extracted 6*12 REs for mapping the SSS
int32_t
(
*
xss_ext
)[
72
];
// point to either pss_ext or sss_ext for common calculation
int16_t
*
re
,
*
im
;
// real and imag part of each 32-bit xss_ext[][] value
//
uint8_t isPss; // indicate if this is a slot for extracting PSS
//
uint8_t isSss; // indicate if this is a slot for extracting SSS
//
int32_t pss_ext[4][72]; // contain the extracted 6*12 REs for mapping the PSS
//
int32_t sss_ext[4][72]; // contain the extracted 6*12 REs for mapping the SSS
//
int32_t (*xss_ext)[72]; // point to either pss_ext or sss_ext for common calculation
//
int16_t *re,*im; // real and imag part of each 32-bit xss_ext[][] value
//LOG_I(PHY,"UE RRC MEAS Start Subframe %d Frame Type %d slot %d \n",subframe,ue->frame_parms.frame_type,slot);
for
(
eNB_offset
=
0
;
eNB_offset
<
1
+
ue
->
measurements
.
n_adj_cells
;
eNB_offset
++
)
{
if
(
eNB_offset
==
0
)
{
...
...
@@ -192,27 +197,28 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
//ue->measurements.n0_power_tot = 0;
if
(
abstraction_flag
==
0
)
{
if
((
ue
->
frame_parms
.
frame_type
==
FDD
)
&&
((
subframe
==
0
)
||
(
subframe
==
5
)))
{
// FDD PSS/SSS, compute noise in DTX REs
if
(
((
ue
->
frame_parms
.
frame_type
==
FDD
)
&&
((
subframe
==
0
)
||
(
subframe
==
5
)))
||
((
ue
->
frame_parms
.
frame_type
==
TDD
)
&&
((
subframe
==
1
)
||
(
subframe
==
6
)))
)
{
// FDD PSS/SSS, compute noise in DTX REs
if
(
ue
->
frame_parms
.
Ncp
==
NORMAL
)
{
for
(
aarx
=
0
;
aarx
<
ue
->
frame_parms
.
nb_antennas_rx
;
aarx
++
)
{
if
(
ue
->
frame_parms
.
frame_type
==
FDD
)
{
rxF_sss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
subframe
&
0x1
].
rxdataF
[
aarx
][(
5
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
rxF_pss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
subframe
&
0x1
].
rxdataF
[
aarx
][(
6
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
}
else
{
rxF_sss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[(
subframe
+
1
)
&
0x1
].
rxdataF
[
aarx
][(
13
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
rxF_pss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
subframe
&
0x1
].
rxdataF
[
aarx
][(
2
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
}
//-ve spectrum from SSS
// printf("slot %d: SSS DTX: %d,%d, non-DTX %d,%d\n",slot,rxF_pss[-72],rxF_pss[-71],rxF_pss[-36],rxF_pss[-35]);
// ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
// printf("sssn36 %d\n",ue->measurements.n0_power[aarx]);
ue
->
measurements
.
n0_power
[
aarx
]
=
(((
int32_t
)
rxF_pss
[
-
70
]
*
rxF_pss
[
-
70
])
+
((
int32_t
)
rxF_pss
[
-
69
]
*
rxF_pss
[
-
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
68
]
*
rxF_pss
[
-
68
])
+
((
int32_t
)
rxF_pss
[
-
67
]
*
rxF_pss
[
-
67
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
66
]
*
rxF_pss
[
-
66
])
+
((
int32_t
)
rxF_pss
[
-
65
]
*
rxF_pss
[
-
65
]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
// printf("sssm32 %d\n",ue->measurements.n0_power[aarx]);
//+ve spectrum from SSS
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
2
+
70
]
*
rxF_sss
[
2
+
70
])
+
((
int32_t
)
rxF_sss
[
2
+
69
]
*
rxF_sss
[
2
+
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
2
+
70
]
*
rxF_sss
[
2
+
70
])
+
((
int32_t
)
rxF_sss
[
2
+
69
]
*
rxF_sss
[
2
+
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
2
+
68
]
*
rxF_sss
[
2
+
68
])
+
((
int32_t
)
rxF_sss
[
2
+
67
]
*
rxF_sss
[
2
+
67
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
2
+
66
]
*
rxF_sss
[
2
+
66
])
+
((
int32_t
)
rxF_sss
[
2
+
65
]
*
rxF_sss
[
2
+
65
]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
...
...
@@ -223,18 +229,34 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
2
+
66
]
*
rxF_pss
[
2
+
66
])
+
((
int32_t
)
rxF_pss
[
2
+
65
]
*
rxF_pss
[
2
+
65
]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63]));
// printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS
rxF_pss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
subframe
&
0x1
].
rxdataF
[
aarx
][(
7
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
if
(
ue
->
frame_parms
.
frame_type
==
FDD
)
{
rxF_sss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
subframe
&
0x1
].
rxdataF
[
aarx
][(
6
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
rxF_pss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
subframe
&
0x1
].
rxdataF
[
aarx
][(
7
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
}
else
{
rxF_sss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[(
subframe
+
1
)
&
0x1
].
rxdataF
[
aarx
][(
14
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
rxF_pss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
subframe
&
0x1
].
rxdataF
[
aarx
][(
3
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
}
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
// printf("pssm36 %d\n",ue->measurements.n0_power[aarx]);
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
70
]
*
rxF_pss
[
-
70
])
+
((
int32_t
)
rxF_pss
[
-
69
]
*
rxF_pss
[
-
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
68
]
*
rxF_pss
[
-
68
])
+
((
int32_t
)
rxF_pss
[
-
67
]
*
rxF_pss
[
-
67
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
66
]
*
rxF_pss
[
-
66
])
+
((
int32_t
)
rxF_pss
[
-
65
]
*
rxF_pss
[
-
65
]));
ue
->
measurements
.
n0_power
[
aarx
]
=
(((
int32_t
)
rxF_sss
[
-
70
]
*
rxF_sss
[
-
70
])
+
((
int32_t
)
rxF_sss
[
-
69
]
*
rxF_sss
[
-
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
-
68
]
*
rxF_sss
[
-
68
])
+
((
int32_t
)
rxF_sss
[
-
67
]
*
rxF_sss
[
-
67
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
-
66
]
*
rxF_sss
[
-
66
])
+
((
int32_t
)
rxF_sss
[
-
65
]
*
rxF_sss
[
-
65
]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
// printf("pssm32 %d\n",ue->measurements.n0_power[aarx]);
ue
->
measurements
.
n0_power_dB
[
aarx
]
=
(
unsigned
short
)
dB_fixed
(
ue
->
measurements
.
n0_power
[
aarx
]
/
12
);
ue
->
measurements
.
n0_power_tot
/*+=*/
=
ue
->
measurements
.
n0_power
[
aarx
];
}
//LOG_I(PHY,"Subframe %d RRC UE MEAS Noise Level %d \n", subframe, ue->measurements.n0_power_tot);
ue
->
measurements
.
n0_power_tot_dB
=
(
unsigned
short
)
dB_fixed
(
ue
->
measurements
.
n0_power_tot
/
(
12
*
aarx
));
ue
->
measurements
.
n0_power_tot_dBm
=
ue
->
measurements
.
n0_power_tot_dB
-
ue
->
rx_total_gain_dB
-
dB_fixed
(
ue
->
frame_parms
.
ofdm_symbol_size
);
}
else
{
...
...
@@ -242,87 +264,61 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
}
}
else
if
((
ue
->
frame_parms
.
frame_type
==
TDD
)
&&
((
slot
==
2
)
||
(
slot
==
12
)
||
(
slot
==
1
)
||
(
s
lot
==
11
)))
{
// TDD PSS/SSS, compute noise in DTX REs // 2016-09-29 wilson fix incorrect noise power calculation
((
subframe
==
1
)
||
(
s
ubframe
==
6
)))
{
// TDD PSS/SSS, compute noise in DTX REs // 2016-09-29 wilson fix incorrect noise power calculation
#if 1 // fixing REs extraction in noise power calculation
// check if this slot has a PSS or SSS sequence
if
((
slot
==
2
)
||
(
slot
==
12
))
{
isPss
=
1
;
}
else
{
isPss
=
0
;
}
if
((
slot
==
1
)
||
(
slot
==
11
))
{
isSss
=
1
;
}
else
{
isSss
=
0
;
}
if
(
isPss
)
{
pss_only_extract
(
ue
,
pss_ext
);
xss_ext
=
pss_ext
;
}
if
(
isSss
)
{
sss_only_extract
(
ue
,
sss_ext
);
xss_ext
=
sss_ext
;
}
// calculate noise power
int
num_tot
=
0
;
// number of REs totally used in calculating noise power
for
(
aarx
=
0
;
aarx
<
ue
->
frame_parms
.
nb_antennas_rx
;
aarx
++
)
{
int
num_per_rx
=
0
;
// number of REs used in caluclaing noise power for this RX antenna
ue
->
measurements
.
n0_power
[
aarx
]
=
0
;
for
(
n
=
2
;
n
<
70
;
n
++
)
{
// skip the 2 REs next to PDSCH, i.e. n={0,1,70,71}
if
(
n
==
5
)
{
n
=
67
;}
re
=
(
int16_t
*
)(
&
(
xss_ext
[
aarx
][
n
]));
im
=
re
+
1
;
ue
->
measurements
.
n0_power
[
aarx
]
+=
(
*
re
)
*
(
*
re
)
+
(
*
im
)
*
(
*
im
);
num_per_rx
++
;
num_tot
++
;
}
ue
->
measurements
.
n0_power_dB
[
aarx
]
=
(
unsigned
short
)
dB_fixed
(
ue
->
measurements
.
n0_power
[
aarx
]
/
(
num_per_rx
));
ue
->
measurements
.
n0_power_tot
/*+=*/
=
ue
->
measurements
.
n0_power
[
aarx
];
}
ue
->
measurements
.
n0_power_tot_dB
=
(
unsigned
short
)
dB_fixed
(
ue
->
measurements
.
n0_power_tot
/
(
num_tot
));
ue
->
measurements
.
n0_power_tot_dBm
=
ue
->
measurements
.
n0_power_tot_dB
-
ue
->
rx_total_gain_dB
-
dB_fixed
(
ue
->
frame_parms
.
ofdm_symbol_size
);
#else
pss_symb
=
2
;
sss_symb
=
ue
->
frame_parms
.
symbols_per_tti
-
1
;
if
(
ue
->
frame_parms
.
Ncp
==
NORMAL
)
{
for
(
aarx
=
0
;
aarx
<
ue
->
frame_parms
.
nb_antennas_rx
;
aarx
++
)
{
rxF_sss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
subframe
&
0x1
].
rxdataF
[
aarx
][(
6
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
// note this is a dummy pointer, the pss is not really there!
// in FDD the pss is in the symbol after the sss, but not in TDD
rxF_pss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
subframe
&
0x1
].
rxdataF
[
aarx
][(
7
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
rxdataF
=
ue
->
common_vars
.
common_vars_rx_data_per_thread
[(
subframe
&
0x1
)].
rxdataF
;
rxF_pss
=
(
int16_t
*
)
&
rxdataF
[
aarx
][((
pss_symb
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)))];
rxdataF
=
ue
->
common_vars
.
common_vars_rx_data_per_thread
[(
subframe
+
1
)
&
0x1
].
rxdataF
;
rxF_sss
=
(
int16_t
*
)
&
rxdataF
[
aarx
][((
sss_symb
*
(
ue
->
frame_parms
.
ofdm_symbol_size
)))];
//-ve spectrum from SSS
// printf("slot %d: SSS DTX: %d,%d, non-DTX %d,%d\n",slot,rxF_pss[-72],rxF_pss[-71],rxF_pss[-36],rxF_pss[-35]);
// ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
// printf("sssn36 %d\n",ue->measurements.n0_power[aarx]);
ue
->
measurements
.
n0_power
[
aarx
]
=
(((
int32_t
)
rxF_pss
[
-
70
]
*
rxF_pss
[
-
70
])
+
((
int32_t
)
rxF_pss
[
-
69
]
*
rxF_pss
[
-
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
68
]
*
rxF_pss
[
-
68
])
+
((
int32_t
)
rxF_pss
[
-
67
]
*
rxF_pss
[
-
67
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
66
]
*
rxF_pss
[
-
66
])
+
((
int32_t
)
rxF_pss
[
-
65
]
*
rxF_pss
[
-
65
]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
// printf("sssm32 %d\n",ue->measurements.n0_power[aarx]);
//+ve spectrum from SSS
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
2
+
70
]
*
rxF_sss
[
2
+
70
])
+
((
int32_t
)
rxF_sss
[
2
+
69
]
*
rxF_sss
[
2
+
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
2
+
68
]
*
rxF_sss
[
2
+
68
])
+
((
int32_t
)
rxF_sss
[
2
+
67
]
*
rxF_sss
[
2
+
67
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
2
+
66
]
*
rxF_sss
[
2
+
66
])
+
((
int32_t
)
rxF_sss
[
2
+
65
]
*
rxF_sss
[
2
+
65
]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
// printf("sssp32 %d\n",ue->measurements.n0_power[aarx]);
//+ve spectrum from PSS
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
2
+
70
]
*
rxF_pss
[
2
+
70
])
+
((
int32_t
)
rxF_pss
[
2
+
69
]
*
rxF_pss
[
2
+
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
2
+
68
]
*
rxF_pss
[
2
+
68
])
+
((
int32_t
)
rxF_pss
[
2
+
67
]
*
rxF_pss
[
2
+
67
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
2
+
66
]
*
rxF_pss
[
2
+
66
])
+
((
int32_t
)
rxF_pss
[
2
+
65
]
*
rxF_pss
[
2
+
65
]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63]));
// printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS
rxF_pss
=
(
int16_t
*
)
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
subframe
&
0x1
].
rxdataF
[
aarx
][(
7
*
ue
->
frame_parms
.
ofdm_symbol_size
)];
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
// printf("pssm36 %d\n",ue->measurements.n0_power[aarx]);
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
70
]
*
rxF_pss
[
-
70
])
+
((
int32_t
)
rxF_pss
[
-
69
]
*
rxF_pss
[
-
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
68
]
*
rxF_pss
[
-
68
])
+
((
int32_t
)
rxF_pss
[
-
67
]
*
rxF_pss
[
-
67
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
66
]
*
rxF_pss
[
-
66
])
+
((
int32_t
)
rxF_pss
[
-
65
]
*
rxF_pss
[
-
65
]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
// printf("pssm32 %d\n",ue->measurements.n0_power[aarx]);
ue
->
measurements
.
n0_power_dB
[
aarx
]
=
(
unsigned
short
)
dB_fixed
(
ue
->
measurements
.
n0_power
[
aarx
]
/
12
);
ue
->
measurements
.
n0_power_tot
/*+=*/
=
ue
->
measurements
.
n0_power
[
aarx
];
}
//-ve spectrum from SSS
// ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
ue
->
measurements
.
n0_power
[
aarx
]
=
(((
int32_t
)
rxF_pss
[
-
70
]
*
rxF_pss
[
-
70
])
+
((
int32_t
)
rxF_pss
[
-
69
]
*
rxF_pss
[
-
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
68
]
*
rxF_pss
[
-
68
])
+
((
int32_t
)
rxF_pss
[
-
67
]
*
rxF_pss
[
-
67
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_pss
[
-
66
]
*
rxF_pss
[
-
66
])
+
((
int32_t
)
rxF_pss
[
-
65
]
*
rxF_pss
[
-
65
]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
//+ve spectrum from SSS
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+72]*rxF_sss[2+72])+((int32_t)rxF_sss[2+71]*rxF_sss[2+71]));
ue
->
measurements
.
n0_power
[
aarx
]
=
(((
int32_t
)
rxF_sss
[
2
+
70
]
*
rxF_sss
[
2
+
70
])
+
((
int32_t
)
rxF_sss
[
2
+
69
]
*
rxF_sss
[
2
+
69
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
2
+
68
]
*
rxF_sss
[
2
+
68
])
+
((
int32_t
)
rxF_sss
[
2
+
67
]
*
rxF_sss
[
2
+
67
]));
ue
->
measurements
.
n0_power
[
aarx
]
+=
(((
int32_t
)
rxF_sss
[
2
+
66
]
*
rxF_sss
[
2
+
66
])
+
((
int32_t
)
rxF_sss
[
2
+
65
]
*
rxF_sss
[
2
+
65
]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
ue
->
measurements
.
n0_power_tot_dB
=
(
unsigned
short
)
dB_fixed
(
ue
->
measurements
.
n0_power_tot
/
(
12
*
aarx
));
ue
->
measurements
.
n0_power_tot_dBm
=
ue
->
measurements
.
n0_power_tot_dB
-
ue
->
rx_total_gain_dB
-
dB_fixed
(
ue
->
frame_parms
.
ofdm_symbol_size
);
ue
->
measurements
.
n0_power_dB
[
aarx
]
=
(
unsigned
short
)
dB_fixed
(
ue
->
measurements
.
n0_power
[
aarx
]
/
(
6
));
ue
->
measurements
.
n0_power_tot
+=
ue
->
measurements
.
n0_power
[
aarx
];
}
ue
->
measurements
.
n0_power_tot_dB
=
(
unsigned
short
)
dB_fixed
(
ue
->
measurements
.
n0_power_tot
/
(
6
*
aarx
));
ue
->
measurements
.
n0_power_tot_dBm
=
ue
->
measurements
.
n0_power_tot_dB
-
ue
->
rx_total_gain_dB
-
dB_fixed
(
ue
->
frame_parms
.
ofdm_symbol_size
);
//LOG_I(PHY,"Subframe %d RRC UE MEAS Noise Level %d \n", subframe, ue->measurements.n0_power_tot);
}
#endif
}
}
}
...
...
@@ -550,6 +546,8 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
(((
k1
*
((
long
long
int
)(
ue
->
measurements
.
rx_power_avg
[
eNB_id
])))
+
(
k2
*
((
long
long
int
)(
ue
->
measurements
.
rx_power_tot
[
eNB_id
]))))
>>
10
);
//LOG_I(PHY,"Noise Power Computation: k1 %d k2 %d n0 avg %d n0 tot %d\n", k1, k2, ue->measurements.n0_power_avg,
// ue->measurements.n0_power_tot);
ue
->
measurements
.
n0_power_avg
=
(
int
)
(((
k1
*
((
long
long
int
)
(
ue
->
measurements
.
n0_power_avg
)))
+
(
k2
*
((
long
long
int
)
(
ue
->
measurements
.
n0_power_tot
))))
>>
10
);
...
...
@@ -567,8 +565,9 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
ue
->
measurements
.
wideband_cqi_avg
[
eNB_id
]
=
dB_fixed2
(
ue
->
measurements
.
rx_power_avg
[
eNB_id
],
ue
->
measurements
.
n0_power_avg
);
ue
->
measurements
.
rx_rssi_dBm
[
eNB_id
]
=
ue
->
measurements
.
rx_power_avg_dB
[
eNB_id
]
-
ue
->
rx_total_gain_dB
;
#ifdef DEBUG_MEAS_UE
LOG_
D
(
PHY
,
"[eNB %d] RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d
\n
"
,
LOG_
I
(
PHY
,
"[eNB %d]
Subframe %d,
RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d
\n
"
,
eNB_id
,
subframe
,
ue
->
measurements
.
rx_rssi_dBm
[
eNB_id
],
ue
->
measurements
.
rx_power_avg_dB
[
eNB_id
],
ue
->
measurements
.
wideband_cqi_avg
[
eNB_id
],
...
...
openair1/PHY/LTE_TRANSPORT/dci_tools.c
View file @
06f2889b
...
...
@@ -8013,13 +8013,20 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
ulsch
->
bundling
=
1
-
AckNackFBMode
;
if
(
frame_parms
->
frame_type
==
FDD
)
{
int
dl_subframe
=
(
subframe
<
4
)
?
(
subframe
+
6
)
:
(
subframe
-
4
);
//int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4);
int
dl_subframe
=
subframe
;
if
(
ue
->
dlsch
[
dl_subframe
&
0x1
][
eNB_id
][
0
]
->
harq_ack
[
dl_subframe
].
send_harq_status
>
0
)
{
// we have downlink transmission
ulsch
->
harq_processes
[
harq_pid
]
->
O_ACK
=
1
;
}
else
{
ulsch
->
harq_processes
[
harq_pid
]
->
O_ACK
=
0
;
}
/*LOG_I(PHY,"DCI 0 Processing: dl_subframe %d send_harq_status Odd %d send_harq_status Even %d harq_pid %d O_ACK %d\n", dl_subframe,
ue->dlsch[0][eNB_id][0]->harq_ack[dl_subframe].send_harq_status,
ue->dlsch[1][eNB_id][0]->harq_ack[dl_subframe].send_harq_status,
harq_pid,
ulsch->harq_processes[harq_pid]->O_ACK);*/
}
else
{
if
(
ulsch
->
bundling
)
ulsch
->
harq_processes
[
harq_pid
]
->
O_ACK
=
(
dai
==
3
)
?
0
:
1
;
...
...
@@ -8031,10 +8038,16 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
dlsch
[
0
]
->
harq_ack
[
subframe
].
vDAI_UL
=
dai
+
1
;
LOG_D
(
PHY
,
"[PUSCH %d] Format0 DCI %s, CQI_req=%d, cshift=%d, TPC=%d, DAI=%d, vDAI_UL[sf#%d]=%d, NDI=%d, MCS=%d, RBalloc=%d, first_rb=%d, harq_pid=%d, nb_rb=%d, subframe_scheduling_flag=%d
\n
"
,
/*LOG_I(PHY, "[PUSCH %d] Format0 DCI %s, CQI_req=%d, cshift=%d, TPC=%d, DAI=%d, vDAI_UL[sf#%d]=%d, NDI=%d, MCS=%d, RBalloc=%d, first_rb=%d, harq_pid=%d, nb_rb=%d, subframe_scheduling_flag=%d"
" ulsch->bundling %d, O_ACK %d \n",
harq_pid,
(frame_parms->frame_type == TDD? "TDD" : "FDD"),
cqi_req
,
cshift
,
TPC
,
dai
,
subframe
,
dlsch
[
0
]
->
harq_ack
[
subframe
].
vDAI_UL
,
ndi
,
mcs
,
rballoc
,
ulsch
->
harq_processes
[
harq_pid
]
->
first_rb
,
harq_pid
,
ulsch
->
harq_processes
[
harq_pid
]
->
nb_rb
,
ulsch
->
harq_processes
[
harq_pid
]
->
subframe_scheduling_flag
);
cqi_req, cshift, TPC, dai, subframe, dlsch[0]->harq_ack[subframe].vDAI_UL, ndi, mcs, rballoc,
ulsch->harq_processes[harq_pid]->first_rb, harq_pid, ulsch->harq_processes[harq_pid]->nb_rb,
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,
ulsch->bundling,
ulsch->harq_processes[harq_pid]->O_ACK);*/
ulsch
->
beta_offset_cqi_times8
=
beta_cqi
[
ue
->
pusch_config_dedicated
[
eNB_id
].
betaOffset_CQI_Index
];
//18;
ulsch
->
beta_offset_ri_times8
=
beta_ri
[
ue
->
pusch_config_dedicated
[
eNB_id
].
betaOffset_RI_Index
];
//10;
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
View file @
06f2889b
...
...
@@ -461,11 +461,11 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
//#ifndef __AVX2__
#if 1
if
(
err_flag
==
0
)
{
LOG_
D
(
PHY
,
"turbo algo Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d
\n
"
,
Kr
,
r
,
harq_process
->
C
,
harq_process
->
nb_rb
,
A
,
harq_process
->
TBS
,