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
ZhouShuya
OpenXG-RAN
Commits
053ccd6b
Commit
053ccd6b
authored
Jul 06, 2018
by
Elena Lukashova
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Extending MRC_TM34 for bigger number of receive and transmit antennas.
parent
9276a4ae
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
96 additions
and
36 deletions
+96
-36
openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
+96
-36
No files found.
openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
View file @
053ccd6b
...
...
@@ -3443,7 +3443,11 @@ void dlsch_detection_mrc_TM34(LTE_DL_FRAME_PARMS *frame_parms,
unsigned
char
dual_stream_UE
)
{
int
i
;
__m128i
*
rxdataF_comp128_0
,
*
rxdataF_comp128_1
,
*
rxdataF_comp128_i0
,
*
rxdataF_comp128_i1
,
*
dl_ch_mag128_0
,
*
dl_ch_mag128_1
,
*
dl_ch_mag128_0b
,
*
dl_ch_mag128_1b
,
*
rho128_0
,
*
rho128_1
,
*
rho128_i0
,
*
rho128_i1
,
*
dl_ch_mag128_i0
,
*
dl_ch_mag128_i1
,
*
dl_ch_mag128_i0b
,
*
dl_ch_mag128_i1b
;
__m128i
*
rxdataF_comp128_0
,
*
rxdataF_comp128_1
;
__m128i
*
dl_ch_mag128_0
,
*
dl_ch_mag128_1
;
__m128i
*
dl_ch_mag128_0b
,
*
dl_ch_mag128_1b
;
__m128i
*
rho128_0
,
*
rho128_1
;
int
**
rxdataF_comp0
=
pdsch_vars
->
rxdataF_comp0
;
int
**
rxdataF_comp1
=
pdsch_vars
->
rxdataF_comp1
[
harq_pid
][
round
];
...
...
@@ -3454,60 +3458,116 @@ void dlsch_detection_mrc_TM34(LTE_DL_FRAME_PARMS *frame_parms,
int
**
dl_ch_magb0
=
pdsch_vars
->
dl_ch_magb0
;
int
**
dl_ch_magb1
=
pdsch_vars
->
dl_ch_magb1
[
harq_pid
][
round
];
if
(
frame_parms
->
nb_antennas_rx
>
1
)
{
rxdataF_comp128_0
=
(
__m128i
*
)
&
rxdataF_comp
0
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rxdataF_comp128_1
=
(
__m128i
*
)
&
rxdataF_comp
0
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_0
=
(
__m128i
*
)
&
dl_ch_mag
0
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_1
=
(
__m128i
*
)
&
dl_ch_mag
0
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_0b
=
(
__m128i
*
)
&
dl_ch_magb0
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_1b
=
(
__m128i
*
)
&
dl_ch_magb0
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rxdataF_comp128_0
=
(
__m128i
*
)
&
rxdataF_comp0
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rxdataF_comp128_1
=
(
__m128i
*
)
&
rxdataF_comp0
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_0
=
(
__m128i
*
)
&
dl_ch_mag
0
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_1
=
(
__m128i
*
)
&
dl_ch_mag
0
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_0b
=
(
__m128i
*
)
&
dl_ch_magb
0
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_1b
=
(
__m128i
*
)
&
dl_ch_magb
0
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rho128_0
=
(
__m128i
*
)
&
dl_ch_rho2_ext
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rho128_1
=
(
__m128i
*
)
&
dl_ch_rho2_ext
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
// MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation)
for
(
i
=
0
;
i
<
nb_rb
*
3
;
i
++
)
{
rxdataF_comp128_0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rxdataF_comp128_0
[
i
],
1
),
_mm_srai_epi16
(
rxdataF_comp128_1
[
i
],
1
));
dl_ch_mag128_0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_0
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_1
[
i
],
1
));
dl_ch_mag128_0b
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_0b
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_1b
[
i
],
1
));
// print_shorts("mrc compens0:",&rxdataF_comp128_0[i]);
// print_shorts("mrc mag128_0:",&dl_ch_mag128_0[i]);
// print_shorts("mrc mag128_0b:",&dl_ch_mag128_0b[i]);
}
}
for
(
i
=
0
;
i
<
nb_rb
*
3
;
i
++
)
{
rxdataF_comp128_0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rxdataF_comp128_0
[
i
],
1
),
_mm_srai_epi16
(
rxdataF_comp128_1
[
i
],
1
));
dl_ch_mag128_0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_0
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_1
[
i
],
1
));
dl_ch_mag128_0b
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_0b
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_1b
[
i
],
1
));
rho128_0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rho128_0
[
i
],
1
),
_mm_srai_epi16
(
rho128_1
[
i
],
1
));
if
(
frame_parms
->
nb_antennas_rx
>
2
)
{
__m128i
*
rxdataF_comp128_2
=
NULL
;
__m128i
*
rxdataF_comp128_3
=
NULL
;
__m128i
*
dl_ch_mag128_2
=
NULL
;
__m128i
*
dl_ch_mag128_3
=
NULL
;
__m128i
*
dl_ch_mag128_2b
=
NULL
;
__m128i
*
dl_ch_mag128_3b
=
NULL
;
__m128i
*
rho128_2
=
NULL
;
__m128i
*
rho128_3
=
NULL
;
rxdataF_comp128_2
=
(
__m128i
*
)
&
rxdataF_comp0
[
2
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rxdataF_comp128_3
=
(
__m128i
*
)
&
rxdataF_comp0
[
3
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_2
=
(
__m128i
*
)
&
dl_ch_mag0
[
2
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_3
=
(
__m128i
*
)
&
dl_ch_mag0
[
3
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_2b
=
(
__m128i
*
)
&
dl_ch_magb0
[
2
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_3b
=
(
__m128i
*
)
&
dl_ch_magb0
[
3
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rho128_2
=
(
__m128i
*
)
&
dl_ch_rho2_ext
[
2
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rho128_3
=
(
__m128i
*
)
&
dl_ch_rho2_ext
[
3
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
/*rxdataF_comp*/
rxdataF_comp128_2
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rxdataF_comp128_2
[
i
],
1
),
_mm_srai_epi16
(
rxdataF_comp128_3
[
i
],
1
));
rxdataF_comp128_0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rxdataF_comp128_0
[
i
],
1
),
_mm_srai_epi16
(
rxdataF_comp128_2
[
i
],
1
));
/*dl_ch_mag*/
dl_ch_mag128_2
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_2
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_3
[
i
],
1
));
dl_ch_mag128_0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_0
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_2
[
i
],
1
));
/*dl_ch_mag*/
dl_ch_mag128_2b
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_2b
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_3b
[
i
],
1
));
dl_ch_mag128_0b
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_0b
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_2b
[
i
],
1
));
/*rho*/
rho128_2
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rho128_2
[
i
],
1
),
_mm_srai_epi16
(
rho128_3
[
i
],
1
));
rho128_0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rho128_0
[
i
],
1
),
_mm_srai_epi16
(
rho128_2
[
i
],
1
));
}
}
// if (rho) {
rho128_0
=
(
__m128i
*
)
&
dl_ch_rho2_ext
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rho128_1
=
(
__m128i
*
)
&
dl_ch_rho2_ext
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
for
(
i
=
0
;
i
<
nb_rb
*
3
;
i
++
)
{
// print_shorts("mrc rho0:",&rho128_0[i]);
// print_shorts("mrc rho1:",&rho128_1[i]);
rho128_0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rho128_0
[
i
],
1
),
_mm_srai_epi16
(
rho128_1
[
i
],
1
));
}
//}
if
(
dual_stream_UE
==
1
)
{
__m128i
*
dl_ch_mag128_i0
,
*
dl_ch_mag128_i1
;
__m128i
*
dl_ch_mag128_i0b
,
*
dl_ch_mag128_i1b
;
__m128i
*
rho128_i0
,
*
rho128_i1
;
__m128i
*
rxdataF_comp128_i0
,
*
rxdataF_comp128_i1
;
if
(
dual_stream_UE
==
1
)
{
rho128_i0
=
(
__m128i
*
)
&
dl_ch_rho_ext
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rho128_i1
=
(
__m128i
*
)
&
dl_ch_rho_ext
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rxdataF_comp128_i0
=
(
__m128i
*
)
&
rxdataF_comp1
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rxdataF_comp128_i1
=
(
__m128i
*
)
&
rxdataF_comp1
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_i0
=
(
__m128i
*
)
&
dl_ch_mag1
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_i1
=
(
__m128i
*
)
&
dl_ch_mag1
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_i0b
=
(
__m128i
*
)
&
dl_ch_magb1
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_i1b
=
(
__m128i
*
)
&
dl_ch_magb1
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rho128_i0
=
(
__m128i
*
)
&
dl_ch_rho_ext
[
0
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rho128_i1
=
(
__m128i
*
)
&
dl_ch_rho_ext
[
1
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
for
(
i
=
0
;
i
<
nb_rb
*
3
;
i
++
)
{
rxdataF_comp128_i0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rxdataF_comp128_i0
[
i
],
1
),
_mm_srai_epi16
(
rxdataF_comp128_i1
[
i
],
1
));
rho128_i0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rho128_i0
[
i
],
1
),
_mm_srai_epi16
(
rho128_i1
[
i
],
1
));
dl_ch_mag128_i0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_i0
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_i1
[
i
],
1
));
dl_ch_mag128_i0b
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_i0b
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_i1b
[
i
],
1
));
rho128_i0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rho128_i0
[
i
],
1
),
_mm_srai_epi16
(
rho128_i1
[
i
],
1
));
//print_shorts("mrc compens1:",&rxdataF_comp128_i0[i]);
//print_shorts("mrc mag128_i0:",&dl_ch_mag128_i0[i]);
//print_shorts("mrc mag128_i0b:",&dl_ch_mag128_i0b[i]);
if
(
frame_parms
->
nb_antennas_rx
>
2
)
{
__m128i
*
rxdataF_comp128_i2
=
NULL
;
__m128i
*
rxdataF_comp128_i3
=
NULL
;
__m128i
*
dl_ch_mag128_i2
=
NULL
;
__m128i
*
dl_ch_mag128_i3
=
NULL
;
__m128i
*
dl_ch_mag128_i2b
=
NULL
;
__m128i
*
dl_ch_mag128_i3b
=
NULL
;
__m128i
*
rho128_i2
=
NULL
;
__m128i
*
rho128_i3
=
NULL
;
rxdataF_comp128_i2
=
(
__m128i
*
)
&
rxdataF_comp1
[
2
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rxdataF_comp128_i3
=
(
__m128i
*
)
&
rxdataF_comp1
[
3
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_i2
=
(
__m128i
*
)
&
dl_ch_mag1
[
2
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_i3
=
(
__m128i
*
)
&
dl_ch_mag1
[
3
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_i2b
=
(
__m128i
*
)
&
dl_ch_magb1
[
2
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
dl_ch_mag128_i3b
=
(
__m128i
*
)
&
dl_ch_magb1
[
3
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rho128_i2
=
(
__m128i
*
)
&
dl_ch_rho_ext
[
2
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
rho128_i3
=
(
__m128i
*
)
&
dl_ch_rho_ext
[
3
][
symbol
*
frame_parms
->
N_RB_DL
*
12
];
/*rxdataF_comp*/
rxdataF_comp128_i2
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rxdataF_comp128_i2
[
i
],
1
),
_mm_srai_epi16
(
rxdataF_comp128_i3
[
i
],
1
));
rxdataF_comp128_i0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rxdataF_comp128_i0
[
i
],
1
),
_mm_srai_epi16
(
rxdataF_comp128_i2
[
i
],
1
));
/*dl_ch_mag*/
dl_ch_mag128_i2
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_i2
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_i3
[
i
],
1
));
dl_ch_mag128_i0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_i0
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_i2
[
i
],
1
));
/*dl_ch_mag*/
dl_ch_mag128_i2b
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_i2b
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_i3b
[
i
],
1
));
dl_ch_mag128_i0b
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
dl_ch_mag128_i0b
[
i
],
1
),
_mm_srai_epi16
(
dl_ch_mag128_i2b
[
i
],
1
));
/*rho*/
rho128_i2
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rho128_i2
[
i
],
1
),
_mm_srai_epi16
(
rho128_i3
[
i
],
1
));
rho128_i0
[
i
]
=
_mm_adds_epi16
(
_mm_srai_epi16
(
rho128_i0
[
i
],
1
),
_mm_srai_epi16
(
rho128_i2
[
i
],
1
));
}
}
}
_mm_empty
();
_m_empty
();
}
...
...
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