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
Michael Black
OpenXG UE
Commits
7f50a04e
Commit
7f50a04e
authored
Apr 01, 2020
by
Raymond Knopp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dft-based pucch0 receiver
parent
bb8002ae
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
98 additions
and
26 deletions
+98
-26
openair1/PHY/NR_TRANSPORT/pucch_rx.c
openair1/PHY/NR_TRANSPORT/pucch_rx.c
+70
-18
openair1/PHY/TOOLS/lte_dfts.c
openair1/PHY/TOOLS/lte_dfts.c
+4
-0
openair1/PHY/TOOLS/tools_defs.h
openair1/PHY/TOOLS/tools_defs.h
+2
-0
openair1/SIMULATION/NR_PHY/pucchsim.c
openair1/SIMULATION/NR_PHY/pucchsim.c
+22
-8
No files found.
openair1/PHY/NR_TRANSPORT/pucch_rx.c
View file @
7f50a04e
...
@@ -17,6 +17,7 @@
...
@@ -17,6 +17,7 @@
#include "T.h"
#include "T.h"
#define DEBUG_NR_PUCCH_RX 1
void
nr_decode_pucch0
(
int32_t
**
rxdataF
,
void
nr_decode_pucch0
(
int32_t
**
rxdataF
,
NR_DL_FRAME_PARMS
*
frame_parms
,
NR_DL_FRAME_PARMS
*
frame_parms
,
...
@@ -79,28 +80,32 @@ void nr_decode_pucch0(int32_t **rxdataF,
...
@@ -79,28 +80,32 @@ void nr_decode_pucch0(int32_t **rxdataF,
nr_group_sequence_hopping
(
pucch_GroupHopping
,
pucch_pdu
->
hopping_id
,
n_hop
,
slot
,
&
u
,
&
v
);
// calculating u and v value
nr_group_sequence_hopping
(
pucch_GroupHopping
,
pucch_pdu
->
hopping_id
,
n_hop
,
slot
,
&
u
,
&
v
);
// calculating u and v value
alpha
=
nr_cyclic_shift_hopping
(
pucch_pdu
->
hopping_id
,
pucch_pdu
->
initial_cyclic_shift
,
mcs
[
i
],
l
,
pucch_pdu
->
start_symbol_index
,
slot
);
alpha
=
nr_cyclic_shift_hopping
(
pucch_pdu
->
hopping_id
,
pucch_pdu
->
initial_cyclic_shift
,
mcs
[
i
],
l
,
pucch_pdu
->
start_symbol_index
,
slot
);
#ifdef DEBUG_NR_PUCCH_RX
#ifdef DEBUG_NR_PUCCH_RX
printf
(
"
\t
[nr_generate_pucch0] sequence generation
\t
u=%d
\t
v=%d
\t
alpha=%lf
\t
(for symbol l=%d)
\n
"
,
u
,
v
,
alpha
,
l
);
printf
(
"
\t
[nr_generate_pucch0] sequence generation
\t
u=%d
\t
v=%d
\t
alpha=%lf
\t
(for symbol l=%d/%d,mcs %d)
\n
"
,
u
,
v
,
alpha
,
l
,
l
+
pucch_pdu
->
start_symbol_index
,
mcs
[
i
]
);
#endif
#endif
for
(
n
=
0
;
n
<
12
;
n
++
){
for
(
n
=
0
;
n
<
12
;
n
++
){
x_n_re
[
i
][(
12
*
l
)
+
n
]
=
(
int16_t
)((
int16_t
)(((((
int32_t
)(
round
(
32767
*
cos
(
alpha
*
n
)))
*
table_5_2_2_2_2_Re
[
u
][
n
])
>>
15
)
x_n_re
[
i
][(
12
*
l
)
+
n
]
=
(
int16_t
)((
int16_t
)(((((
int32_t
)(
round
(
32767
*
cos
(
alpha
*
n
)))
*
table_5_2_2_2_2_Re
[
u
][
n
])
>>
15
)
-
(((
int32_t
)(
round
(
32767
*
sin
(
alpha
*
n
)))
*
table_5_2_2_2_2_Im
[
u
][
n
])
>>
15
)))
>>
15
);
// Re part of base sequence shifted by alpha
-
(((
int32_t
)(
round
(
32767
*
sin
(
alpha
*
n
)))
*
table_5_2_2_2_2_Im
[
u
][
n
])
>>
15
))));
// Re part of base sequence shifted by alpha
x_n_im
[
i
][(
12
*
l
)
+
n
]
=
(
int16_t
)((
int16_t
)(((((
int32_t
)(
round
(
32767
*
cos
(
alpha
*
n
)))
*
table_5_2_2_2_2_Im
[
u
][
n
])
>>
15
)
x_n_im
[
i
][(
12
*
l
)
+
n
]
=
(
int16_t
)((
int16_t
)(((((
int32_t
)(
round
(
32767
*
cos
(
alpha
*
n
)))
*
table_5_2_2_2_2_Im
[
u
][
n
])
>>
15
)
+
(((
int32_t
)(
round
(
32767
*
sin
(
alpha
*
n
)))
*
table_5_2_2_2_2_Re
[
u
][
n
])
>>
15
)))
>>
15
);
// Im part of base sequence shifted by alpha
+
(((
int32_t
)(
round
(
32767
*
sin
(
alpha
*
n
)))
*
table_5_2_2_2_2_Re
[
u
][
n
])
>>
15
))));
// Im part of base sequence shifted by alpha
#ifdef DEBUG_NR_PUCCH_RX
#ifdef DEBUG_NR_PUCCH_RX
printf
(
"
\t
[nr_generate_pucch0] sequence generation
\t
u=%d
\t
v=%d
\t
alpha=%lf
\t
x_n(l=%d,n=%d)=(%d,%d)
\n
"
,
printf
(
"
\t
[nr_generate_pucch0] sequence generation
\t
u=%d
\t
v=%d
\t
alpha=%lf
\t
x_n(l=%d,n=%d)=(%d,%d) %d,%d
\n
"
,
u
,
v
,
alpha
,
l
,
n
,
x_n_re
[(
12
*
l
)
+
n
],
x_n_im
[(
12
*
l
)
+
n
]);
u
,
v
,
alpha
,
l
,
n
,
x_n_re
[
i
][(
12
*
l
)
+
n
],
x_n_im
[
i
][(
12
*
l
)
+
n
],
#endif
(
int32_t
)(
round
(
32767
*
cos
(
alpha
*
n
))),
(
int32_t
)(
round
(
32767
*
sin
(
alpha
*
n
))));
#endif
}
}
}
}
}
}
int16_t
r_re
[
24
],
r_im
[
24
];
/*
/*
* Implementing TS 38.211 Subclause 6.3.2.3.2 Mapping to physical resources
* Implementing TS 38.211 Subclause 6.3.2.3.2 Mapping to physical resources
*/
*/
uint32_t
re_offset
=
0
;
uint32_t
re_offset
=
0
;
uint8_t
l2
;
uint8_t
l2
;
#ifdef OLD_IMPL
int16_t
r_re
[
24
],
r_im
[
24
];
for
(
l
=
0
;
l
<
pucch_pdu
->
nr_of_symbols
;
l
++
)
{
for
(
l
=
0
;
l
<
pucch_pdu
->
nr_of_symbols
;
l
++
)
{
l2
=
l
+
pucch_pdu
->
start_symbol_index
;
l2
=
l
+
pucch_pdu
->
start_symbol_index
;
...
@@ -122,7 +127,7 @@ void nr_decode_pucch0(int32_t **rxdataF,
...
@@ -122,7 +127,7 @@ void nr_decode_pucch0(int32_t **rxdataF,
if
(
re_offset
>=
frame_parms
->
ofdm_symbol_size
)
if
(
re_offset
>=
frame_parms
->
ofdm_symbol_size
)
re_offset
-=
frame_parms
->
ofdm_symbol_size
;
re_offset
-=
frame_parms
->
ofdm_symbol_size
;
}
}
}
}
double
corr
[
nr_sequences
],
corr_re
[
nr_sequences
],
corr_im
[
nr_sequences
];
double
corr
[
nr_sequences
],
corr_re
[
nr_sequences
],
corr_im
[
nr_sequences
];
memset
(
corr
,
0
,
nr_sequences
*
sizeof
(
double
));
memset
(
corr
,
0
,
nr_sequences
*
sizeof
(
double
));
memset
(
corr_re
,
0
,
nr_sequences
*
sizeof
(
double
));
memset
(
corr_re
,
0
,
nr_sequences
*
sizeof
(
double
));
...
@@ -144,7 +149,55 @@ void nr_decode_pucch0(int32_t **rxdataF,
...
@@ -144,7 +149,55 @@ void nr_decode_pucch0(int32_t **rxdataF,
max_corr
=
corr
[
i
];
max_corr
=
corr
[
i
];
}
}
}
}
#else
int16_t
*
x_re
=
x_n_re
[
0
],
*
x_im
=
x_n_im
[
0
];
int16_t
xr
[
32
]
__attribute__
((
aligned
(
32
)));
int16_t
xrt
[
32
]
__attribute__
((
aligned
(
32
)));
int32_t
xrtmag
=
0
;
int
maxpos
=
0
;
int
n2
=
0
;
uint8_t
index
=
0
;
memset
((
void
*
)
xr
,
0
,
32
*
sizeof
(
int16_t
));
for
(
l
=
0
;
l
<
pucch_pdu
->
nr_of_symbols
;
l
++
)
{
l2
=
l
+
pucch_pdu
->
start_symbol_index
;
re_offset
=
(
12
*
pucch_pdu
->
prb_start
)
+
frame_parms
->
first_carrier_offset
;
if
(
re_offset
>=
frame_parms
->
ofdm_symbol_size
)
re_offset
-=
frame_parms
->
ofdm_symbol_size
;
AssertFatal
(
re_offset
+
12
<
frame_parms
->
ofdm_symbol_size
,
"pucch straddles DC carrier, handle this!
\n
"
);
n2
=
0
;
int16_t
*
r
=
(
int16_t
*
)
&
rxdataF
[
0
][(
l2
*
frame_parms
->
ofdm_symbol_size
+
re_offset
)];
if
(
l
==
0
)
for
(
n
=
0
;
n
<
12
;
n
++
,
n2
+=
2
)
{
xr
[
n2
]
=
((
int32_t
)
x_re
[
n
]
*
r
[
n2
]
+
(
int32_t
)
x_im
[
n
]
*
r
[
n2
+
1
])
>>
15
;
xr
[
n2
+
1
]
=
((
int32_t
)
x_re
[
n
]
*
r
[
n2
+
1
]
-
(
int32_t
)
x_im
[
n
]
*
r
[
n2
])
>>
15
;
printf
(
"x (%d,%d), r (%d,%d), xr (%d,%d)
\n
"
,
x_re
[
n
],
x_im
[
n
],
r
[
n2
],
r
[
n2
+
1
],
xr
[
n2
],
xr
[
n2
+
1
]);
}
else
for
(
n
=
0
;
n
<
12
;
n
++
,
n2
+=
2
)
{
xr
[
n2
]
+=
((
int32_t
)
x_re
[
n
]
*
r
[
n2
]
+
(
int32_t
)
x_im
[
n
]
*
r
[
n2
+
1
])
>>
15
;
xr
[
n2
+
1
]
+=
((
int32_t
)
x_re
[
n
]
*
r
[
n2
+
1
]
-
(
int32_t
)
x_im
[
n
]
*
r
[
n2
])
>>
15
;
}
x_re
+=
12
;
x_im
+=
12
;
}
idft16f
(
xr
,
xrt
);
n2
=
0
;
int32_t
temp
;
for
(
n
=
0
;
n
<
16
;
n
++
,
n2
+=
2
)
{
#ifdef DEBUG_NR_PUCCH_RX
printf
(
"PUCCH IDFT[%d] = (%d,%d)
\n
"
,
n
,
xrt
[
n2
],
xrt
[
n2
+
1
]);
#endif
if
((
temp
=
(
int32_t
)
xrt
[
n2
]
*
xrt
[
n2
]
+
(
int32_t
)
xrt
[
n2
+
1
]
*
xrt
[
n2
+
1
])
<
xrtmag
)
{
xrtmag
=
temp
;
maxpos
=
n
;
}
}
exit
(
-
1
);
#endif
// first bit of bitmap for sr presence and second bit for acknack presence
// first bit of bitmap for sr presence and second bit for acknack presence
uci_pdu
->
pdu_bit_map
=
pucch_pdu
->
sr_flag
|
((
pucch_pdu
->
bit_len_harq
>
0
)
<<
1
);
uci_pdu
->
pdu_bit_map
=
pucch_pdu
->
sr_flag
|
((
pucch_pdu
->
bit_len_harq
>
0
)
<<
1
);
uci_pdu
->
pucch_format
=
0
;
// format 0
uci_pdu
->
pucch_format
=
0
;
// format 0
...
@@ -281,7 +334,6 @@ void nr_decode_pucch1( int32_t **rxdataF,
...
@@ -281,7 +334,6 @@ void nr_decode_pucch1( int32_t **rxdataF,
re_offset
=
((
l
+
startingSymbolIndex
)
*
frame_parms
->
ofdm_symbol_size
)
+
(
12
*
startingPRB
)
+
frame_parms
->
first_carrier_offset
;
re_offset
=
((
l
+
startingSymbolIndex
)
*
frame_parms
->
ofdm_symbol_size
)
+
(
12
*
startingPRB
)
+
frame_parms
->
first_carrier_offset
;
}
}
//txptr = &txdataF[0][re_offset];
for
(
int
n
=
0
;
n
<
12
;
n
++
)
{
for
(
int
n
=
0
;
n
<
12
;
n
++
)
{
if
((
n
==
6
)
&&
(
startingPRB
==
(
frame_parms
->
N_RB_DL
>>
1
))
&&
((
frame_parms
->
N_RB_DL
&
1
)
==
1
))
{
if
((
n
==
6
)
&&
(
startingPRB
==
(
frame_parms
->
N_RB_DL
>>
1
))
&&
((
frame_parms
->
N_RB_DL
&
1
)
==
1
))
{
// if number RBs in bandwidth is odd and current PRB contains DC, we need to recalculate the offset when n=6 (for second half PRB)
// if number RBs in bandwidth is odd and current PRB contains DC, we need to recalculate the offset when n=6 (for second half PRB)
...
@@ -294,7 +346,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
...
@@ -294,7 +346,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
#ifdef DEBUG_NR_PUCCH_RX
#ifdef DEBUG_NR_PUCCH_RX
printf
(
"
\t
[nr_generate_pucch1] mapping PUCCH to RE
\t
amp=%d
\t
ofdm_symbol_size=%d
\t
N_RB_DL=%d
\t
first_carrier_offset=%d
\t
z_pucch[%d]=txptr(%d)=(x_n(l=%d,n=%d)=(%d,%d))
\n
"
,
printf
(
"
\t
[nr_generate_pucch1] mapping PUCCH to RE
\t
amp=%d
\t
ofdm_symbol_size=%d
\t
N_RB_DL=%d
\t
first_carrier_offset=%d
\t
z_pucch[%d]=txptr(%d)=(x_n(l=%d,n=%d)=(%d,%d))
\n
"
,
amp
,
frame_parms
->
ofdm_symbol_size
,
frame_parms
->
N_RB_DL
,
frame_parms
->
first_carrier_offset
,
i
+
n
,
re_offset
,
amp
,
frame_parms
->
ofdm_symbol_size
,
frame_parms
->
N_RB_DL
,
frame_parms
->
first_carrier_offset
,
i
+
n
,
re_offset
,
l
,
n
,((
int16_t
*
)
&
txdataF
[
0
][
re_offset
])[
0
],((
int16_t
*
)
&
t
xdataF
[
0
][
re_offset
])[
1
]);
l
,
n
,((
int16_t
*
)
&
rxdataF
[
0
][
re_offset
])[
0
],((
int16_t
*
)
&
r
xdataF
[
0
][
re_offset
])[
1
]);
#endif
#endif
}
}
...
@@ -305,7 +357,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
...
@@ -305,7 +357,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
#ifdef DEBUG_NR_PUCCH_RX
#ifdef DEBUG_NR_PUCCH_RX
printf
(
"
\t
[nr_generate_pucch1] mapping DM-RS to RE
\t
amp=%d
\t
ofdm_symbol_size=%d
\t
N_RB_DL=%d
\t
first_carrier_offset=%d
\t
z_dm-rs[%d]=txptr(%d)=(x_n(l=%d,n=%d)=(%d,%d))
\n
"
,
printf
(
"
\t
[nr_generate_pucch1] mapping DM-RS to RE
\t
amp=%d
\t
ofdm_symbol_size=%d
\t
N_RB_DL=%d
\t
first_carrier_offset=%d
\t
z_dm-rs[%d]=txptr(%d)=(x_n(l=%d,n=%d)=(%d,%d))
\n
"
,
amp
,
frame_parms
->
ofdm_symbol_size
,
frame_parms
->
N_RB_DL
,
frame_parms
->
first_carrier_offset
,
i
+
n
,
re_offset
,
amp
,
frame_parms
->
ofdm_symbol_size
,
frame_parms
->
N_RB_DL
,
frame_parms
->
first_carrier_offset
,
i
+
n
,
re_offset
,
l
,
n
,((
int16_t
*
)
&
txdataF
[
0
][
re_offset
])[
0
],((
int16_t
*
)
&
t
xdataF
[
0
][
re_offset
])[
1
]);
l
,
n
,((
int16_t
*
)
&
rxdataF
[
0
][
re_offset
])[
0
],((
int16_t
*
)
&
r
xdataF
[
0
][
re_offset
])[
1
]);
#endif
#endif
// printf("l=%d\ti=%d\tre_offset=%d\treceived dmrs re=%d\tim=%d\n",l,i,re_offset,z_dmrs_re_rx[i+n],z_dmrs_im_rx[i+n]);
// printf("l=%d\ti=%d\tre_offset=%d\treceived dmrs re=%d\tim=%d\n",l,i,re_offset,z_dmrs_re_rx[i+n],z_dmrs_im_rx[i+n]);
}
}
...
@@ -416,7 +468,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
...
@@ -416,7 +468,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
mprime
,
m
,
n
,
(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
,
mprime
,
m
,
n
,
(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
,
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_re
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_im
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_re
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_im
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_im
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_re
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_im
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_re
[
n
],
z_re
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
],
z_im
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
]);
z_re
_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
],
z_im_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
]);
#endif
#endif
// multiplying with conjugate of low papr sequence
// multiplying with conjugate of low papr sequence
z_re_temp
=
(
int16_t
)(((((
int32_t
)(
r_u_v_alpha_delta_re
[
n
])
*
z_re_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
])
>>
15
)
z_re_temp
=
(
int16_t
)(((((
int32_t
)(
r_u_v_alpha_delta_re
[
n
])
*
z_re_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
])
>>
15
)
...
@@ -450,7 +502,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
...
@@ -450,7 +502,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
mprime
,
m
,
n
,
(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
,
mprime
,
m
,
n
,
(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
,
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_re
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_im
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_re
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_im
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_im
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_re
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_im
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_re
[
n
],
z_dmrs_re
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
],
z_dmrs_im
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
]);
z_dmrs_re
_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
],
z_dmrs_im_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
]);
#endif
#endif
//finding channel coeffcients by dividing received dmrs with actual dmrs and storing them in z_dmrs_re_rx and z_dmrs_im_rx arrays
//finding channel coeffcients by dividing received dmrs with actual dmrs and storing them in z_dmrs_re_rx and z_dmrs_im_rx arrays
z_dmrs_re_temp
=
(
int16_t
)(((((
int32_t
)(
r_u_v_alpha_delta_dmrs_re
[
n
])
*
z_dmrs_re_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_DMRS_1
)
+
(
m
*
12
)
+
n
])
>>
15
)
z_dmrs_re_temp
=
(
int16_t
)(((((
int32_t
)(
r_u_v_alpha_delta_dmrs_re
[
n
])
*
z_dmrs_re_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_DMRS_1
)
+
(
m
*
12
)
+
n
])
>>
15
)
...
@@ -501,7 +553,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
...
@@ -501,7 +553,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
mprime
,
m
,
n
,
(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
,
mprime
,
m
,
n
,
(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
,
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_re
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_im
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_re
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_im
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_im
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_re
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_im
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
y_n_re
[
n
],
z_re
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
],
z_im
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
]);
z_re
_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
],
z_im_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
]);
#endif
#endif
z_re_temp
=
(
int16_t
)(((((
int32_t
)(
r_u_v_alpha_delta_re
[
n
])
*
z_re_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
])
>>
15
)
z_re_temp
=
(
int16_t
)(((((
int32_t
)(
r_u_v_alpha_delta_re
[
n
])
*
z_re_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
])
>>
15
)
+
(((
int32_t
)(
r_u_v_alpha_delta_im
[
n
])
*
z_im_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
])
>>
15
))
>>
1
);
+
(((
int32_t
)(
r_u_v_alpha_delta_im
[
n
])
*
z_im_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
])
>>
15
))
>>
1
);
...
@@ -529,7 +581,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
...
@@ -529,7 +581,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
mprime
,
m
,
n
,
(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
,
mprime
,
m
,
n
,
(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
,
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_re
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_im
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_re
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_im
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_im
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_re
[
n
],
table_6_3_2_4_1_2_Wi_Re
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_im
[
n
],
table_6_3_2_4_1_2_Wi_Im
[
N_SF_mprime_PUCCH_1
][
w_index
][
m
],
r_u_v_alpha_delta_dmrs_re
[
n
],
z_dmrs_re
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
],
z_dmrs_im
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
]);
z_dmrs_re
_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
],
z_dmrs_im_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_1
)
+
(
m
*
12
)
+
n
]);
#endif
#endif
//finding channel coeffcients by dividing received dmrs with actual dmrs and storing them in z_dmrs_re_rx and z_dmrs_im_rx arrays
//finding channel coeffcients by dividing received dmrs with actual dmrs and storing them in z_dmrs_re_rx and z_dmrs_im_rx arrays
z_dmrs_re_temp
=
(
int16_t
)(((((
int32_t
)(
r_u_v_alpha_delta_dmrs_re
[
n
])
*
z_dmrs_re_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_DMRS_1
)
+
(
m
*
12
)
+
n
])
>>
15
)
z_dmrs_re_temp
=
(
int16_t
)(((((
int32_t
)(
r_u_v_alpha_delta_dmrs_re
[
n
])
*
z_dmrs_re_rx
[(
mprime
*
12
*
N_SF_mprime0_PUCCH_DMRS_1
)
+
(
m
*
12
)
+
n
])
>>
15
)
...
...
openair1/PHY/TOOLS/lte_dfts.c
View file @
7f50a04e
...
@@ -2437,6 +2437,10 @@ static inline void idft16(int16_t *x,int16_t *y)
...
@@ -2437,6 +2437,10 @@ static inline void idft16(int16_t *x,int16_t *y)
#endif
#endif
}
}
void
idft16f
(
int16_t
*
x
,
int16_t
*
y
)
{
idft16
(
x
,
y
);
}
#if defined(__x86_64__) || defined(__i386__)
#if defined(__x86_64__) || defined(__i386__)
#ifdef __AVX2__
#ifdef __AVX2__
// Does two 16-point IDFTS (x[0 .. 15] is 128 LSBs of input vector, x[16..31] is in 128 MSBs)
// Does two 16-point IDFTS (x[0 .. 15] is 128 LSBs of input vector, x[16..31] is in 128 MSBs)
...
...
openair1/PHY/TOOLS/tools_defs.h
View file @
7f50a04e
...
@@ -171,6 +171,8 @@ This function performs optimized fixed-point radix-2 FFT/IFFT.
...
@@ -171,6 +171,8 @@ This function performs optimized fixed-point radix-2 FFT/IFFT.
);
);
*/
*/
void
idft16f
(
int16_t
*
x
,
int16_t
*
y
);
void
idft1536
(
int16_t
*
sigF
,
int16_t
*
sig
,
int
scale
);
void
idft1536
(
int16_t
*
sigF
,
int16_t
*
sig
,
int
scale
);
void
idft6144
(
int16_t
*
sigF
,
int16_t
*
sig
,
int
scale
);
void
idft6144
(
int16_t
*
sigF
,
int16_t
*
sig
,
int
scale
);
...
...
openair1/SIMULATION/NR_PHY/pucchsim.c
View file @
7f50a04e
...
@@ -454,8 +454,6 @@ int main(int argc, char **argv)
...
@@ -454,8 +454,6 @@ int main(int argc, char **argv)
for
(
SNR
=
snr0
;
SNR
<=
snr1
;
SNR
=
SNR
+
1
){
for
(
SNR
=
snr0
;
SNR
<=
snr1
;
SNR
=
SNR
+
1
){
ack_nack_errors
=
0
;
ack_nack_errors
=
0
;
n_errors
=
0
;
n_errors
=
0
;
sigma2_dB
=
20
*
log10
((
double
)
amp
/
32767
)
-
SNR
;
sigma2
=
pow
(
10
,
sigma2_dB
/
10
);
for
(
trial
=
0
;
trial
<
n_trials
;
trial
++
)
{
for
(
trial
=
0
;
trial
<
n_trials
;
trial
++
)
{
bzero
(
txdata
[
0
],
frame_length_complex_samples
*
sizeof
(
int
));
bzero
(
txdata
[
0
],
frame_length_complex_samples
*
sizeof
(
int
));
if
(
format
==
0
){
if
(
format
==
0
){
...
@@ -464,7 +462,11 @@ int main(int argc, char **argv)
...
@@ -464,7 +462,11 @@ int main(int argc, char **argv)
else
{
else
{
nr_generate_pucch1
(
UE
,
txdata
,
frame_parms
,
UE
->
pucch_config_dedicated
,
actual_payload
,
amp
,
nr_tti_tx
,
m0
,
nrofSymbols
,
startingSymbolIndex
,
startingPRB
,
startingPRB_intraSlotHopping
,
0
,
nr_bit
);
nr_generate_pucch1
(
UE
,
txdata
,
frame_parms
,
UE
->
pucch_config_dedicated
,
actual_payload
,
amp
,
nr_tti_tx
,
m0
,
nrofSymbols
,
startingSymbolIndex
,
startingPRB
,
startingPRB_intraSlotHopping
,
0
,
nr_bit
);
}
}
for
(
i
=
0
;
i
<
frame_length_complex_samples
;
i
++
)
{
int
tx_lev
=
signal_energy
(
sigma2_dB
=
20
*
log10
((
double
)
amp
/
32767
)
-
SNR
;
sigma2
=
pow
(
10
,
sigma2_dB
/
10
);
for
(
i
=
(
nr_tti_tx
*
frame_parms
->
samples_per_slot
;
i
<
(
nr_tti_tx
+
1
)
*
frame_parms
->
samples_per_slot
;
i
++
)
{
r_re
[
aa
][
i
]
=
((
double
)(((
int16_t
*
)
txdata
[
0
])[(
i
<<
1
)])
/
32767
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
));
r_re
[
aa
][
i
]
=
((
double
)(((
int16_t
*
)
txdata
[
0
])[(
i
<<
1
)])
/
32767
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
));
r_im
[
aa
][
i
]
=
((
double
)(((
int16_t
*
)
txdata
[
0
])[(
i
<<
1
)
+
1
])
/
32767
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
));
r_im
[
aa
][
i
]
=
((
double
)(((
int16_t
*
)
txdata
[
0
])[(
i
<<
1
)
+
1
])
/
32767
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
));
r_re
[
aa
][
i
]
=
r_re
[
0
][
i
]
/
(
sqrt
(
sigma2
/
2
)
+
1
);
r_re
[
aa
][
i
]
=
r_re
[
0
][
i
]
/
(
sqrt
(
sigma2
/
2
)
+
1
);
...
@@ -481,13 +483,26 @@ int main(int argc, char **argv)
...
@@ -481,13 +483,26 @@ int main(int argc, char **argv)
((
int16_t
*
)
txdata
[
aa
])[(
i
<<
1
)
+
1
]
=
(
int16_t
)
round
(
r_im
[
aa
][
i
]
*
32767
);
((
int16_t
*
)
txdata
[
aa
])[(
i
<<
1
)
+
1
]
=
(
int16_t
)
round
(
r_im
[
aa
][
i
]
*
32767
);
}
}
if
(
format
==
0
){
if
(
format
==
0
){
nr_decode_pucch0
(
txdata
,
PUCCH_GroupHopping
,
n_id
,
&
(
payload_received
),
frame_parms
,
amp
,
nr_tti_tx
,
m0
,
nrofSymbols
,
startingSymbolIndex
,
startingPRB
,
nr_bit
);
nfapi_nr_uci_pucch_pdu_format_0_1_t
uci_pdu
;
nfapi_nr_pucch_pdu_t
pucch_pdu
;
pucch_pdu
.
group_hop_flag
=
PUCCH_GroupHopping
&
1
;
pucch_pdu
.
sequence_hop_flag
=
(
PUCCH_GroupHopping
>>
1
)
&
1
;
pucch_pdu
.
bit_len_harq
=
nr_bit
;
pucch_pdu
.
sr_flag
=
0
;
pucch_pdu
.
nr_of_symbols
=
nrofSymbols
;
pucch_pdu
.
hopping_id
=
n_id
;
pucch_pdu
.
initial_cyclic_shift
=
0
;
pucch_pdu
.
start_symbol_index
=
startingSymbolIndex
;
pucch_pdu
.
prb_start
=
startingPRB
;
nr_decode_pucch0
(
txdata
,
frame_parms
,
nr_tti_tx
,
&
uci_pdu
,
&
pucch_pdu
);
if
(
nr_bit
==
1
)
if
(
nr_bit
==
1
)
ack_nack_errors
+=
(
((
actual_payload
^
payload_received
)
&
2
)
>>
1
);
ack_nack_errors
+=
(
actual_payload
^
uci_pdu
.
harq
->
harq_list
[
0
].
harq_value
);
else
else
ack_nack_errors
+=
(((
actual_payload
^
payload_received
)
&
2
)
>>
1
)
+
(((
actual_payload
^
payload_received
)
&
4
)
>>
2
);
ack_nack_errors
+=
((
actual_payload
^
uci_pdu
.
harq
->
harq_list
[
0
].
harq_value
)
+
((
actual_payload
>>
1
)
^
uci_pdu
.
harq
->
harq_list
[
1
].
harq_value
));
free
(
uci_pdu
.
harq
->
harq_list
);
}
}
else
{
else
{
nr_decode_pucch1
(
txdata
,
PUCCH_GroupHopping
,
n_id
,
&
(
payload_received
),
frame_parms
,
amp
,
nr_tti_tx
,
m0
,
nrofSymbols
,
startingSymbolIndex
,
startingPRB
,
startingPRB_intraSlotHopping
,
timeDomainOCC
,
nr_bit
);
nr_decode_pucch1
(
txdata
,
PUCCH_GroupHopping
,
n_id
,
&
(
payload_received
),
frame_parms
,
amp
,
nr_tti_tx
,
m0
,
nrofSymbols
,
startingSymbolIndex
,
startingPRB
,
startingPRB_intraSlotHopping
,
timeDomainOCC
,
nr_bit
);
if
(
nr_bit
==
1
)
if
(
nr_bit
==
1
)
ack_nack_errors
+=
((
actual_payload
^
payload_received
)
&
1
);
ack_nack_errors
+=
((
actual_payload
^
payload_received
)
&
1
);
...
@@ -496,8 +511,7 @@ int main(int argc, char **argv)
...
@@ -496,8 +511,7 @@ int main(int argc, char **argv)
}
}
n_errors
=
((
actual_payload
^
payload_received
)
&
1
)
+
(((
actual_payload
^
payload_received
)
&
2
)
>>
1
)
+
(((
actual_payload
^
payload_received
)
&
4
)
>>
2
)
+
n_errors
;
n_errors
=
((
actual_payload
^
payload_received
)
&
1
)
+
(((
actual_payload
^
payload_received
)
&
2
)
>>
1
)
+
(((
actual_payload
^
payload_received
)
&
4
)
>>
2
)
+
n_errors
;
}
}
printf
(
"Decoded payload is %ld
\n
"
,
payload_received
);
printf
(
"SNR=%f, n_trials=%d, n_bit_errors=%d
\n
"
,
SNR
,
n_trials
,
ack_nack_errors
);
printf
(
"SNR=%f, n_trials=%d, n_bit_errors=%d
\n
"
,
SNR
,
n_trials
,
n_errors
);
if
((
float
)
ack_nack_errors
/
(
float
)(
nr_bit
*
n_trials
)
<=
target_error_rate
){
if
((
float
)
ack_nack_errors
/
(
float
)(
nr_bit
*
n_trials
)
<=
target_error_rate
){
printf
(
"PUCCH test OK
\n
"
);
printf
(
"PUCCH test OK
\n
"
);
break
;
break
;
...
...
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