Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
oai
openairinterface5G
Commits
1b1270e8
Commit
1b1270e8
authored
Mar 03, 2017
by
Cédric Roux
Browse files
Merge remote-tracking branch 'origin/feature-59-tm4' into develop_integration_w09
parents
5c0f42a2
b2c57f42
Changes
8
Hide whitespace changes
Inline
Side-by-side
openair1/PHY/LTE_TRANSPORT/dci_tools.c
View file @
1b1270e8
...
...
@@ -4478,7 +4478,7 @@ void extract_dci2_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, uint8_t nb_
pdci_info_extarcted
->
rah
=
rah
;
pdci_info_extarcted
->
mcs1
=
mcs1
;
pdci_info_extarcted
->
mcs
1
=
mcs2
;
pdci_info_extarcted
->
mcs
2
=
mcs2
;
pdci_info_extarcted
->
rv1
=
rv1
;
pdci_info_extarcted
->
rv2
=
rv2
;
pdci_info_extarcted
->
harq_pid
=
harq_pid
;
...
...
@@ -4978,7 +4978,7 @@ int check_dci_format2_2a_coherency(DCI_format_t dci_format,
{
uint8_t
rah
=
pdci_info_extarcted
->
rah
;
uint8_t
mcs1
=
pdci_info_extarcted
->
mcs1
;
uint8_t
mcs2
=
pdci_info_extarcted
->
mcs
1
;
uint8_t
mcs2
=
pdci_info_extarcted
->
mcs
2
;
uint8_t
rv1
=
pdci_info_extarcted
->
rv1
;
uint8_t
rv2
=
pdci_info_extarcted
->
rv2
;
uint8_t
harq_pid
=
pdci_info_extarcted
->
harq_pid
;
...
...
@@ -5615,7 +5615,7 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
uint8_t
rah
=
pdci_info_extarcted
->
rah
;
uint8_t
mcs1
=
pdci_info_extarcted
->
mcs1
;
uint8_t
mcs2
=
pdci_info_extarcted
->
mcs
1
;
uint8_t
mcs2
=
pdci_info_extarcted
->
mcs
2
;
uint8_t
rv1
=
pdci_info_extarcted
->
rv1
;
uint8_t
rv2
=
pdci_info_extarcted
->
rv2
;
uint8_t
harq_pid
=
pdci_info_extarcted
->
harq_pid
;
...
...
@@ -5642,9 +5642,9 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
TB1_active
=
0
;
}
//
#ifdef DEBUG_HARQ
#ifdef DEBUG_HARQ
printf
(
"[DCI UE]: TB0 status %d , TB1 status %d
\n
"
,
TB0_active
,
TB1_active
);
//
#endif
#endif
dlsch0_harq
->
mcs
=
mcs1
;
dlsch1_harq
->
mcs
=
mcs2
;
...
...
@@ -5682,21 +5682,23 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
if
(
TB0_active
==
0
)
{
dlsch0_harq
->
status
=
SCH_IDLE
;
pdlsch0
->
active
=
0
;
//
#ifdef DEBUG_HARQ
#ifdef DEBUG_HARQ
printf
(
"[DCI UE]: TB0 is deactivated, retransmit TB1 transmit in TM6
\n
"
);
//
#endif
#endif
}
if
(
TB1_active
==
0
)
{
dlsch1_harq
->
status
=
SCH_IDLE
;
pdlsch1
->
active
=
0
;
//
#ifdef DEBUG_HARQ
#ifdef DEBUG_HARQ
printf
(
"[DCI UE]: TB1 is deactivated, retransmit TB0 transmit in TM6
\n
"
);
//
#endif
#endif
}
#ifdef DEBUG_HARQ
printf
(
"[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d
\n
"
,
dlsch0_harq
->
status
,
dlsch1_harq
->
status
);
#endif
// compute resource allocation
if
(
TB0_active
==
1
){
...
...
@@ -5824,7 +5826,9 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
dlsch1_harq
->
Qm
=
(
mcs2
-
28
)
<<
1
;
}
#ifdef DEBUG_HARQ
printf
(
"[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d
\n
"
,
dlsch0_harq
->
status
,
dlsch1_harq
->
status
);
#endif
#ifdef DEBUG_HARQ
if
(
dlsch0
!=
NULL
&&
dlsch1
!=
NULL
)
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
View file @
1b1270e8
...
...
@@ -1556,8 +1556,11 @@ void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1)
#elif defined(__arm__)
void
prec2A_TM56_128
(
unsigned
char
pmi
,
__m128i
*
ch0
,
__m128i
*
ch1
)
{
__m128i
amp
;
amp
=
_mm_set1_epi16
(
ONE_OVER_SQRT2_Q15
);
// sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b,
//so removed it
//__m128i amp;
//amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
switch
(
pmi
)
{
...
...
@@ -1587,8 +1590,8 @@ void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) {
break
;
}
ch0
[
0
]
=
_mm_mulhi_epi16
(
ch0
[
0
],
amp
);
ch0
[
0
]
=
_mm_slli_epi16
(
ch0
[
0
],
1
);
//
ch0[0] = _mm_mulhi_epi16(ch0[0],amp);
//
ch0[0] = _mm_slli_epi16(ch0[0],1);
_mm_empty
();
_m_empty
();
...
...
@@ -1602,10 +1605,12 @@ short TM3_prec[8]__attribute__((aligned(16))) = {1,1,-1,-1,1,1,-1,-1} ;
void
prec2A_TM3_128
(
__m128i
*
ch0
,
__m128i
*
ch1
)
{
//
__m128i amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
__m128i
amp
=
_mm_set1_epi16
(
ONE_OVER_SQRT2_Q15
);
__m128i
tmp0
,
tmp1
;
// sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b,
//so divide by 2 is replaced by divide by sqrt(2).
// print_shorts("prec2A_TM3 ch0 (before):",ch0);
// print_shorts("prec2A_TM3 ch1 (before):",ch1);
...
...
@@ -1621,9 +1626,13 @@ void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
// print_shorts("prec2A_TM3 ch0 (mid):",&tmp0);
// print_shorts("prec2A_TM3 ch1 (mid):",ch1);
ch0
[
0
]
=
_mm_mulhi_epi16
(
ch0
[
0
],
amp
);
ch0
[
0
]
=
_mm_slli_epi16
(
ch0
[
0
],
1
);
ch1
[
0
]
=
_mm_mulhi_epi16
(
ch1
[
0
],
amp
);
ch1
[
0
]
=
_mm_slli_epi16
(
ch1
[
0
],
1
);
ch0
[
0
]
=
_mm_srai_epi16
(
ch0
[
0
],
1
);
ch1
[
0
]
=
_mm_srai_epi16
(
ch1
[
0
],
1
);
//
ch0[0] = _mm_srai_epi16(ch0[0],1);
//
ch1[0] = _mm_srai_epi16(ch1[0],1);
// print_shorts("prec2A_TM3 ch0 (after):",ch0);
// print_shorts("prec2A_TM3 ch1 (after):",ch1);
...
...
@@ -1637,9 +1646,12 @@ void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
void
prec2A_TM4_128
(
int
pmi
,
__m128i
*
ch0
,
__m128i
*
ch1
)
{
// sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b,
//so divide by 2 is replaced by divide by sqrt(2).
// printf ("demod pmi=%d\n", pmi);
//
__m128i amp;
//
amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
__m128i
amp
;
amp
=
_mm_set1_epi16
(
ONE_OVER_SQRT2_Q15
);
__m128i
tmp0
,
tmp1
;
// print_shorts("prec2A_TM4 ch0 (before):",ch0);
...
...
@@ -1663,14 +1675,14 @@ void prec2A_TM4_128(int pmi,__m128i *ch0,__m128i *ch1) {
//print_shorts("prec2A_TM4 ch0 (middle):",ch0);
//print_shorts("prec2A_TM4 ch1 (middle):",ch1);
//
ch0[0] = _mm_mulhi_epi16(ch0[0],amp);
//
ch0[0] = _mm_slli_epi16(ch0[0],1);
//
ch1[0] = _mm_mulhi_epi16(ch1[0],amp);
//
ch1[0] = _mm_slli_epi16(ch1[0],1);
ch0
[
0
]
=
_mm_mulhi_epi16
(
ch0
[
0
],
amp
);
ch0
[
0
]
=
_mm_slli_epi16
(
ch0
[
0
],
1
);
ch1
[
0
]
=
_mm_mulhi_epi16
(
ch1
[
0
],
amp
);
ch1
[
0
]
=
_mm_slli_epi16
(
ch1
[
0
],
1
);
ch0
[
0
]
=
_mm_srai_epi16
(
ch0
[
0
],
1
);
//divide by 2
ch1
[
0
]
=
_mm_srai_epi16
(
ch1
[
0
],
1
);
//divide by 2
//
ch0[0] = _mm_srai_epi16(ch0[0],1); //divide by 2
//
ch1[0] = _mm_srai_epi16(ch1[0],1); //divide by 2
//print_shorts("prec2A_TM4 ch0 (end):",ch0);
//print_shorts("prec2A_TM4 ch1 (end):",ch1);
_mm_empty
();
...
...
@@ -5801,7 +5813,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
#ifdef USER_MODE
void
dump_dlsch2
(
PHY_VARS_UE
*
ue
,
uint8_t
eNB_id
,
uint8_t
subframe
,
uint16_t
coded_bits_per_codeword
,
int
round
)
void
dump_dlsch2
(
PHY_VARS_UE
*
ue
,
uint8_t
eNB_id
,
uint8_t
subframe
,
uint16_t
coded_bits_per_codeword
,
int
round
,
unsigned
char
harq_pid
)
{
unsigned
int
nsymb
=
(
ue
->
frame_parms
.
Ncp
==
0
)
?
14
:
12
;
char
fname
[
32
],
vname
[
32
];
...
...
@@ -5862,12 +5874,12 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint16_t coded_
sprintf
(
fname
,
"dlsch%d_r%d_rho.m"
,
eNB_id
,
round
);
sprintf
(
vname
,
"dl_rho_r%d_%d"
,
eNB_id
,
round
);
write_output
(
fname
,
vname
,
ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
dl_ch_rho_ext
[
round
][
0
],
12
*
N_RB_DL
*
nsymb
,
1
,
1
);
write_output
(
fname
,
vname
,
ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
dl_ch_rho_ext
[
harq_pid
][
round
][
0
],
12
*
N_RB_DL
*
nsymb
,
1
,
1
);
sprintf
(
fname
,
"dlsch%d_r%d_rho2.m"
,
eNB_id
,
round
);
sprintf
(
vname
,
"dl_rho2_r%d_%d"
,
eNB_id
,
round
);
write_output
(
fname
,
vname
,
ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
dl_ch_rho_ext
[
0
],
12
*
N_RB_DL
*
nsymb
,
1
,
1
);
write_output
(
fname
,
vname
,
ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
dl_ch_rho
2
_ext
[
0
],
12
*
N_RB_DL
*
nsymb
,
1
,
1
);
sprintf
(
fname
,
"dlsch%d_rxF_r%d_comp0.m"
,
eNB_id
,
round
);
sprintf
(
vname
,
"dl%d_rxF_r%d_comp0"
,
eNB_id
,
round
);
...
...
@@ -5875,7 +5887,7 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint16_t coded_
if
(
ue
->
frame_parms
.
nb_antenna_ports_eNB
==
2
)
{
sprintf
(
fname
,
"dlsch%d_rxF_r%d_comp1.m"
,
eNB_id
,
round
);
sprintf
(
vname
,
"dl%d_rxF_r%d_comp1"
,
eNB_id
,
round
);
write_output
(
fname
,
vname
,
ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
rxdataF_comp1
[
0
][
round
],
12
*
N_RB_DL
*
nsymb
,
1
,
1
);
write_output
(
fname
,
vname
,
ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
rxdataF_comp1
[
harq_pid
][
round
]
[
0
]
,
12
*
N_RB_DL
*
nsymb
,
1
,
1
);
}
sprintf
(
fname
,
"dlsch%d_rxF_r%d_llr.m"
,
eNB_id
,
round
);
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
View file @
1b1270e8
...
...
@@ -37,6 +37,9 @@
#include
"extern.h"
#include
"PHY/sse_intrin.h"
//#define DEBUG_LLR_SIC
int16_t
zero
[
8
]
__attribute__
((
aligned
(
16
)))
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
int16_t
ones
[
8
]
__attribute__
((
aligned
(
16
)))
=
{
0xffff
,
0xffff
,
0xffff
,
0xffff
,
0xffff
,
0xffff
,
0xffff
,
0xffff
};
#if defined(__x86_64__) || defined(__i386__)
...
...
@@ -634,7 +637,7 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint16_t
nb_rb
,
uint16_t
pbch_pss_sss_adjust
,
int16_t
**
llr32p
,
uint8_t
beamforming_mode
)
uint8_t
beamforming_mode
)
{
uint32_t
*
rxF
=
(
uint32_t
*
)
&
rxdataF_comp
[
0
][((
int32_t
)
symbol
*
frame_parms
->
N_RB_DL
*
12
)];
...
...
@@ -701,7 +704,6 @@ int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
uint16_t
*
llr16
=
(
uint16_t
*
)
dlsch_llr
;
int
i
,
len
,
nsymb
;
uint8_t
symbol
,
symbol_mod
;
//uint8_t pilots;
int
len_acc
=
0
;
uint16_t
*
sic_data
;
uint16_t
pbch_pss_sss_adjust
;
...
...
@@ -718,19 +720,17 @@ int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
if
((
symbol_mod
==
0
)
||
(
symbol_mod
==
(
4
-
frame_parms
->
Ncp
)))
//pilots=1
amp_tmp
=
dlsch0
->
sqrt_rho_b
;
else
//pilots=0
amp_tmp
=
dlsch0
->
sqrt_rho_a
;
if
((
symbol_mod
==
0
)
||
(
symbol_mod
==
(
4
-
frame_parms
->
Ncp
)))
//pilots=1
amp_tmp
=
0x1fff
;
//
dlsch0->sqrt_rho_b;
already taken into account
else
//pilots=0
amp_tmp
=
0x1fff
;
//1.5*
dlsch0->sqrt_rho_a;
already taken into account
if
(
mod_order_0
==
6
)
amp_tmp
=
amp_tmp
<<
1
;
// to compensate for >> 1 shift in modulation
if
(
mod_order_0
==
6
)
amp_tmp
=
amp_tmp
<<
1
;
// to compensate for >> 1 shift in modulation
to avoid overflow
pbch_pss_sss_adjust
=
adjust_G2
(
frame_parms
,
&
rb_alloc
,
2
,
subframe
,
symbol
);
// printf("amp_tmp=%d\n", amp_tmp);
if
((
symbol_mod
==
0
)
||
(
symbol_mod
==
(
4
-
frame_parms
->
Ncp
)))
{
if
(
frame_parms
->
mode1_flag
==
0
)
len
=
(
nb_rb
*
8
)
-
(
2
*
pbch_pss_sss_adjust
/
3
);
...
...
@@ -750,26 +750,21 @@ int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
1
,
len
);
// printf ("Got x0*rho_a\n");
mult_cpx_vector
((
int16_t
*
)
rho_1
,
//Q15
(
int16_t
*
)
rho_amp_x0
,
//Q13
(
int16_t
*
)
rho_rho_amp_x0
,
len
,
13
);
/* write_output("rho_for_multipl.m","rho_for_multipl", rho_1,len,1,
#ifdef DEBUG_LLR_SIC
write_output
(
"rho_for_multipl.m"
,
"rho_for_m"
,
rho_1
,
len
,
1
,
symbol
==
num_pdcch_symbols
?
15
:
symbol
==
nsymb
-
1
?
14
:
13
);
write_output
(
"rho_rho_in_llr.m"
,
"rho2"
,
rho_rho_amp_x0
,
len
,
1
,
symbol
==
num_pdcch_symbols
?
15
:
symbol
==
nsymb
-
1
?
14
:
13
);
// printf ("Computed rho*rho_a*x0\n");*/
//rho_rho_amp_x0_512 = (int16_t)((512*(int16_t *)rho_rho_amp_x0)>>15);
#endif
sub_cpx_vector16
((
int16_t
*
)
rxF
,
(
int16_t
*
)
rho_rho_amp_x0
,
...
...
@@ -777,23 +772,16 @@ int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
(
int16_t
*
)
rxF
,
len
*
2
);
// write_output("rxFdata_comp1_after.m","rxF_a", rxF,len,1,1);
// write_output("clean_x1.m","x1", clean_x1,len,1,1);
// printf ("Interference removed \n");
/* write_output("clean_x1.m","x1", clean_x1,len,1,
symbol==num_pdcch_symbols ? 15 :
symbol==nsymb-1 ? 14 : 13);
write_output("rxF_comp1.m","rxF_1_comp", rxF,len,1,
symbol==num_pdcch_symbols ? 15 :
symbol==nsymb-1 ? 14 : 13);*/
// printf("dlsch_qpsk_llr_SIC: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
#ifdef DEBUG_LLR_SIC
write_output
(
"rxFdata_comp1_after.m"
,
"rxF_a"
,
rxF
,
len
,
1
,
1
);
write_output
(
"rxF_comp1.m"
,
"rxF_1_comp"
,
rxF
,
len
,
1
,
symbol
==
num_pdcch_symbols
?
15
:
symbol
==
nsymb
-
1
?
14
:
13
);
#endif
//this is for QPSK only!!!
for
(
i
=
0
;
i
<
len
*
2
;
i
++
)
{
*
llr16
=
rxF
[
i
];
//clean_x1[i];//(int16_t *)rxF[i];//clean_x1[i]; //(int16_t *)rxF[i];//; //rxF[i];
*
llr16
=
rxF
[
i
];
//printf("llr %d : (%d,%d)\n",i,((int16_t*)llr32)[0],((int16_t*)llr32)[1]);
llr16
++
;
}
...
...
@@ -956,7 +944,6 @@ void dlsch_16qam_llr_SIC (LTE_DL_FRAME_PARMS *frame_parms,
uint32_t
*
llr32
=
(
uint32_t
*
)
dlsch_llr
;
int
i
,
len
,
nsymb
;
uint8_t
symbol
,
symbol_mod
;
//uint8_t pilots;
int
len_acc
=
0
;
uint16_t
*
sic_data
;
uint16_t
pbch_pss_sss_adjust
;
...
...
@@ -975,22 +962,19 @@ void dlsch_16qam_llr_SIC (LTE_DL_FRAME_PARMS *frame_parms,
pbch_pss_sss_adjust
=
adjust_G2
(
frame_parms
,
&
rb_alloc
,
4
,
subframe
,
symbol
);
if
((
symbol_mod
==
0
)
||
(
symbol_mod
==
(
4
-
frame_parms
->
Ncp
)))
{
amp_tmp
=
0x1fff
;
//dlsch0->sqrt_rho_b; already taken into account
if
(
frame_parms
->
mode1_flag
==
0
)
len
=
nb_rb
*
8
-
(
2
*
pbch_pss_sss_adjust
/
3
);
else
len
=
nb_rb
*
10
-
(
5
*
pbch_pss_sss_adjust
/
6
);
}
else
{
amp_tmp
=
0x1fff
;;
//dlsch0->sqrt_rho_a; already taken into account
len
=
nb_rb
*
12
-
pbch_pss_sss_adjust
;
}
if
((
symbol_mod
==
0
)
||
(
symbol_mod
==
(
4
-
frame_parms
->
Ncp
)))
{
amp_tmp
=
dlsch0
->
sqrt_rho_b
;
if
(
frame_parms
->
mode1_flag
==
0
)
len
=
nb_rb
*
8
-
(
2
*
pbch_pss_sss_adjust
/
3
);
else
len
=
nb_rb
*
10
-
(
5
*
pbch_pss_sss_adjust
/
6
);
}
else
{
amp_tmp
=
dlsch0
->
sqrt_rho_a
;
len
=
nb_rb
*
12
-
pbch_pss_sss_adjust
;
}
if
(
mod_order_0
==
6
)
amp_tmp
=
amp_tmp
<<
1
;
// to compensate for >> 1 shift in modulation
if
(
mod_order_0
==
6
)
amp_tmp
=
amp_tmp
<<
1
;
// to compensate for >> 1 shift in modulation
len_acc
+=
len
;
...
...
@@ -1245,20 +1229,18 @@ void dlsch_64qam_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
pbch_pss_sss_adjust
=
adjust_G2
(
frame_parms
,
&
rb_alloc
,
6
,
subframe
,
symbol
);
if
((
symbol_mod
==
0
)
||
(
symbol_mod
==
(
4
-
frame_parms
->
Ncp
)))
{
amp_tmp
=
dlsch0
->
sqrt_rho_b
;
if
(
frame_parms
->
mode1_flag
==
0
)
len
=
nb_rb
*
8
-
(
2
*
pbch_pss_sss_adjust
/
3
);
else
len
=
nb_rb
*
10
-
(
5
*
pbch_pss_sss_adjust
/
6
);
amp_tmp
=
0x1fff
;
//dlsch0->sqrt_rho_b; already taken into account
if
(
frame_parms
->
mode1_flag
==
0
)
len
=
nb_rb
*
8
-
(
2
*
pbch_pss_sss_adjust
/
3
);
else
len
=
nb_rb
*
10
-
(
5
*
pbch_pss_sss_adjust
/
6
);
}
else
{
amp_tmp
=
dlsch0
->
sqrt_rho_a
;
len
=
nb_rb
*
12
-
pbch_pss_sss_adjust
;
amp_tmp
=
0x1fff
;
//dlsch0->sqrt_rho_a; already taken into account
len
=
nb_rb
*
12
-
pbch_pss_sss_adjust
;
}
if
(
mod_order_0
==
6
)
amp_tmp
=
amp_tmp
<<
1
;
// to compensate for >> 1 shift in modulation
if
(
mod_order_0
==
6
)
amp_tmp
=
amp_tmp
<<
1
;
// to compensate for >> 1 shift in modulation
len_acc
+=
len
;
...
...
@@ -1268,93 +1250,93 @@ void dlsch_64qam_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
1
,
len
);
mult_cpx_vector
((
int16_t
*
)
rho_1
,
//Q15
mult_cpx_vector
((
int16_t
*
)
rho_1
,
//Q15
(
int16_t
*
)
rho_amp_x0
,
//Q13
(
int16_t
*
)
rho_rho_amp_x0
,
len
,
13
);
sub_cpx_vector16
((
int16_t
*
)
rxF
,
sub_cpx_vector16
((
int16_t
*
)
rxF
,
(
int16_t
*
)
rho_rho_amp_x0
,
//(int16_t *)clean_x1,
(
int16_t
*
)
rxF
,
len
*
2
);
llr2
=
llr32
;
llr32
+=
(
len
*
6
);
llr2
=
llr32
;
llr32
+=
(
len
*
6
);
len_mod4
=
len
&
3
;
len2
=
len
>>
2
;
// length in quad words (4 REs)
len2
+=
(
len_mod4
?
0
:
1
);
len_mod4
=
len
&
3
;
len2
=
len
>>
2
;
// length in quad words (4 REs)
len2
+=
(
len_mod4
?
0
:
1
);
for
(
i
=
0
;
i
<
len2
;
i
++
)
{
for
(
i
=
0
;
i
<
len2
;
i
++
)
{
__m128i
*
x1
=
(
__m128i
*
)
rxF
;
xmm1
=
_mm_abs_epi16
(
x1
[
i
]);
xmm1
=
_mm_subs_epi16
(
ch_mag
[
i
],
xmm1
);
xmm2
=
_mm_abs_epi16
(
xmm1
);
xmm2
=
_mm_subs_epi16
(
ch_magb
[
i
],
xmm2
);
__m128i
*
x1
=
(
__m128i
*
)
rxF
;
xmm1
=
_mm_abs_epi16
(
x1
[
i
]);
xmm1
=
_mm_subs_epi16
(
ch_mag
[
i
],
xmm1
);
xmm2
=
_mm_abs_epi16
(
xmm1
);
xmm2
=
_mm_subs_epi16
(
ch_magb
[
i
],
xmm2
);
// loop over all LLRs in quad word (24 coded bits)
/*
for (j=0;j<8;j+=2) {
llr2[0] = ((short *)&rxF[i])[j];
llr2[1] = ((short *)&rxF[i])[j+1];
llr2[2] = ((short *)&xmm1)[j];
llr2[3] = ((short *)&xmm1)[j+1];
llr2[4] = ((short *)&xmm2)[j];
llr2[5] = ((short *)&xmm2)[j+1];
// loop over all LLRs in quad word (24 coded bits)
/*
for (j=0;j<8;j+=2) {
llr2[0] = ((short *)&rxF[i])[j];
llr2[1] = ((short *)&rxF[i])[j+1];
llr2[2] = ((short *)&xmm1)[j];
llr2[3] = ((short *)&xmm1)[j+1];
llr2[4] = ((short *)&xmm2)[j];
llr2[5] = ((short *)&xmm2)[j+1];
llr2+=6;
}
*/
llr2
[
0
]
=
((
short
*
)
&
x1
[
i
])[
0
];
llr2
[
1
]
=
((
short
*
)
&
x1
[
i
])[
1
];
llr2
[
2
]
=
_mm_extract_epi16
(
xmm1
,
0
);
llr2
[
3
]
=
_mm_extract_epi16
(
xmm1
,
1
);
//((short *)&xmm1)[j+1];
llr2
[
4
]
=
_mm_extract_epi16
(
xmm2
,
0
);
//((short *)&xmm2)[j];
llr2
[
5
]
=
_mm_extract_epi16
(
xmm2
,
1
);
//((short *)&xmm2)[j+1];
llr2+=6;
}
*/
llr2
[
0
]
=
((
short
*
)
&
x1
[
i
])[
0
];
llr2
[
1
]
=
((
short
*
)
&
x1
[
i
])[
1
];
llr2
[
2
]
=
_mm_extract_epi16
(
xmm1
,
0
);
llr2
[
3
]
=
_mm_extract_epi16
(
xmm1
,
1
);
//((short *)&xmm1)[j+1];
llr2
[
4
]
=
_mm_extract_epi16
(
xmm2
,
0
);
//((short *)&xmm2)[j];
llr2
[
5
]
=
_mm_extract_epi16
(
xmm2
,
1
);
//((short *)&xmm2)[j+1];
llr2
+=
6
;
llr2
[
0
]
=
((
short
*
)
&
x1
[
i
])[
2
];
llr2
[
1
]
=
((
short
*
)
&
x1
[
i
])[
3
];
llr2
+=
6
;
llr2
[
0
]
=
((
short
*
)
&
x1
[
i
])[
2
];
llr2
[
1
]
=
((
short
*
)
&
x1
[
i
])[
3
];
llr2
[
2
]
=
_mm_extract_epi16
(
xmm1
,
2
);
llr2
[
3
]
=
_mm_extract_epi16
(
xmm1
,
3
);
//((short *)&xmm1)[j+1];
llr2
[
4
]
=
_mm_extract_epi16
(
xmm2
,
2
);
//((short *)&xmm2)[j];
llr2
[
5
]
=
_mm_extract_epi16
(
xmm2
,
3
);
//((short *)&xmm2)[j+1];
llr2
[
2
]
=
_mm_extract_epi16
(
xmm1
,
2
);
llr2
[
3
]
=
_mm_extract_epi16
(
xmm1
,
3
);
//((short *)&xmm1)[j+1];
llr2
[
4
]
=
_mm_extract_epi16
(
xmm2
,
2
);
//((short *)&xmm2)[j];
llr2
[
5
]
=
_mm_extract_epi16
(
xmm2
,
3
);
//((short *)&xmm2)[j+1];
llr2
+=
6
;
llr2
[
0
]
=
((
short
*
)
&
x1
[
i
])[
4
];
llr2
[
1
]
=
((
short
*
)
&
x1
[
i
])[
5
];
llr2
+=
6
;
llr2
[
0
]
=
((
short
*
)
&
x1
[
i
])[
4
];
llr2
[
1
]
=
((
short
*
)
&
x1
[
i
])[
5
];
llr2
[
2
]
=
_mm_extract_epi16
(
xmm1
,
4
);
llr2
[
3
]
=
_mm_extract_epi16
(
xmm1
,
5
);
//((short *)&xmm1)[j+1];
llr2
[
4
]
=
_mm_extract_epi16
(
xmm2
,
4
);
//((short *)&xmm2)[j];
llr2
[
5
]
=
_mm_extract_epi16
(
xmm2
,
5
);
//((short *)&xmm2)[j+1];
llr2
[
2
]
=
_mm_extract_epi16
(
xmm1
,
4
);
llr2
[
3
]
=
_mm_extract_epi16
(
xmm1
,
5
);
//((short *)&xmm1)[j+1];
llr2
[
4
]
=
_mm_extract_epi16
(
xmm2
,
4
);
//((short *)&xmm2)[j];
llr2
[
5
]
=
_mm_extract_epi16
(
xmm2
,
5
);
//((short *)&xmm2)[j+1];
llr2
+=
6
;
llr2
[
0
]
=
((
short
*
)
&
x1
[
i
])[
6
];
llr2
[
1
]
=
((
short
*
)
&
x1
[
i
])[
7
];
llr2
+=
6
;
llr2
[
0
]
=
((
short
*
)
&
x1
[
i
])[
6
];
llr2
[
1
]
=
((
short
*
)
&
x1
[
i
])[
7
];
llr2
[
2
]
=
_mm_extract_epi16
(
xmm1
,
6
);
llr2
[
3
]
=
_mm_extract_epi16
(
xmm1
,
7
);
//((short *)&xmm1)[j+1];
llr2
[
4
]
=
_mm_extract_epi16
(
xmm2
,
6
);
//((short *)&xmm2)[j];
llr2
[
5
]
=
_mm_extract_epi16
(
xmm2
,
7
);
//((short *)&xmm2)[j+1];
llr2
[
2
]
=
_mm_extract_epi16
(
xmm1
,
6
);
llr2
[
3
]
=
_mm_extract_epi16
(
xmm1
,
7
);
//((short *)&xmm1)[j+1];
llr2
[
4
]
=
_mm_extract_epi16
(
xmm2
,
6
);
//((short *)&xmm2)[j];
llr2
[
5
]
=
_mm_extract_epi16
(
xmm2
,
7
);
//((short *)&xmm2)[j+1];
llr2
+=
6
;
llr2
+=
6
;
}
}
// *llr_save = llr;
_mm_empty
();
_m_empty
();
}
}
}
//#endif
//==============================================================================================
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
View file @
1b1270e8
...
...
@@ -585,8 +585,8 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
int
first_layer0
;
//= dlsch0_harq->first_layer;
int
Nlayers0
;
// = dlsch0_harq->Nlayers;
uint8_t
mod_order0
;
// = get_Qm(dlsch0_harq->mcs);
uint8_t
mod_order1
;
//=2;
uint8_t
mod_order0
=
0
;
// = get_Qm(dlsch0_harq->mcs);
uint8_t
mod_order1
=
0
;
//=2;
uint8_t
precoder_index0
,
precoder_index1
;
uint8_t
*
x1
=
NULL
;
...
...
@@ -1136,13 +1136,24 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
*
jj
=
*
jj
+
1
;
//normalization for 2 tx antennas
((
int16_t
*
)
&
txdataF
[
0
][
tti_offset
])[
0
]
+=
(
int16_t
)((((
int16_t
*
)
&
tmp_sample1
)[
0
]
*
ONE_OVER_SQRT2_Q15
)
>>
15
);
/*
((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15);
((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15);
if (frame_parms->nb_antenna_ports_eNB == 2) {
layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index);
((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15);
((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15);
}*/
// We remove ONE_OVER_SQRT2_Q15 that was coming from precoder, as now it applied in computation sqrt_rho_a, sqrt_rho_b, same in the receiver in precoder function
((
int16_t
*
)
&
txdataF
[
0
][
tti_offset
])[
0
]
+=
((
int16_t
*
)
&
tmp_sample1
)[
0
];
((
int16_t
*
)
&
txdataF
[
0
][
tti_offset
])[
1
]
+=
((
int16_t
*
)
&
tmp_sample1
)[
1
];
if
(
frame_parms
->
nb_antenna_ports_eNB
==
2
)
{
layer1prec2A
(
&
tmp_sample1
,
&
tmp_sample2
,
precoder_index
);
((
int16_t
*
)
&
txdataF
[
1
][
tti_offset
])[
0
]
+=
((
int16_t
*
)
&
tmp_sample2
)[
0
];
((
int16_t
*
)
&
txdataF
[
1
][
tti_offset
])[
1
]
+=
((
int16_t
*
)
&
tmp_sample2
)[
1
];
}
break
;
...
...
@@ -1171,13 +1182,13 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
((
int16_t
*
)
&
tmp_sample1
)[
0
]
=
(
int16_t
)((
qam_table_s0
[
qam16_table_offset_re
]));
((
int16_t
*
)
&
tmp_sample1
)[
1
]
=
(
int16_t
)((
qam_table_s0
[
qam16_table_offset_im
]));
((
int16_t
*
)
&
txdataF
[
0
][
tti_offset
])[
0
]
+=
(
int16_t
)((
((
int16_t
*
)
&
tmp_sample1
)[
0
]
*
ONE_OVER_SQRT2_Q15
)
>>
15
)
;
((
int16_t
*
)
&
txdataF
[
0
][
tti_offset
])[
1
]
+=
(
int16_t
)((
((
int16_t
*
)
&
tmp_sample1
)[
1
]
*
ONE_OVER_SQRT2_Q15
)
>>
15
)
;
((
int16_t
*
)
&
txdataF
[
0
][
tti_offset
])[
0
]
+=
((
int16_t
*
)
&
tmp_sample1
)[
0
];
((
int16_t
*
)
&
txdataF
[
0
][
tti_offset
])[
1
]
+=
((
int16_t
*
)
&
tmp_sample1
)[
1
];
if
(
frame_parms
->
nb_antennas_tx
==
2
)
{
layer1prec2A
(
&
tmp_sample1
,
&
tmp_sample2
,
precoder_index
);
((
int16_t
*
)
&
txdataF
[
1
][
tti_offset
])[
0
]
+=
(
int16_t
)((
((
int16_t
*
)
&
tmp_sample2
)[
0
]
*
ONE_OVER_SQRT2_Q15
)
>>
15
)
;
((
int16_t
*
)
&
txdataF
[
1
][
tti_offset
])[
1
]
+=
(
int16_t
)((
((
int16_t
*
)
&
tmp_sample2
)[
1
]
*
ONE_OVER_SQRT2_Q15
)
>>
15
)
;
((
int16_t
*
)
&
txdataF
[
1
][
tti_offset
])[
0
]
+=
((
int16_t
*
)
&
tmp_sample2
)[
0
];
((
int16_t
*
)
&
txdataF
[
1
][
tti_offset
])[
1
]
+=
((
int16_t
*
)
&
tmp_sample2
)[
1
];
}
break
;
...
...
@@ -1208,13 +1219,13 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
((
int16_t
*
)
&
tmp_sample1
)[
0
]
=
(
int16_t
)((
qam_table_s0
[
qam64_table_offset_re
]));
((
int16_t
*
)
&
tmp_sample1
)[
1
]
=
(
int16_t
)((
qam_table_s0
[
qam64_table_offset_im
]));