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
fd5a124c
Commit
fd5a124c
authored
Feb 13, 2023
by
laurent
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
try to make a piece of code a bit more decent, no functional change
parent
88cbf8c9
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
130 additions
and
197 deletions
+130
-197
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+130
-193
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+0
-4
No files found.
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
View file @
fd5a124c
...
...
@@ -1683,34 +1683,27 @@ void nr_dlsch_detection_mrc(uint32_t rx_size_symbol,
* Compute the complex addition x=x+y
*
* */
void
nr_a_sum_b
(
__m128i
*
input_x
,
__m128i
*
input_y
,
unsigned
short
nb_rb
)
void
nr_a_sum_b
(
c16_t
*
input_x
,
c16_t
*
input_y
,
unsigned
short
nb_rb
)
{
unsigned
short
rb
;
__m128i
*
x
=
(
__m128i
*
)
input_x
;
__m128i
*
y
=
(
__m128i
*
)
input_y
;
for
(
rb
=
0
;
rb
<
nb_rb
;
rb
++
)
{
x
[
0
]
=
_mm_adds_epi16
(
x
[
0
],
y
[
0
]);
x
[
1
]
=
_mm_adds_epi16
(
x
[
1
],
y
[
1
]);
x
[
2
]
=
_mm_adds_epi16
(
x
[
2
],
y
[
2
]);
input_x
[
0
]
=
_mm_adds_epi16
(
input_x
[
0
],
input_y
[
0
]);
input_x
[
1
]
=
_mm_adds_epi16
(
input_x
[
1
],
input_y
[
1
]);
input_x
[
2
]
=
_mm_adds_epi16
(
input_x
[
2
],
input_y
[
2
]);
input_x
+=
3
;
input_y
+=
3
;
x
+=
3
;
y
+=
3
;
}
_mm_empty
();
_m_empty
();
}
/* Zero Forcing Rx function: nr_a_mult_b()
* Compute the complex Multiplication c=a*b
*
* */
void
nr_a_mult_b
(
int
*
a
,
int
*
b
,
int32_t
*
c
,
unsigned
short
nb_rb
,
unsigned
char
output_shift0
)
void
nr_a_mult_b
(
c16_t
*
a
,
c16_t
*
b
,
c16_t
*
c
,
unsigned
short
nb_rb
,
unsigned
char
output_shift0
)
{
//This function is used to compute complex multiplications
short
nr_conjugate
[
8
]
__attribute__
((
aligned
(
16
)))
=
{
1
,
-
1
,
1
,
-
1
,
1
,
-
1
,
1
,
-
1
};
...
...
@@ -1748,75 +1741,58 @@ void nr_a_mult_b(int *a,
b_128
+=
1
;
c_128
+=
1
;
}
_mm_empty
();
_m_empty
();
}
/* Zero Forcing Rx function: nr_element_sign()
* Compute b=sign*a
*
* */
static
inline
void
nr_element_sign
(
int32
_t
*
a
,
// a
int32
_t
*
b
,
// b
static
inline
void
nr_element_sign
(
c16
_t
*
a
,
// a
c16
_t
*
b
,
// b
unsigned
short
nb_rb
,
int32_t
sign
)
{
int16_t
nr_sign
[
8
]
__attribute__
((
aligned
(
16
)))
=
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
}
;
unsigned
short
rb
;
const
int16_t
nr_sign
[
8
]
__attribute__
((
aligned
(
16
)))
=
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
};
__m128i
*
a_128
,
*
b_128
;
a_128
=
(
__m128i
*
)
a
;
b_128
=
(
__m128i
*
)
b
;
for
(
rb
=
0
;
rb
<
3
*
nb_rb
;
rb
++
)
{
for
(
int
rb
=
0
;
rb
<
3
*
nb_rb
;
rb
++
)
{
if
(
sign
<
0
)
b_128
[
0
]
=
_mm_sign_epi16
(
a_128
[
0
],
*
(
__m128i
*
)
&
nr_sign
[
0
]);
b_128
[
rb
]
=
_mm_sign_epi16
(
a_128
[
rb
],
((
__m128i
*
)
nr_sign
)
[
0
]);
else
b_128
[
0
]
=
a_128
[
0
];
b_128
[
rb
]
=
a_128
[
rb
];
#ifdef DEBUG_DLSCH_DEMOD
printf
(
"
\n
Out
\n
"
);
//print_ints("det_re_128:",(int32_t*)&det_re_128);
//print_ints("det_im_128:",(int32_t*)&det_im_128);
print_shorts
(
"b:"
,
(
int16_t
*
)
b_128
);
print_shorts
(
"b:"
,
(
int16_t
*
)
b_128
);
#endif
a_128
+=
1
;
b_128
+=
1
;
}
_mm_empty
();
_m_empty
();
}
/* Zero Forcing Rx function: nr_det_4x4()
* Compute the matrix determinant for 4x4 Matrix
*
* */
void
nr_determin
(
int32_t
**
a44
,
//
int32_t
*
ad_bc
,
//ad-bc
int32_t
size
,
unsigned
short
nb_rb
,
int32_t
sign
,
int32_t
shift0
)
static
void
nr_determin
(
int
size
,
c16_t
*
a44
[][
size
],
//
c16_t
*
ad_bc
,
// ad-bc
unsigned
short
nb_rb
,
int32_t
sign
,
int32_t
shift0
)
{
int32_t
outtemp
[
12
*
nb_rb
]
__attribute__
((
aligned
(
32
)));
int32_t
outtemp1
[
12
*
nb_rb
]
__attribute__
((
aligned
(
32
)));
int32_t
**
sub_matrix
;
AssertFatal
(
size
>
0
,
""
);
if
(
size
==
1
)
{
nr_element_sign
(
a44
[
0
]
,
//
a
ad_bc
,
//
b
nr_element_sign
(
a44
[
0
]
[
0
],
//
a
ad_bc
,
//
b
nb_rb
,
sign
);
}
else
{
int16_t
k
,
rr
[
size
-
1
],
cc
[
size
-
1
];
sub_matrix
=
(
int32_t
**
)
malloc16_clear
((
size
-
1
)
*
(
size
-
1
)
*
sizeof
(
int32_t
*
));
for
(
int
rtx
=
0
;
rtx
<
(
size
-
1
);
rtx
++
)
{
// row
for
(
int
ctx
=
0
;
ctx
<
(
size
-
1
);
ctx
++
)
{
// column
sub_matrix
[
ctx
*
(
size
-
1
)
+
rtx
]
=
(
int32_t
*
)
malloc16_clear
(
12
*
nb_rb
*
sizeof
(
int32_t
));
}
}
c16_t
outtemp
[
12
*
nb_rb
]
__attribute__
((
aligned
(
32
)));
c16_t
outtemp1
[
12
*
nb_rb
]
__attribute__
((
aligned
(
32
)));
c16_t
*
sub_matrix
[
size
-
1
][
size
-
1
];
for
(
int
rtx
=
0
;
rtx
<
size
;
rtx
++
)
{
//row calculation for determin
int
ctx
=
0
;
//find the submatrix row and column indices
...
...
@@ -1826,42 +1802,38 @@ void nr_determin(int32_t **a44,//
k
=
0
;
for
(
int
cctx
=
0
;
cctx
<
size
;
cctx
++
)
if
(
cctx
!=
ctx
)
cc
[
k
++
]
=
cctx
;
//fill out the sub matrix corresponds to this element
for
(
int
ridx
=
0
;
ridx
<
(
size
-
1
);
ridx
++
)
for
(
int
cidx
=
0
;
cidx
<
(
size
-
1
);
cidx
++
)
sub_matrix
[
cidx
*
(
size
-
1
)
+
ridx
]
=
(
int32_t
*
)
&
a44
[
cc
[
cidx
]
*
size
+
rr
[
ridx
]][
0
];
nr_determin
(
sub_matrix
,
//a33
outtemp
,
size
-
1
,
nb_rb
,
((
rtx
&
1
)
==
1
?-
1
:
1
)
*
((
ctx
&
1
)
==
1
?-
1
:
1
)
*
sign
,
shift0
);
nr_a_mult_b
(
a44
[
ctx
*
size
+
rtx
],
outtemp
,
rtx
==
0
?
ad_bc
:
outtemp1
,
nb_rb
,
shift0
);
if
(
rtx
!=
0
)
nr_a_sum_b
((
__m128i
*
)
ad_bc
,
(
__m128i
*
)
outtemp1
,
nb_rb
);
// fill out the sub matrix corresponds to this element
for
(
int
ridx
=
0
;
ridx
<
(
size
-
1
);
ridx
++
)
for
(
int
cidx
=
0
;
cidx
<
(
size
-
1
);
cidx
++
)
sub_matrix
[
cidx
][
ridx
]
=
a44
[
cc
[
cidx
]][
rr
[
ridx
]];
nr_determin
(
size
-
1
,
sub_matrix
,
// a33
outtemp
,
nb_rb
,
((
rtx
&
1
)
==
1
?
-
1
:
1
)
*
((
ctx
&
1
)
==
1
?
-
1
:
1
)
*
sign
,
shift0
);
nr_a_mult_b
(
a44
[
ctx
][
rtx
],
outtemp
,
rtx
==
0
?
ad_bc
:
outtemp1
,
nb_rb
,
shift0
);
if
(
rtx
!=
0
)
nr_a_sum_b
(
ad_bc
,
outtemp1
,
nb_rb
);
}
}
}
double
complex
nr_determin_cpx
(
double
complex
*
a44_cpx
,
//
int32_t
size
,
//size
int32_t
sign
){
static
double
complex
nr_determin_cpx
(
int32_t
size
,
// size
double
complex
a44_cpx
[][
size
],
//
int32_t
sign
)
{
double
complex
outtemp
,
outtemp1
;
//Allocate the submatrix elements
double
complex
sub_matrix
[(
size
-
1
)
*
(
size
-
1
)];
int16_t
k
,
rr
[
size
-
1
],
cc
[
size
-
1
];
DevAssert
(
size
>
0
);
if
(
size
==
1
)
{
return
((
double
complex
)
a44_cpx
[
0
]
*
sign
);
return
(
a44_cpx
[
0
][
0
]
*
sign
);
}
else
{
double
complex
sub_matrix
[
size
-
1
][
size
-
1
];
int16_t
k
,
rr
[
size
-
1
],
cc
[
size
-
1
];
outtemp1
=
0
;
for
(
int
rtx
=
0
;
rtx
<
size
;
rtx
++
)
{
//row calculation for determin
int
ctx
=
0
;
...
...
@@ -1875,12 +1847,12 @@ double complex nr_determin_cpx(double complex *a44_cpx,//
//fill out the sub matrix corresponds to this element
for
(
int
ridx
=
0
;
ridx
<
(
size
-
1
);
ridx
++
)
for
(
int
cidx
=
0
;
cidx
<
(
size
-
1
);
cidx
++
)
sub_matrix
[
cidx
*
(
size
-
1
)
+
ridx
]
=
a44_cpx
[
cc
[
cidx
]
*
size
+
rr
[
ridx
]];
sub_matrix
[
cidx
][
ridx
]
=
a44_cpx
[
cc
[
cidx
]][
rr
[
ridx
]];
outtemp
=
nr_determin_cpx
(
s
ub_matrix
,
//a33
size
-
1
,
((
rtx
&
1
)
==
1
?-
1
:
1
)
*
((
ctx
&
1
)
==
1
?-
1
:
1
)
*
sign
);
outtemp1
+=
a44_cpx
[
ctx
*
size
+
rtx
]
*
outtemp
;
outtemp
=
nr_determin_cpx
(
s
ize
-
1
,
sub_matrix
,
// a33
((
rtx
&
1
)
==
1
?
-
1
:
1
)
*
((
ctx
&
1
)
==
1
?
-
1
:
1
)
*
sign
);
outtemp1
+=
a44_cpx
[
ctx
][
rtx
]
*
outtemp
;
}
return
((
double
complex
)
outtemp1
);
...
...
@@ -1891,30 +1863,30 @@ double complex nr_determin_cpx(double complex *a44_cpx,//
* Compute the matrix inverse and determinant up to 4x4 Matrix
*
* */
uint8_t
nr_matrix_inverse
(
int32_t
**
a44
,
//Input matrix//conjH_H_elements[0]
int32_t
**
inv_H_h_H
,
//Inverse
int32_t
*
ad_bc
,
//determin
int32_t
size
,
uint8_t
nr_matrix_inverse
(
int32_t
size
,
c16_t
*
a44
[][
size
],
// Input matrix//conjH_H_elements[0]
c16_t
*
inv_H_h_H
[][
size
],
// Inverse
c16_t
*
ad_bc
,
// determin
unsigned
short
nb_rb
,
int32_t
flag
,
//fixed point or floating flag
int32_t
shift0
){
int32_t
flag
,
// fixed point or floating flag
int32_t
shift0
)
{
DevAssert
(
size
>
1
);
int16_t
k
,
rr
[
size
-
1
],
cc
[
size
-
1
];
if
(
flag
)
{
//fixed point SIMD calc.
//Allocate the submatrix elements
int32_t
**
sub_matrix
;
sub_matrix
=
(
int32_t
**
)
malloc16_clear
(
(
size
-
1
)
*
(
size
-
1
)
*
sizeof
(
int32_t
*
)
);
for
(
int
rtx
=
0
;
rtx
<
(
size
-
1
);
rtx
++
)
{
//row
for
(
int
ctx
=
0
;
ctx
<
(
size
-
1
);
ctx
++
)
{
//column
sub_matrix
[
ctx
*
(
size
-
1
)
+
rtx
]
=
(
int32_t
*
)
malloc16_clear
(
12
*
nb_rb
*
sizeof
(
int32_t
)
);
}
}
c16_t
sub_matrix_data
[
size
-
1
][
size
-
1
][
12
*
nb_rb
];
memset
(
sub_matrix_data
,
0
,
sizeof
(
sub_matrix_data
));
c16_t
*
sub_matrix
[
size
-
1
][
size
-
1
];
for
(
int
rtx
=
0
;
rtx
<
(
size
-
1
);
rtx
++
)
for
(
int
ctx
=
0
;
ctx
<
(
size
-
1
);
ctx
++
)
sub_matrix
[
ctx
][
rtx
]
=
sub_matrix_data
[
ctx
][
rtx
];
//Compute Matrix determinant
nr_determin
(
a44
,
//
a
d_bc
,
//determinant
size
,
//size
nr_determin
(
size
,
a
44
,
//
ad_bc
,
// determinant
nb_rb
,
+
1
,
shift0
);
...
...
@@ -1941,39 +1913,36 @@ uint8_t nr_matrix_inverse(int32_t **a44,//Input matrix//conjH_H_elements[0]
//fill out the sub matrix corresponds to this element
for
(
int
ridx
=
0
;
ridx
<
(
size
-
1
);
ridx
++
)
for
(
int
cidx
=
0
;
cidx
<
(
size
-
1
);
cidx
++
)
sub_matrix
[
cidx
*
(
size
-
1
)
+
ridx
]
=
(
int32_t
*
)
&
a44
[
cc
[
cidx
]
*
size
+
rr
[
ridx
]][
0
]
;
memcpy
(
sub_matrix
[
cidx
][
ridx
],
a44
[
cc
[
cidx
]][
rr
[
ridx
]],
sizeof
(
sub_matrix_data
[
cidx
][
ridx
]))
;
nr_determin
(
s
ub_matrix
,
inv_H_h_H
[
rtx
*
size
+
ctx
],
//out transpose
size
-
1
,
//siz
e
nr_determin
(
s
ize
-
1
,
// size
sub_matrix
,
inv_H_h_H
[
rtx
][
ctx
],
// out transpos
e
nb_rb
,
((
rtx
&
1
)
==
1
?-
1
:
1
)
*
((
ctx
&
1
)
==
1
?-
1
:
1
),
((
rtx
&
1
)
==
1
?
-
1
:
1
)
*
((
ctx
&
1
)
==
1
?
-
1
:
1
),
shift0
);
//printf("H_h_H(r%d,c%d)=%d+j%d --> inv_H_h_H(%d,%d) = %d+j%d \n",rtx,ctx,((short *)a44[ctx*size+rtx])[0],((short *)a44[ctx*size+rtx])[1],ctx,rtx,((short *)inv_H_h_H[rtx*size+ctx])[0],((short *)inv_H_h_H[rtx*size+ctx])[1]);
}
}
_mm_empty
();
_m_empty
();
}
else
{
//floating point calc.
//Allocate the submatrix elements
double
complex
sub_matrix_cpx
[
(
size
-
1
)
*
(
size
-
1
)
];
double
complex
sub_matrix_cpx
[
size
-
1
][
size
-
1
];
//Convert the IQ samples (in Q15 format) to float complex
double
complex
a44_cpx
[
size
*
size
];
double
complex
inv_H_h_H_cpx
[
size
*
size
];
double
complex
a44_cpx
[
size
][
size
];
double
complex
inv_H_h_H_cpx
[
size
][
size
];
double
complex
determin_cpx
;
for
(
int
i
=
0
;
i
<
12
*
nb_rb
;
i
++
)
{
//Convert Q15 to floating point
for
(
int
rtx
=
0
;
rtx
<
size
;
rtx
++
)
{
//row
for
(
int
ctx
=
0
;
ctx
<
size
;
ctx
++
)
{
//column
a44_cpx
[
ctx
*
size
+
rtx
]
=
((
double
)((
short
*
)
a44
[
ctx
*
size
+
rtx
])[(
i
<<
1
)])
/
(
1
<<
(
shift0
-
1
))
+
I
*
((
double
)((
short
*
)
a44
[
ctx
*
size
+
rtx
])[(
i
<<
1
)
+
1
])
/
(
1
<<
(
shift0
-
1
));
a44_cpx
[
ctx
][
rtx
]
=
((
double
)(
a44
[
ctx
][
rtx
])[
i
].
r
)
/
(
1
<<
(
shift0
-
1
))
+
I
*
((
double
)(
a44
[
ctx
][
rtx
])[
i
].
i
)
/
(
1
<<
(
shift0
-
1
));
//if (i<4) printf("a44_cpx(%d,%d)= ((FP %d))%lf+(FP %d)j%lf \n",ctx,rtx,((short *)a44[ctx*size+rtx])[(i<<1)],creal(a44_cpx[ctx*size+rtx]),((short *)a44[ctx*size+rtx])[(i<<1)+1],cimag(a44_cpx[ctx*size+rtx]));
}
}
//Compute Matrix determinant (copy real value only)
determin_cpx
=
nr_determin_cpx
(
a44_cpx
,
//
size
,
//size
determin_cpx
=
nr_determin_cpx
(
size
,
a44_cpx
,
//
+
1
);
//if (i<4) printf("order %d nr_det_cpx = %lf+j%lf \n",log2_approx(creal(determin_cpx)),creal(determin_cpx),cimag(determin_cpx));
...
...
@@ -1999,22 +1968,22 @@ uint8_t nr_matrix_inverse(int32_t **a44,//Input matrix//conjH_H_elements[0]
//fill out the sub matrix corresponds to this element
for
(
int
ridx
=
0
;
ridx
<
(
size
-
1
);
ridx
++
)
for
(
int
cidx
=
0
;
cidx
<
(
size
-
1
);
cidx
++
)
sub_matrix_cpx
[
cidx
*
(
size
-
1
)
+
ridx
]
=
a44_cpx
[
cc
[
cidx
]
*
size
+
rr
[
ridx
]];
sub_matrix_cpx
[
cidx
][
ridx
]
=
a44_cpx
[
cc
[
cidx
]][
rr
[
ridx
]];
inv_H_h_H_cpx
[
rtx
*
size
+
ctx
]
=
nr_determin_cpx
(
sub_matrix_cpx
,
//
size
-
1
,
//size
((
rtx
&
1
)
==
1
?-
1
:
1
)
*
((
ctx
&
1
)
==
1
?-
1
:
1
));
inv_H_h_H_cpx
[
rtx
][
ctx
]
=
nr_determin_cpx
(
size
-
1
,
// size,
sub_matrix_cpx
,
//
((
rtx
&
1
)
==
1
?
-
1
:
1
)
*
((
ctx
&
1
)
==
1
?
-
1
:
1
));
//if (i==0) printf("H_h_H(r%d,c%d)=%lf+j%lf --> inv_H_h_H(%d,%d) = %lf+j%lf \n",rtx,ctx,creal(a44_cpx[ctx*size+rtx]),cimag(a44_cpx[ctx*size+rtx]),ctx,rtx,creal(inv_H_h_H_cpx[rtx*size+ctx]),cimag(inv_H_h_H_cpx[rtx*size+ctx]));
if
(
creal
(
inv_H_h_H_cpx
[
rtx
*
size
+
ctx
])
>
0
)
((
short
*
)
inv_H_h_H
[
rtx
*
size
+
ctx
])[
i
<<
1
]
=
(
short
)
((
creal
(
inv_H_h_H_cpx
[
rtx
*
size
+
ctx
])
*
(
1
<<
(
shift0
-
1
)))
+
0
.
5
);
//
Convert to Q 18
if
(
creal
(
inv_H_h_H_cpx
[
rtx
][
ctx
])
>
0
)
inv_H_h_H
[
rtx
][
ctx
][
i
].
r
=
(
short
)((
creal
(
inv_H_h_H_cpx
[
rtx
][
ctx
])
*
(
1
<<
(
shift0
-
1
)))
+
0
.
5
);
//
Convert to Q 18
else
((
short
*
)
inv_H_h_H
[
rtx
*
size
+
ctx
])[
i
<<
1
]
=
(
short
)
((
creal
(
inv_H_h_H_cpx
[
rtx
*
size
+
ctx
])
*
(
1
<<
(
shift0
-
1
)))
-
0
.
5
);
//
inv_H_h_H
[
rtx
][
ctx
][
i
].
r
=
(
short
)((
creal
(
inv_H_h_H_cpx
[
rtx
][
ctx
])
*
(
1
<<
(
shift0
-
1
)))
-
0
.
5
);
//
if
(
cimag
(
inv_H_h_H_cpx
[
rtx
*
size
+
ctx
])
>
0
)
((
short
*
)
inv_H_h_H
[
rtx
*
size
+
ctx
])[(
i
<<
1
)
+
1
]
=
(
short
)
((
cimag
(
inv_H_h_H_cpx
[
rtx
*
size
+
ctx
])
*
(
1
<<
(
shift0
-
1
)))
+
0
.
5
);
//
if
(
cimag
(
inv_H_h_H_cpx
[
rtx
][
ctx
])
>
0
)
inv_H_h_H
[
rtx
][
ctx
][
i
].
i
=
(
short
)((
cimag
(
inv_H_h_H_cpx
[
rtx
][
ctx
])
*
(
1
<<
(
shift0
-
1
)))
+
0
.
5
);
//
else
((
short
*
)
inv_H_h_H
[
rtx
*
size
+
ctx
])[(
i
<<
1
)
+
1
]
=
(
short
)
((
cimag
(
inv_H_h_H_cpx
[
rtx
*
size
+
ctx
])
*
(
1
<<
(
shift0
-
1
)))
-
0
.
5
);
//
inv_H_h_H
[
rtx
][
ctx
][
i
].
i
=
(
short
)((
cimag
(
inv_H_h_H_cpx
[
rtx
][
ctx
])
*
(
1
<<
(
shift0
-
1
)))
-
0
.
5
);
//
//if (i<4) printf("inv_H_h_H_FP(%d,%d)= %d+j%d \n",ctx,rtx, ((short *) inv_H_h_H[rtx*size+ctx])[i<<1],((short *) inv_H_h_H[rtx*size+ctx])[(i<<1)+1]);
}
...
...
@@ -2090,20 +2059,17 @@ uint8_t nr_zero_forcing_rx(uint32_t rx_size_symbol,
int
length
)
{
int
*
ch0r
,
*
ch0c
;
int32_t
***
conjH_H_elements
;
uint32_t
nb_rb_0
=
length
/
12
+
((
length
%
12
)
?
1
:
0
);
int32_t
determ_fin
[
12
*
nb_rb_0
]
__attribute__
((
aligned
(
32
)));
c16_t
determ_fin
[
12
*
nb_rb_0
]
__attribute__
((
aligned
(
32
)));
///Allocate H^*H matrix elements and sub elements
conjH_H_elements
=
(
int32_t
***
)
malloc16_clear
(
n_rx
*
sizeof
(
int32_t
**
));
for
(
int
aarx
=
0
;
aarx
<
n_rx
;
aarx
++
)
{
conjH_H_elements
[
aarx
]
=
(
int32_t
**
)
malloc16_clear
(
n_tx
*
n_tx
*
sizeof
(
int32_t
*
));
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
{
// row
for
(
int
ctx
=
0
;
ctx
<
n_tx
;
ctx
++
)
{
// column
conjH_H_elements
[
aarx
][
ctx
*
n_tx
+
rtx
]
=
(
int32_t
*
)
malloc16_clear
(
12
*
nb_rb_0
*
sizeof
(
int32_t
));
}
}
}
c16_t
conjH_H_elements_data
[
n_rx
][
n_tx
][
n_tx
][
12
*
nb_rb_0
];
memset
(
conjH_H_elements_data
,
0
,
sizeof
(
conjH_H_elements_data
));
c16_t
*
conjH_H_elements
[
n_rx
][
n_tx
][
n_tx
];
for
(
int
aarx
=
0
;
aarx
<
n_rx
;
aarx
++
)
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
for
(
int
ctx
=
0
;
ctx
<
n_tx
;
ctx
++
)
conjH_H_elements
[
aarx
][
rtx
][
ctx
]
=
conjH_H_elements_data
[
aarx
][
rtx
][
ctx
];
//Compute H^*H matrix elements and sub elements:(1/2^log2_maxh)*conjH_H_elements
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
{
//row
...
...
@@ -2113,65 +2079,60 @@ uint8_t nr_zero_forcing_rx(uint32_t rx_size_symbol,
ch0c
=
(
int
*
)
dl_ch_estimates_ext
[
ctx
*
n_rx
+
aarx
];
nr_conjch0_mult_ch1
(
ch0r
,
ch0c
,
conjH_H_elements
[
aarx
][
ctx
*
n_tx
+
rtx
],
(
int32_t
*
)
conjH_H_elements
[
aarx
][
ctx
][
rtx
],
// sic
nb_rb_0
,
shift
);
if
(
aarx
!=
0
)
nr_a_sum_b
((
__m128i
*
)
conjH_H_elements
[
0
][
ctx
*
n_tx
+
rtx
],
(
__m128i
*
)
conjH_H_elements
[
aarx
][
ctx
*
n_tx
+
rtx
],
nb_rb_0
);
if
(
aarx
!=
0
)
nr_a_sum_b
(
conjH_H_elements
[
0
][
ctx
][
rtx
],
conjH_H_elements
[
aarx
][
ctx
][
rtx
],
nb_rb_0
);
}
}
}
//Compute the inverse and determinant of the H^*H matrix
//Allocate the inverse matrix
int32_t
**
inv_H_h_H
;
inv_H_h_H
=
(
int32_t
**
)
malloc16_clear
(
n_tx
*
n_tx
*
sizeof
(
int32_t
*
))
;
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
{
// row
for
(
int
ctx
=
0
;
ctx
<
n_tx
;
ctx
++
)
{
// column
inv_H_h_H
[
ctx
*
n_tx
+
rtx
]
=
(
int32_t
*
)
malloc16_clear
(
12
*
nb_rb_0
*
sizeof
(
int32_t
));
}
}
c16_t
*
inv_H_h_H
[
n_tx
][
n_tx
]
;
c16_t
inv_H_h_H_data
[
n_tx
][
n_tx
][
12
*
nb_rb_0
]
;
memset
(
inv_H_h_H_data
,
0
,
sizeof
(
inv_H_h_H_data
));
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
for
(
int
ctx
=
0
;
ctx
<
n_tx
;
ctx
++
)
inv_H_h_H
[
ctx
][
rtx
]
=
inv_H_h_H_data
[
ctx
][
rtx
];
int
fp_flag
=
1
;
//0: float point calc 1: Fixed point calc
nr_matrix_inverse
(
conjH_H_elements
[
0
],
//Input matrix
inv_H_h_H
,
//Inverse
determ_fin
,
//determin
n_tx
,
//size
nr_matrix_inverse
(
n_tx
,
conjH_H_elements
[
0
],
// Input matrix
inv_H_h_H
,
// Inverse
determ_fin
,
// determin
nb_rb_0
,
fp_flag
,
//
fixed point flag
shift
-
(
fp_flag
==
1
?
2
:
0
));
//
the out put is Q15
fp_flag
,
//
fixed point flag
shift
-
(
fp_flag
==
1
?
2
:
0
));
//
the out put is Q15
// multiply Matrix inversion pf H_h_H by the rx signal vector
int32_t
outtemp
[
12
*
nb_rb_0
]
__attribute__
((
aligned
(
32
)));
int32_t
**
rxdataF_zforcing
;
c16_t
outtemp
[
12
*
nb_rb_0
]
__attribute__
((
aligned
(
32
)));
//Allocate rxdataF for zforcing out
rxdataF_zforcing
=
(
int32_t
**
)
malloc16_clear
(
n_tx
*
sizeof
(
int32_t
*
));
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
{
// row
rxdataF_zforcing
[
rtx
]
=
(
int32_t
*
)
malloc16_clear
(
12
*
nb_rb_0
*
sizeof
(
int32_t
));
}
c16_t
rxdataF_zforcing
[
n_tx
][
12
*
nb_rb_0
];
memset
(
rxdataF_zforcing
,
0
,
sizeof
(
rxdataF_zforcing
));
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
{
//Output Layers row
// loop over Layers rtx=0,...,N_Layers-1
for
(
int
ctx
=
0
;
ctx
<
n_tx
;
ctx
++
)
{
//column multi
//printf("Computing r_%d c_%d\n",rtx,ctx);
//print_shorts(" H_h_H=",(int16_t*)&conjH_H_elements[ctx*n_tx+rtx][0][0]);
//print_shorts(" Inv_H_h_H=",(int16_t*)&inv_H_h_H[ctx*n_tx+rtx][0]);
nr_a_mult_b
(
inv_H_h_H
[
ctx
*
n_tx
+
rtx
],
(
int
*
)(
rxdataF_comp
[
ctx
][
0
]
+
symbol
*
nb_rb
*
12
),
outtemp
,
nb_rb_0
,
shift
-
(
fp_flag
==
1
?
2
:
0
));
nr_a_sum_b
((
__m128i
*
)
rxdataF_zforcing
[
rtx
],
(
__m128i
*
)
outtemp
,
nb_rb_0
);
//a =a + b
}
for
(
int
ctx
=
0
;
ctx
<
n_tx
;
ctx
++
)
{
// column multi
// printf("Computing r_%d c_%d\n",rtx,ctx);
// print_shorts(" H_h_H=",(int16_t*)&conjH_H_elements[ctx*n_tx+rtx][0][0]);
// print_shorts(" Inv_H_h_H=",(int16_t*)&inv_H_h_H[ctx*n_tx+rtx][0]);
nr_a_mult_b
(
inv_H_h_H
[
ctx
][
rtx
],
(
c16_t
*
)(
rxdataF_comp
[
ctx
][
0
]
+
symbol
*
nb_rb
*
12
),
outtemp
,
nb_rb_0
,
shift
-
(
fp_flag
==
1
?
2
:
0
));
nr_a_sum_b
(
rxdataF_zforcing
[
rtx
],
outtemp
,
nb_rb_0
);
// a =a + b
}
#ifdef DEBUG_DLSCH_DEMOD
printf
(
"Computing layer_%d
\n
"
,
rtx
);;
print_shorts
(
" Rx signal:="
,(
int16_t
*
)
&
rxdataF_zforcing
[
rtx
][
0
]);
print_shorts
(
" Rx signal:="
,(
int16_t
*
)
&
rxdataF_zforcing
[
rtx
][
4
]);
print_shorts
(
" Rx signal:="
,(
int16_t
*
)
&
rxdataF_zforcing
[
rtx
][
8
]);
#endif
}
}
//Copy zero_forcing out to output array
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
nr_element_sign
(
rxdataF_zforcing
[
rtx
],
(
in
t
*
)(
rxdataF_comp
[
rtx
][
0
]
+
symbol
*
nb_rb
*
12
),
nb_rb_0
,
+
1
);
nr_element_sign
(
rxdataF_zforcing
[
rtx
],
(
c16_
t
*
)(
rxdataF_comp
[
rtx
][
0
]
+
symbol
*
nb_rb
*
12
),
nb_rb_0
,
+
1
);
//Update LLR thresholds with the Matrix determinant
__m128i
*
dl_ch_mag128_0
=
NULL
,
*
dl_ch_mag128b_0
=
NULL
,
*
dl_ch_mag128r_0
=
NULL
,
*
determ_fin_128
;
...
...
@@ -2225,30 +2186,6 @@ uint8_t nr_zero_forcing_rx(uint32_t rx_size_symbol,
}
}
_mm_empty
();
_m_empty
();
// Memory free
for
(
int
aarx
=
0
;
aarx
<
n_rx
;
aarx
++
)
{
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
{
// row
for
(
int
ctx
=
0
;
ctx
<
n_tx
;
ctx
++
)
{
// column
free
(
conjH_H_elements
[
aarx
][
ctx
*
n_tx
+
rtx
]);
}
}
free
(
conjH_H_elements
[
aarx
]);
}
free
(
conjH_H_elements
);
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
{
// row
for
(
int
ctx
=
0
;
ctx
<
n_tx
;
ctx
++
)
{
// column
free
(
inv_H_h_H
[
ctx
*
n_tx
+
rtx
]);
}
}
free
(
inv_H_h_H
);
for
(
int
rtx
=
0
;
rtx
<
n_tx
;
rtx
++
)
{
// row
free
(
rxdataF_zforcing
[
rtx
]);
}
free
(
rxdataF_zforcing
);
return
0
;
}
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
View file @
fd5a124c
...
...
@@ -386,10 +386,6 @@ void nr_conjch0_mult_ch1(int *ch0,
unsigned
short
nb_rb
,
unsigned
char
output_shift0
);
void
nr_a_sum_b
(
__m128i
*
input_x
,
__m128i
*
input_y
,
unsigned
short
nb_rb
);
/** \brief This is the top-level entry point for DLSCH decoding in UE. It should be replicated on several
threads (on multi-core machines) corresponding to different HARQ processes. The routine first
computes the segmentation information, followed by rate dematching and sub-block deinterleaving the of the
...
...
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