Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
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
Michael Black
OpenXG-RAN
Commits
2cced7bd
Commit
2cced7bd
authored
Jun 30, 2022
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/optim-rotate_cpx' into integration_2022_wk26
parents
b7e026fd
df1cffbc
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
141 additions
and
350 deletions
+141
-350
cmake_targets/tools/build_helper
cmake_targets/tools/build_helper
+2
-2
openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
+17
-17
openair1/PHY/MODULATION/nr_modulation.c
openair1/PHY/MODULATION/nr_modulation.c
+13
-13
openair1/PHY/MODULATION/ofdm_mod.c
openair1/PHY/MODULATION/ofdm_mod.c
+22
-22
openair1/PHY/MODULATION/slot_fep_nr.c
openair1/PHY/MODULATION/slot_fep_nr.c
+22
-22
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+11
-12
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+11
-12
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+9
-11
openair1/PHY/TOOLS/cmult_sv.c
openair1/PHY/TOOLS/cmult_sv.c
+25
-222
openair1/PHY/TOOLS/tools_defs.h
openair1/PHY/TOOLS/tools_defs.h
+7
-15
openair1/PHY/defs_nr_common.h
openair1/PHY/defs_nr_common.h
+2
-2
No files found.
cmake_targets/tools/build_helper
View file @
2cced7bd
...
...
@@ -197,8 +197,8 @@ check_warnings() {
#argument:
# $1: log file
check_errors() {
#we look for '
warning
:' in the compilation log file
error_count=`grep
"error:" "$1" | wc -l
`
#we look for '
error
:' in the compilation log file
error_count=`grep
-c "error:" "$1"
`
if [ $error_count -gt 0 ]; then
echo_error "ERROR: $error_count error. See $1"
fi
...
...
openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
View file @
2cced7bd
...
...
@@ -88,7 +88,7 @@ int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
}
uint16_t
N_rb_alloc
=
ulsch
->
harq_processes
[
harq_pid
]
->
nb_rb
;
int32_t
tmp_estimates
[
N_rb_alloc
*
12
]
__attribute__
((
aligned
(
16
)));
int32_t
tmp_estimates
[
N_rb_alloc
*
12
]
__attribute__
((
aligned
(
32
)));
Msc_RS
=
N_rb_alloc
*
12
;
cyclic_shift
=
(
frame_parms
->
pusch_config_common
.
ul_ReferenceSignalsPUSCH
.
cyclicShift
+
ulsch
->
harq_processes
[
harq_pid
]
->
n_DMRS2
+
...
...
@@ -334,14 +334,14 @@ int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
current_phase2
=
cmin
(
abs
(
current_phase2
),
127
);
// msg("sym: %d, current_phase1: %d, ru: %d + j%d, current_phase2: %d, ru: %d + j%d\n",k,current_phase1,ru1[2*current_phase1],ru1[2*current_phase1+1],current_phase2,ru2[2*current_phase2],ru2[2*current_phase2+1]);
// rotate channel estimates by estimated phase
rotate_cpx_vector
((
int
16_t
*
)
ul_ch1
,
&
ru1
[
2
*
current_phase1
],
(
int
16_t
*
)
&
ul_ch_estimates
[
aa
][
frame_parms
->
N_RB_UL
*
12
*
k
],
rotate_cpx_vector
((
c
16_t
*
)
ul_ch1
,
(
c16_t
*
)
&
ru1
[
2
*
current_phase1
],
(
c
16_t
*
)
&
ul_ch_estimates
[
aa
][
frame_parms
->
N_RB_UL
*
12
*
k
],
Msc_RS
,
15
);
rotate_cpx_vector
((
int
16_t
*
)
ul_ch2
,
&
ru2
[
2
*
current_phase2
],
(
int16_t
*
)
&
tmp_estimates
[
0
]
,
rotate_cpx_vector
((
c
16_t
*
)
ul_ch2
,
(
c16_t
*
)
&
ru2
[
2
*
current_phase2
],
(
c16_t
*
)
tmp_estimates
,
Msc_RS
,
15
);
// Combine the two rotated estimates
...
...
@@ -657,14 +657,14 @@ int32_t lte_ul_channel_estimation_RRU(LTE_DL_FRAME_PARMS *frame_parms,
current_phase2
=
cmin
(
abs
(
current_phase2
),
127
);
// msg("sym: %d, current_phase1: %d, ru: %d + j%d, current_phase2: %d, ru: %d + j%d\n",k,current_phase1,ru1[2*current_phase1],ru1[2*current_phase1+1],current_phase2,ru2[2*current_phase2],ru2[2*current_phase2+1]);
// rotate channel estimates by estimated phase
rotate_cpx_vector
((
int
16_t
*
)
ul_ch1
,
&
ru1
[
2
*
current_phase1
],
(
int
16_t
*
)
&
ul_ch_estimates
[
aa
][
frame_parms
->
N_RB_UL
*
12
*
k
],
rotate_cpx_vector
((
c
16_t
*
)
ul_ch1
,
(
c16_t
*
)
&
ru1
[
2
*
current_phase1
],
(
c
16_t
*
)
&
ul_ch_estimates
[
aa
][
frame_parms
->
N_RB_UL
*
12
*
k
],
Msc_RS
,
15
);
rotate_cpx_vector
((
int
16_t
*
)
ul_ch2
,
&
ru2
[
2
*
current_phase2
],
(
int
16_t
*
)
&
tmp_estimates
[
0
],
rotate_cpx_vector
((
c
16_t
*
)
ul_ch2
,
(
c16_t
*
)
&
ru2
[
2
*
current_phase2
],
(
c
16_t
*
)
&
tmp_estimates
[
0
],
Msc_RS
,
15
);
// Combine the two rotated estimates
...
...
openair1/PHY/MODULATION/nr_modulation.c
View file @
2cced7bd
...
...
@@ -618,20 +618,20 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
double
f0
=
f
[
ll
];
double
Ncpm1
=
Ncp0
;
int
16_t
*
symbol_rotation
=
fp
->
symbol_rotation
[
ll
];
c
16_t
*
symbol_rotation
=
fp
->
symbol_rotation
[
ll
];
double
tl
=
0
;
double
poff
=
2
*
M_PI
*
((
Ncp0
*
Tc
))
*
f0
;
double
exp_re
=
cos
(
poff
);
double
exp_im
=
sin
(
-
poff
);
symbol_rotation
[
0
]
=
(
int16_t
)
floor
(
exp_re
*
32767
);
symbol_rotation
[
1
]
=
(
int16_t
)
floor
(
exp_im
*
32767
);
symbol_rotation
[
0
]
.
r
=
(
int16_t
)
floor
(
exp_re
*
32767
);
symbol_rotation
[
0
].
i
=
(
int16_t
)
floor
(
exp_im
*
32767
);
LOG_I
(
PHY
,
"Doing symbol rotation calculation for gNB TX/RX, f0 %f Hz, Nsymb %d
\n
"
,
f0
,
nsymb
);
LOG_I
(
PHY
,
"Symbol rotation %d/%d => (%d,%d)
\n
"
,
0
,
nsymb
,
symbol_rotation
[
0
],
symbol_rotation
[
1
]
);
symbol_rotation
[
0
]
.
r
,
symbol_rotation
[
0
].
i
);
for
(
int
l
=
1
;
l
<
nsymb
;
l
++
)
{
...
...
@@ -646,15 +646,15 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
poff
=
2
*
M_PI
*
(
tl
+
(
Ncp
*
Tc
))
*
f0
;
exp_re
=
cos
(
poff
);
exp_im
=
sin
(
-
poff
);
symbol_rotation
[
l
<<
1
]
=
(
int16_t
)
floor
(
exp_re
*
32767
);
symbol_rotation
[
1
+
(
l
<<
1
)]
=
(
int16_t
)
floor
(
exp_im
*
32767
);
symbol_rotation
[
l
].
r
=
(
int16_t
)
floor
(
exp_re
*
32767
);
symbol_rotation
[
l
].
i
=
(
int16_t
)
floor
(
exp_im
*
32767
);
LOG_I
(
PHY
,
"Symbol rotation %d/%d => tl %f (%d,%d) (%f)
\n
"
,
l
,
nsymb
,
tl
,
symbol_rotation
[
l
<<
1
]
,
symbol_rotation
[
1
+
(
l
<<
1
)]
,
symbol_rotation
[
l
].
r
,
symbol_rotation
[
l
].
i
,
(
poff
/
2
/
M_PI
)
-
floor
(
poff
/
2
/
M_PI
));
Ncpm1
=
Ncp
;
...
...
@@ -670,13 +670,13 @@ void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp)
double
poff
=
-
i
*
2
.
0
*
M_PI
*
sample_offset
/
fp
->
ofdm_symbol_size
;
double
exp_re
=
cos
(
poff
);
double
exp_im
=
sin
(
-
poff
);
fp
->
timeshift_symbol_rotation
[
i
*
2
]
=
(
int16_t
)
round
(
exp_re
*
32767
);
fp
->
timeshift_symbol_rotation
[
i
*
2
+
1
]
=
(
int16_t
)
round
(
exp_im
*
32767
);
fp
->
timeshift_symbol_rotation
[
i
].
r
=
(
int16_t
)
round
(
exp_re
*
32767
);
fp
->
timeshift_symbol_rotation
[
i
].
i
=
(
int16_t
)
round
(
exp_im
*
32767
);
if
(
i
<
10
)
LOG_I
(
PHY
,
"Timeshift symbol rotation %d => (%d,%d) %f
\n
"
,
i
,
fp
->
timeshift_symbol_rotation
[
i
*
2
]
,
fp
->
timeshift_symbol_rotation
[
i
*
2
+
1
]
,
fp
->
timeshift_symbol_rotation
[
i
].
r
,
fp
->
timeshift_symbol_rotation
[
i
].
i
,
poff
);
}
}
...
...
openair1/PHY/MODULATION/ofdm_mod.c
View file @
2cced7bd
...
...
@@ -348,7 +348,7 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
int
length
)
{
int
symb_offset
=
(
slot
%
fp
->
slots_per_subframe
)
*
fp
->
symbols_per_slot
;
int
16_t
*
symbol_rotation
=
fp
->
symbol_rotation
[
0
];
c
16_t
*
symbol_rotation
=
fp
->
symbol_rotation
[
0
];
for
(
int
sidx
=
0
;
sidx
<
nsymb
;
sidx
++
)
{
...
...
@@ -357,12 +357,12 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
slot
,
sidx
+
first_symbol
+
symb_offset
,
length
,
symbol_rotation
[
2
*
(
sidx
+
first_symbol
+
symb_offset
)]
,
symbol_rotation
[
1
+
2
*
(
sidx
+
first_symbol
+
symb_offset
)]
);
symbol_rotation
[
sidx
+
first_symbol
+
symb_offset
].
r
,
symbol_rotation
[
sidx
+
first_symbol
+
symb_offset
].
i
);
rotate_cpx_vector
(
trxdata
+
(
sidx
*
length
*
2
)
,
&
symbol_rotation
[
2
*
(
sidx
+
first_symbol
+
symb_offset
)]
,
trxdata
+
(
sidx
*
length
*
2
)
,
rotate_cpx_vector
(
((
c16_t
*
)
trxdata
)
+
sidx
*
length
,
symbol_rotation
+
sidx
+
first_symbol
+
symb_offset
,
((
c16_t
*
)
trxdata
)
+
sidx
*
length
,
length
,
15
);
}
...
...
openair1/PHY/MODULATION/slot_fep_nr.c
View file @
2cced7bd
...
...
@@ -98,25 +98,25 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
stop_meas
(
&
ue
->
rx_dft_stats
);
int
symb_offset
=
(
Ns
%
frame_parms
->
slots_per_subframe
)
*
frame_parms
->
symbols_per_slot
;
int32_t
rot2
=
((
uint32_t
*
)
frame_parms
->
symbol_rotation
[
0
])
[
symbol
+
symb_offset
];
((
int16_t
*
)
&
rot2
)[
1
]
=-
((
int16_t
*
)
&
rot2
)[
1
]
;
c16_t
rot2
=
frame_parms
->
symbol_rotation
[
0
]
[
symbol
+
symb_offset
];
rot2
.
i
=-
rot2
.
i
;
#ifdef DEBUG_FEP
// if (ue->frame <100)
printf
(
"slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d
\n
"
,
Ns
,
symbol
,
rx_offset
,
symbol
+
symb_offset
,
((
int16_t
*
)
&
rot2
)[
0
],((
int16_t
*
)
&
rot2
)[
1
]
);
symbol
+
symb_offset
,
rot2
.
r
,
rot2
.
i
);
#endif
rotate_cpx_vector
((
int
16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
proc
->
thread_id
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
(
int16_t
*
)
&
rot2
,
(
int
16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
proc
->
thread_id
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
rotate_cpx_vector
((
c
16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
proc
->
thread_id
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
&
rot2
,
(
c
16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
proc
->
thread_id
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
frame_parms
->
ofdm_symbol_size
,
15
);
int
16_t
*
shift_rot
=
frame_parms
->
timeshift_symbol_rotation
;
c
16_t
*
shift_rot
=
frame_parms
->
timeshift_symbol_rotation
;
multadd_cpx_vector
((
int16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
proc
->
thread_id
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
shift_rot
,
(
int16_t
*
)
shift_rot
,
(
int16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
proc
->
thread_id
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
1
,
frame_parms
->
ofdm_symbol_size
,
...
...
@@ -214,18 +214,18 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
stop_meas
(
&
ue
->
rx_dft_stats
);
int
symb_offset
=
(
Ns
%
frame_parms
->
slots_per_subframe
)
*
frame_parms
->
symbols_per_slot
;
int32_t
rot2
=
((
uint32_t
*
)
frame_parms
->
symbol_rotation
[
0
])
[
symbol
+
symb_offset
];
((
int16_t
*
)
&
rot2
)[
1
]
=-
((
int16_t
*
)
&
rot2
)[
1
]
;
c16_t
rot2
=
frame_parms
->
symbol_rotation
[
0
]
[
symbol
+
symb_offset
];
rot2
.
i
=-
rot2
.
i
;
#ifdef DEBUG_FEP
// if (ue->frame <100)
printf
(
"slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d
\n
"
,
Ns
,
symbol
,
rx_offset
,
symbol
+
symb_offset
,
((
int16_t
*
)
&
rot2
)[
0
],((
int16_t
*
)
&
rot2
)[
1
]
);
symbol
+
symb_offset
,
rot2
.
r
,
rot2
.
i
);
#endif
rotate_cpx_vector
((
int
16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
proc
->
thread_id
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
(
int16_t
*
)
&
rot2
,
(
int
16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
proc
->
thread_id
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
rotate_cpx_vector
((
c
16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
proc
->
thread_id
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
&
rot2
,
(
c
16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
proc
->
thread_id
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
frame_parms
->
ofdm_symbol_size
,
15
);
}
...
...
@@ -310,19 +310,19 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
for
(
int
symbol
=
first_symbol
;
symbol
<
nsymb
;
symbol
++
)
{
uint32_t
rot2
=
((
uint32_t
*
)
frame_parms
->
symbol_rotation
[
1
])
[
symbol
+
symb_offset
];
((
int16_t
*
)
&
rot2
)[
1
]
=-
((
int16_t
*
)
&
rot2
)[
1
]
;
LOG_D
(
PHY
,
"slot %d, symb_offset %d rotating by %d.%d
\n
"
,
slot
,
symb_offset
,
((
int16_t
*
)
&
rot2
)[
0
],((
int16_t
*
)
&
rot2
)[
1
]
);
rotate_cpx_vector
((
int
16_t
*
)
&
rxdataF
[
soffset
+
(
frame_parms
->
ofdm_symbol_size
*
symbol
)],
(
int16_t
*
)
&
rot2
,
(
int
16_t
*
)
&
rxdataF
[
soffset
+
(
frame_parms
->
ofdm_symbol_size
*
symbol
)],
c16_t
rot2
=
frame_parms
->
symbol_rotation
[
1
]
[
symbol
+
symb_offset
];
rot2
.
i
=-
rot2
.
i
;
LOG_D
(
PHY
,
"slot %d, symb_offset %d rotating by %d.%d
\n
"
,
slot
,
symb_offset
,
rot2
.
r
,
rot2
.
i
);
rotate_cpx_vector
((
c
16_t
*
)
&
rxdataF
[
soffset
+
(
frame_parms
->
ofdm_symbol_size
*
symbol
)],
&
rot2
,
(
c
16_t
*
)
&
rxdataF
[
soffset
+
(
frame_parms
->
ofdm_symbol_size
*
symbol
)],
length
,
15
);
int
16_t
*
shift_rot
=
frame_parms
->
timeshift_symbol_rotation
;
c
16_t
*
shift_rot
=
frame_parms
->
timeshift_symbol_rotation
;
multadd_cpx_vector
((
int16_t
*
)
&
rxdataF
[
soffset
+
(
frame_parms
->
ofdm_symbol_size
*
symbol
)],
shift_rot
,
(
int16_t
*
)
shift_rot
,
(
int16_t
*
)
&
rxdataF
[
soffset
+
(
frame_parms
->
ofdm_symbol_size
*
symbol
)],
1
,
length
,
...
...
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
View file @
2cced7bd
...
...
@@ -854,7 +854,6 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
uint32_t
nb_re_pusch
)
{
//#define DEBUG_UL_PTRS 1
int16_t
*
phase_per_symbol
=
NULL
;
int32_t
*
ptrs_re_symbol
=
NULL
;
int8_t
ret
=
0
;
...
...
@@ -871,20 +870,20 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
uint8_t
*
ptrsReOffset
=
&
rel15_ul
->
pusch_ptrs
.
ptrs_ports_list
[
0
].
ptrs_re_offset
;
/* loop over antennas */
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
phase_per_symbol
=
(
int
16_t
*
)
gNB
->
pusch_vars
[
ulsch_id
]
->
ptrs_phase_per_slot
[
aarx
];
c16_t
*
phase_per_symbol
=
(
c
16_t
*
)
gNB
->
pusch_vars
[
ulsch_id
]
->
ptrs_phase_per_slot
[
aarx
];
ptrs_re_symbol
=
&
gNB
->
pusch_vars
[
ulsch_id
]
->
ptrs_re_per_slot
;
*
ptrs_re_symbol
=
0
;
phase_per_symbol
[
(
2
*
symbol
)
+
1
]
=
0
;
// Imag
phase_per_symbol
[
symbol
].
i
=
0
;
/* set DMRS estimates to 0 angle with magnitude 1 */
if
(
is_dmrs_symbol
(
symbol
,
*
dmrsSymbPos
))
{
/* set DMRS real estimation to 32767 */
phase_per_symbol
[
2
*
symbol
]
=
(
int16_t
)((
1
<<
15
)
-
1
)
;
// 32767
phase_per_symbol
[
symbol
].
r
=
INT16_MAX
;
// 32767
#ifdef DEBUG_UL_PTRS
printf
(
"[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d
\n
"
,
symbol
,
phase_per_symbol
[
2
*
symbol
],
phase_per_symbol
[(
2
*
symbol
)
+
1
]
);
printf
(
"[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d
\n
"
,
symbol
,
phase_per_symbol
[
symbol
].
r
,
phase_per_symbol
[
symbol
].
i
);
#endif
}
else
{
// real ptrs value is set to 0
phase_per_symbol
[
2
*
symbol
]
=
0
;
// Real
phase_per_symbol
[
symbol
].
r
=
0
;
}
if
(
symbol
==
*
startSymbIndex
)
{
...
...
@@ -909,7 +908,7 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
symbol
,
frame_parms
->
ofdm_symbol_size
,
(
int16_t
*
)
&
gNB
->
pusch_vars
[
ulsch_id
]
->
rxdataF_comp
[
aarx
][(
symbol
*
nb_re_pusch
)],
gNB
->
nr_gold_pusch_dmrs
[
rel15_ul
->
scid
][
nr_tti_rx
][
symbol
],
&
phase_per_symbol
[
2
*
symbol
],
(
int16_t
*
)
&
phase_per_symbol
[
symbol
],
ptrs_re_symbol
);
}
/* For last OFDM symbol at each antenna perform interpolation and compensation for the slot*/
...
...
@@ -919,7 +918,7 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
/*------------------------------------------------------------------------------------------------------- */
/* If L-PTRS is > 0 then we need interpolation */
if
(
*
L_ptrs
>
0
)
{
ret
=
nr_ptrs_process_slot
(
*
dmrsSymbPos
,
*
ptrsSymbPos
,
phase_per_symbol
,
*
startSymbIndex
,
*
nbSymb
);
ret
=
nr_ptrs_process_slot
(
*
dmrsSymbPos
,
*
ptrsSymbPos
,
(
int16_t
*
)
phase_per_symbol
,
*
startSymbIndex
,
*
nbSymb
);
if
(
ret
!=
0
)
{
LOG_W
(
PHY
,
"[PTRS] Compensation is skipped due to error in PTRS slot processing !!
\n
"
);
}
...
...
@@ -938,11 +937,11 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
/* Skip rotation if the slot processing is wrong */
if
((
!
is_dmrs_symbol
(
i
,
*
dmrsSymbPos
))
&&
(
ret
==
0
))
{
#ifdef DEBUG_UL_PTRS
printf
(
"[PHY][UL][PTRS]: Rotate Symbol %2d with %d + j* %d
\n
"
,
i
,
phase_per_symbol
[
2
*
i
],
phase_per_symbol
[(
2
*
i
)
+
1
]
);
printf
(
"[PHY][UL][PTRS]: Rotate Symbol %2d with %d + j* %d
\n
"
,
i
,
phase_per_symbol
[
i
].
r
,
phase_per_symbol
[
i
].
i
);
#endif
rotate_cpx_vector
((
int
16_t
*
)
&
gNB
->
pusch_vars
[
ulsch_id
]
->
rxdataF_comp
[
aarx
][(
i
*
rel15_ul
->
rb_size
*
NR_NB_SC_PER_RB
)],
&
phase_per_symbol
[
2
*
i
],
(
int
16_t
*
)
&
gNB
->
pusch_vars
[
ulsch_id
]
->
rxdataF_comp
[
aarx
][(
i
*
rel15_ul
->
rb_size
*
NR_NB_SC_PER_RB
)],
rotate_cpx_vector
((
c
16_t
*
)
&
gNB
->
pusch_vars
[
ulsch_id
]
->
rxdataF_comp
[
aarx
][(
i
*
rel15_ul
->
rb_size
*
NR_NB_SC_PER_RB
)],
&
phase_per_symbol
[
i
],
(
c
16_t
*
)
&
gNB
->
pusch_vars
[
ulsch_id
]
->
rxdataF_comp
[
aarx
][(
i
*
rel15_ul
->
rb_size
*
NR_NB_SC_PER_RB
)],
((
*
nb_rb
)
*
NR_NB_SC_PER_RB
),
15
);
}
// if not DMRS Symbol
}
// symbol loop
...
...
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
View file @
2cced7bd
...
...
@@ -1657,7 +1657,6 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
RX_type_t
rx_type
)
{
//#define DEBUG_DL_PTRS 1
int16_t
*
phase_per_symbol
=
NULL
;
int32_t
*
ptrs_re_symbol
=
NULL
;
int8_t
ret
=
0
;
/* harq specific variables */
...
...
@@ -1701,20 +1700,20 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
}
/* loop over antennas */
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
phase_per_symbol
=
(
int
16_t
*
)
pdsch_vars
[
gNB_id
]
->
ptrs_phase_per_slot
[
aarx
];
c16_t
*
phase_per_symbol
=
(
c
16_t
*
)
pdsch_vars
[
gNB_id
]
->
ptrs_phase_per_slot
[
aarx
];
ptrs_re_symbol
=
(
int32_t
*
)
pdsch_vars
[
gNB_id
]
->
ptrs_re_per_slot
[
aarx
];
ptrs_re_symbol
[
symbol
]
=
0
;
phase_per_symbol
[
(
2
*
symbol
)
+
1
]
=
0
;
// Imag
phase_per_symbol
[
symbol
].
i
=
0
;
// Imag
/* set DMRS estimates to 0 angle with magnitude 1 */
if
(
is_dmrs_symbol
(
symbol
,
*
dmrsSymbPos
))
{
/* set DMRS real estimation to 32767 */
phase_per_symbol
[
2
*
symbol
]
=
(
int16_t
)((
1
<<
15
)
-
1
)
;
// 32767
phase_per_symbol
[
symbol
].
r
=
INT16_MAX
;
// 32767
#ifdef DEBUG_DL_PTRS
printf
(
"[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d
\n
"
,
symbol
,
phase_per_symbol
[
2
*
symbol
],
phase_per_symbol
[(
2
*
symbol
)
+
1
]
);
printf
(
"[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d
\n
"
,
symbol
,
phase_per_symbol
[
symbol
].
r
,
phase_per_symbol
[
symbol
].
i
);
#endif
}
else
{
// real ptrs value is set to 0
phase_per_symbol
[
2
*
symbol
]
=
0
;
// Real
phase_per_symbol
[
symbol
].
r
=
0
;
// Real
}
if
(
dlsch0_harq
->
status
==
ACTIVE
)
{
...
...
@@ -1740,7 +1739,7 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
symbol
,
frame_parms
->
ofdm_symbol_size
,
(
int16_t
*
)
&
pdsch_vars
[
gNB_id
]
->
rxdataF_comp0
[
aarx
][(
symbol
*
nb_re_pdsch
)],
ue
->
nr_gold_pdsch
[
gNB_id
][
nr_slot_rx
][
symbol
][
0
],
&
phase_per_symbol
[
2
*
symbol
],
(
int16_t
*
)
&
phase_per_symbol
[
symbol
],
&
ptrs_re_symbol
[
symbol
]);
}
}
// HARQ 0
...
...
@@ -1752,7 +1751,7 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
/*------------------------------------------------------------------------------------------------------- */
/* If L-PTRS is > 0 then we need interpolation */
if
(
*
L_ptrs
>
0
)
{
ret
=
nr_ptrs_process_slot
(
*
dmrsSymbPos
,
*
ptrsSymbPos
,
phase_per_symbol
,
*
startSymbIndex
,
*
nbSymb
);
ret
=
nr_ptrs_process_slot
(
*
dmrsSymbPos
,
*
ptrsSymbPos
,
(
int16_t
*
)
phase_per_symbol
,
*
startSymbIndex
,
*
nbSymb
);
if
(
ret
!=
0
)
{
LOG_W
(
PHY
,
"[PTRS] Compensation is skipped due to error in PTRS slot processing !!
\n
"
);
}
...
...
@@ -1771,11 +1770,11 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
/* Skip rotation if the slot processing is wrong */
if
((
!
is_dmrs_symbol
(
i
,
*
dmrsSymbPos
))
&&
(
ret
==
0
))
{
#ifdef DEBUG_DL_PTRS
printf
(
"[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d
\n
"
,
i
,
phase_per_symbol
[
2
*
i
],
phase_per_symbol
[(
2
*
i
)
+
1
]
);
printf
(
"[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d
\n
"
,
i
,
phase_per_symbol
[
i
].
r
,
phase_per_symbol
[
i
].
i
);
#endif
rotate_cpx_vector
((
int
16_t
*
)
&
pdsch_vars
[
gNB_id
]
->
rxdataF_comp0
[
aarx
][(
i
*
(
*
nb_rb
)
*
NR_NB_SC_PER_RB
)],
&
phase_per_symbol
[
2
*
i
],
(
int
16_t
*
)
&
pdsch_vars
[
gNB_id
]
->
rxdataF_comp0
[
aarx
][(
i
*
(
*
nb_rb
)
*
NR_NB_SC_PER_RB
)],
rotate_cpx_vector
((
c
16_t
*
)
&
pdsch_vars
[
gNB_id
]
->
rxdataF_comp0
[
aarx
][(
i
*
(
*
nb_rb
)
*
NR_NB_SC_PER_RB
)],
&
phase_per_symbol
[
i
],
(
c
16_t
*
)
&
pdsch_vars
[
gNB_id
]
->
rxdataF_comp0
[
aarx
][(
i
*
(
*
nb_rb
)
*
NR_NB_SC_PER_RB
)],
((
*
nb_rb
)
*
NR_NB_SC_PER_RB
),
15
);
}
// if not DMRS Symbol
}
// symbol loop
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
View file @
2cced7bd
...
...
@@ -597,17 +597,15 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
int
symb_offset
=
(
slot
%
frame_parms
->
slots_per_subframe
)
*
frame_parms
->
symbols_per_slot
;
for
(
ap
=
0
;
ap
<
n_antenna_ports
;
ap
++
)
{
for
(
int
s
=
0
;
s
<
NR_NUMBER_OF_SYMBOLS_PER_SLOT
;
s
++
){
LOG_D
(
PHY
,
"In %s: rotating txdataF symbol %d (%d) => (%d.%d)
\n
"
,
__FUNCTION__
,
c16_t
rot
=
((
c16_t
*
)
frame_parms
->
symbol_rotation
[
1
])[
s
+
symb_offset
];
LOG_D
(
PHY
,
"rotating txdataF symbol %d (%d) => (%d.%d)
\n
"
,
s
,
s
+
symb_offset
,
frame_parms
->
symbol_rotation
[
1
][
2
*
(
s
+
symb_offset
)],
frame_parms
->
symbol_rotation
[
1
][
1
+
(
2
*
(
s
+
symb_offset
))]);
rot
.
r
,
rot
.
i
);
rotate_cpx_vector
((
int
16_t
*
)
&
txdataF
[
ap
][
frame_parms
->
ofdm_symbol_size
*
s
],
&
frame_parms
->
symbol_rotation
[
1
][
2
*
(
s
+
symb_offset
)]
,
(
int
16_t
*
)
&
txdataF
[
ap
][
frame_parms
->
ofdm_symbol_size
*
s
],
rotate_cpx_vector
((
c
16_t
*
)
&
txdataF
[
ap
][
frame_parms
->
ofdm_symbol_size
*
s
],
&
rot
,
(
c
16_t
*
)
&
txdataF
[
ap
][
frame_parms
->
ofdm_symbol_size
*
s
],
frame_parms
->
ofdm_symbol_size
,
15
);
}
...
...
openair1/PHY/TOOLS/cmult_sv.c
View file @
2cced7bd
...
...
@@ -144,207 +144,10 @@ void multadd_real_four_symbols_vector_complex_scalar(int16_t *x,
_m_empty
();
}
/*
int rotate_cpx_vector(int16_t *x,
int16_t *alpha,
int16_t *y,
uint32_t N,
uint16_t output_shift,
uint8_t format)
{
// Multiply elementwise two complex vectors of N elements
// x - input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
// We assume x1 with a dynamic of 15 bit maximum
//
// alpha - input 2 in the format |Re0 Im0|
// We assume x2 with a dynamic of 15 bit maximum
//
// y - output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
//
// N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
//
// output_shift - shift at output to return in Q1.15
// format - 0 means alpha is in shuffled format, 1 means x is in shuffled format
uint32_t i; // loop counter
register __m128i m0,m1;
__m128i *x_128;
__m128i *y_128;
shift = _mm_cvtsi32_si128(output_shift);
x_128 = (__m128i *)&x[0];
if (format==0) { // alpha is in shuffled format for complex multiply
((int16_t *)&alpha_128)[0] = alpha[0];
((int16_t *)&alpha_128)[1] = -alpha[1];
((int16_t *)&alpha_128)[2] = alpha[1];
((int16_t *)&alpha_128)[3] = alpha[0];
((int16_t *)&alpha_128)[4] = alpha[0];
((int16_t *)&alpha_128)[5] = -alpha[1];
((int16_t *)&alpha_128)[6] = alpha[1];
((int16_t *)&alpha_128)[7] = alpha[0];
} else { // input is in shuffled format for complex multiply
((int16_t *)&alpha_128)[0] = alpha[0];
((int16_t *)&alpha_128)[1] = alpha[1];
((int16_t *)&alpha_128)[2] = alpha[0];
((int16_t *)&alpha_128)[3] = alpha[1];
((int16_t *)&alpha_128)[4] = alpha[0];
((int16_t *)&alpha_128)[5] = alpha[1];
((int16_t *)&alpha_128)[6] = alpha[0];
((int16_t *)&alpha_128)[7] = alpha[1];
}
y_128 = (__m128i *)&y[0];
// _mm_empty();
// return(0);
// we compute 4 cpx multiply for each loop
for(i=0; i<(N>>3); i++) {
m0 = _mm_madd_epi16(x_128[0],alpha_128); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
m1=m0;
m0 = _mm_packs_epi32(m1,m0); // 1- pack in a 128 bit register [re im re im]
y_128[0] = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
m0 = _mm_madd_epi16(x_128[1],alpha_128); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
m1 = m0;
m1 = _mm_packs_epi32(m1,m0); // 1- pack in a 128 bit register [re im re im]
y_128[1] = _mm_unpacklo_epi32(m1,m1); // 1- pack in a 128 bit register [re im re im]
m0 = _mm_madd_epi16(x_128[2],alpha_128); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
m1 = m0;
m1 = _mm_packs_epi32(m1,m0); // 1- pack in a 128 bit register [re im re im]
y_128[2] = _mm_unpacklo_epi32(m1,m1); // 1- pack in a 128 bit register [re im re im]
m0 = _mm_madd_epi16(x_128[3],alpha_128); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
m1 = m0;
m1 = _mm_packs_epi32(m1,m0); // 1- pack in a 128 bit register [re im re im]
y_128[3] = _mm_unpacklo_epi32(m1,m1); // 1- pack in a 128 bit register [re im re im]
if (format==1) { // Put output in proper format (Re,-Im,Im,Re), shuffle = (0,1,3,2) = 0x1e
y_128[0] = _mm_shufflelo_epi16(y_128[0],0x1e);
y_128[0] = _mm_shufflehi_epi16(y_128[0],0x1e);
((int16_t*)&y_128[0])[1] = -((int16_t*)&y_128[0])[1];
((int16_t*)&y_128[0])[5] = -((int16_t*)&y_128[0])[5];
y_128[1] = _mm_shufflelo_epi16(y_128[1],0x1e);
y_128[1] = _mm_shufflehi_epi16(y_128[1],0x1e);
((int16_t*)&y_128[1])[1] = -((int16_t*)&y_128[1])[1];
((int16_t*)&y_128[1])[5] = -((int16_t*)&y_128[1])[5];
y_128[2] = _mm_shufflelo_epi16(y_128[2],0x1e);
y_128[2] = _mm_shufflehi_epi16(y_128[2],0x1e);
((int16_t*)&y_128[2])[1] = -((int16_t*)&y_128[2])[1];
((int16_t*)&y_128[2])[5] = -((int16_t*)&y_128[2])[5];
y_128[3] = _mm_shufflelo_epi16(y_128[3],0x1e);
y_128[3] = _mm_shufflehi_epi16(y_128[3],0x1e);
((int16_t*)&y_128[3])[1] = -((int16_t*)&y_128[3])[1];
((int16_t*)&y_128[3])[5] = -((int16_t*)&y_128[3])[5];
}
x_128+=4;
y_128 +=4;
}
_mm_empty();
_m_empty();
return(0);
}
int rotate_cpx_vector2(int16_t *x,
int16_t *alpha,
int16_t *y,
uint32_t N,
uint16_t output_shift,
uint8_t format)
{
// Multiply elementwise two complex vectors of N elements
// x - input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
// We assume x1 with a dynamic of 15 bit maximum
//
// alpha - input 2 in the format |Re0 Im0|
// We assume x2 with a dynamic of 15 bit maximum
//
// y - output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
//
// N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
//
// log2_amp - increase the output amplitude by a factor 2^log2_amp (default is 0)
// WARNING: log2_amp>0 can cause overflow!!
uint32_t i; // loop counter
register __m128i m0,m1;
__m128i *x_128;
__m128i *y_128;
shift = _mm_cvtsi32_si128(output_shift);
x_128 = (__m128i *)&x[0];
if (format==0) { // alpha is in shuffled format for complex multiply
((int16_t *)&alpha_128)[0] = alpha[0];
((int16_t *)&alpha_128)[1] = -alpha[1];
((int16_t *)&alpha_128)[2] = alpha[1];
((int16_t *)&alpha_128)[3] = alpha[0];
((int16_t *)&alpha_128)[4] = alpha[0];
((int16_t *)&alpha_128)[5] = -alpha[1];
((int16_t *)&alpha_128)[6] = alpha[1];
((int16_t *)&alpha_128)[7] = alpha[0];
} else { // input is in shuffled format for complex multiply
((int16_t *)&alpha_128)[0] = alpha[0];
((int16_t *)&alpha_128)[1] = alpha[1];
((int16_t *)&alpha_128)[2] = alpha[0];
((int16_t *)&alpha_128)[3] = alpha[1];
((int16_t *)&alpha_128)[4] = alpha[0];
((int16_t *)&alpha_128)[5] = alpha[1];
((int16_t *)&alpha_128)[6] = alpha[0];
((int16_t *)&alpha_128)[7] = alpha[1];
}
y_128 = (__m128i *)&y[0];
// we compute 4 cpx multiply for each loop
for(i=0; i<(N>>1); i++) {
m0 = _mm_madd_epi16(x_128[i],alpha_128); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
m1=m0;
m1 = _mm_packs_epi32(m1,m0); // 1- pack in a 128 bit register [re im re im]
y_128[i] = _mm_unpacklo_epi32(m1,m1); // 1- pack in a 128 bit register [re im re im]
if (format==1) { // Put output in proper format (Re,-Im,Im,Re), shuffle = (0,1,3,2) = 0x1e
y_128[i] = _mm_shufflelo_epi16(y_128[i],0x1e);
y_128[i] = _mm_shufflehi_epi16(y_128[i],0x1e);
((int16_t*)&y_128[i])[1] = -((int16_t*)&y_128[i])[1];
((int16_t*)&y_128[i])[5] = -((int16_t*)&y_128[i])[5];
}
}
_mm_empty();
_m_empty();
return(0);
}
*/
int
rotate_cpx_vector
(
int16_t
*
x
,
int16_t
*
alpha
,
int16_t
*
y
,
#ifdef __AVX2__
void
rotate_cpx_vector
(
c16_t
*
x
,
c16_t
*
alpha
,
c16_t
*
y
,
uint32_t
N
,
uint16_t
output_shift
)
{
...
...
@@ -372,28 +175,28 @@ int rotate_cpx_vector(int16_t *x,
__m128i
shift
=
_mm_cvtsi32_si128
(
output_shift
);
register
simd_q15_t
m0
,
m1
,
m2
,
m3
;
((
int16_t
*
)
&
alpha_128
)[
0
]
=
alpha
[
0
]
;
((
int16_t
*
)
&
alpha_128
)[
1
]
=
-
alpha
[
1
]
;
((
int16_t
*
)
&
alpha_128
)[
2
]
=
alpha
[
1
]
;
((
int16_t
*
)
&
alpha_128
)[
3
]
=
alpha
[
0
]
;
((
int16_t
*
)
&
alpha_128
)[
4
]
=
alpha
[
0
]
;
((
int16_t
*
)
&
alpha_128
)[
5
]
=
-
alpha
[
1
]
;
((
int16_t
*
)
&
alpha_128
)[
6
]
=
alpha
[
1
]
;
((
int16_t
*
)
&
alpha_128
)[
7
]
=
alpha
[
0
]
;
((
int16_t
*
)
&
alpha_128
)[
0
]
=
alpha
->
r
;
((
int16_t
*
)
&
alpha_128
)[
1
]
=
-
alpha
->
i
;
((
int16_t
*
)
&
alpha_128
)[
2
]
=
alpha
->
i
;
((
int16_t
*
)
&
alpha_128
)[
3
]
=
alpha
->
r
;
((
int16_t
*
)
&
alpha_128
)[
4
]
=
alpha
->
r
;
((
int16_t
*
)
&
alpha_128
)[
5
]
=
-
alpha
->
i
;
((
int16_t
*
)
&
alpha_128
)[
6
]
=
alpha
->
i
;
((
int16_t
*
)
&
alpha_128
)[
7
]
=
alpha
->
r
;
#elif defined(__arm__)
int32x4_t
shift
;
int32x4_t
ab_re0
,
ab_re1
,
ab_im0
,
ab_im1
,
re32
,
im32
;
int16_t
reflip
[
8
]
__attribute__
((
aligned
(
16
)))
=
{
1
,
-
1
,
1
,
-
1
,
1
,
-
1
,
1
,
-
1
};
int32x4x2_t
xtmp
;
((
int16_t
*
)
&
alpha_128
)[
0
]
=
alpha
[
0
]
;
((
int16_t
*
)
&
alpha_128
)[
1
]
=
alpha
[
1
]
;
((
int16_t
*
)
&
alpha_128
)[
2
]
=
alpha
[
0
]
;
((
int16_t
*
)
&
alpha_128
)[
3
]
=
alpha
[
1
]
;
((
int16_t
*
)
&
alpha_128
)[
4
]
=
alpha
[
0
]
;
((
int16_t
*
)
&
alpha_128
)[
5
]
=
alpha
[
1
]
;
((
int16_t
*
)
&
alpha_128
)[
6
]
=
alpha
[
0
]
;
((
int16_t
*
)
&
alpha_128
)[
7
]
=
alpha
[
1
]
;
((
int16_t
*
)
&
alpha_128
)[
0
]
=
alpha
->
r
;
((
int16_t
*
)
&
alpha_128
)[
1
]
=
alpha
->
i
;
((
int16_t
*
)
&
alpha_128
)[
2
]
=
alpha
->
r
;
((
int16_t
*
)
&
alpha_128
)[
3
]
=
alpha
->
i
;
((
int16_t
*
)
&
alpha_128
)[
4
]
=
alpha
->
r
;
((
int16_t
*
)
&
alpha_128
)[
5
]
=
alpha
->
i
;
((
int16_t
*
)
&
alpha_128
)[
6
]
=
alpha
->
r
;
((
int16_t
*
)
&
alpha_128
)[
7
]
=
alpha
->
i
;
int16x8_t
bflip
=
vrev32q_s16
(
alpha_128
);
int16x8_t
bconj
=
vmulq_s16
(
alpha_128
,
*
(
int16x8_t
*
)
reflip
);
shift
=
vdupq_n_s32
(
-
output_shift
);
...
...
@@ -439,9 +242,9 @@ int rotate_cpx_vector(int16_t *x,
_mm_empty
();
_m_empty
();
return
(
0
)
;
return
;
}
#endif
/*
int mult_vector32_scalar(int16_t *x1,
int x2,
...
...
@@ -536,7 +339,7 @@ main ()
int16_t
input
[
256
]
__attribute__
((
aligned
(
16
)));
int16_t
input2
[
256
]
__attribute__
((
aligned
(
16
)));
int16_t
output
[
256
]
__attribute__
((
aligned
(
16
)));
int16_t
alpha
[
2
]
;
c16_t
alpha
;
int
i
;
...
...
@@ -574,8 +377,8 @@ main ()
input2
[
14
]
=
1000
;
input2
[
15
]
=
2000
;
alpha
[
0
]
=
32767
;
alpha
[
1
]
=
0
;
alpha
->
r
=
32767
;
alpha
->
i
=
0
;
//mult_cpx_vector(input,input2,output,L,0);
rotate_cpx_vector_norep
(
input
,
alpha
,
input
,
L
,
15
);
...
...
openair1/PHY/TOOLS/tools_defs.h
View file @
2cced7bd
...
...
@@ -37,6 +37,7 @@ extern "C" {
#include <stdint.h>
#include <assert.h>
#include "PHY/sse_intrin.h"
#include "common/utils/assertions.h"
#define CEILIDIV(a,b) ((a+b-1)/b)
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
...
...
@@ -104,15 +105,6 @@ void multadd_complex_vector_real_scalar(int16_t *x,
uint8_t
zero_flag
,
uint32_t
N
);
int
rotate_cpx_vector
(
int16_t
*
x
,
int16_t
*
alpha
,
int16_t
*
y
,
uint32_t
N
,
uint16_t
output_shift
);
/*!\fn void init_fft(uint16_t size,uint8_t logsize,uint16_t *rev)
\brief Initialize the FFT engine for a given size
@param size Size of the FFT
...
...
@@ -461,7 +453,7 @@ idft_size_idx_t get_idft(int ofdm_symbol_size)
}
/*!\fn int32_t rotate_cpx_vector(
int16_t *x,int16_t *alpha,int
16_t *y,uint32_t N,uint16_t output_shift)
/*!\fn int32_t rotate_cpx_vector(
c16_t *x,c16_t *alpha,c
16_t *y,uint32_t N,uint16_t output_shift)
This function performs componentwise multiplication of a vector with a complex scalar.
@param x Vector input (Q1.15) in the format |Re0 Im0|,......,|Re(N-1) Im(N-1)|
@param alpha Scalar input (Q1.15) in the format |Re0 Im0|
...
...
@@ -471,9 +463,9 @@ This function performs componentwise multiplication of a vector with a complex s
The function implemented is : \f$\mathbf{y} = \alpha\mathbf{x}\f$
*/
int32_t
rotate_cpx_vector
(
int
16_t
*
x
,
int
16_t
*
alpha
,
int
16_t
*
y
,
void
rotate_cpx_vector
(
c
16_t
*
x
,
c
16_t
*
alpha
,
c
16_t
*
y
,
uint32_t
N
,
uint16_t
output_shift
);
...
...
openair1/PHY/defs_nr_common.h
View file @
2cced7bd
...
...
@@ -359,10 +359,10 @@ struct NR_DL_FRAME_PARMS {
lte_prefix_type_t
Ncp
;
/// sequence which is computed based on carrier frequency and numerology to rotate/derotate each OFDM symbol according to Section 5.3 in 38.211
/// First dimension is for the direction of the link (0 DL, 1 UL)
int16_t
symbol_rotation
[
2
][
224
*
2
];
c16_t
symbol_rotation
[
2
][
224
];
/// sequence used to compensate the phase rotation due to timeshifted OFDM symbols
/// First dimenstion is for different CP lengths
int
16_t
timeshift_symbol_rotation
[
4096
*
2
]
__attribute__
((
aligned
(
16
)));
c
16_t
timeshift_symbol_rotation
[
4096
*
2
]
__attribute__
((
aligned
(
16
)));
/// shift of pilot position in one RB
uint8_t
nushift
;
/// SRS configuration from TS 38.331 RRC
...
...
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