Move nr_det_A_MF_2x2, nr_squared_matrix_element and nr_numer_2x2 to csi_rx.c
This commit is contained in:
@@ -43,6 +43,89 @@
|
|||||||
//#define NR_CSIRS_DEBUG
|
//#define NR_CSIRS_DEBUG
|
||||||
//#define NR_CSIIM_DEBUG
|
//#define NR_CSIIM_DEBUG
|
||||||
|
|
||||||
|
void nr_det_A_MF_2x2(int32_t *a_mf_00,
|
||||||
|
int32_t *a_mf_01,
|
||||||
|
int32_t *a_mf_10,
|
||||||
|
int32_t *a_mf_11,
|
||||||
|
int32_t *det_fin,
|
||||||
|
unsigned short nb_rb) {
|
||||||
|
|
||||||
|
int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
|
||||||
|
|
||||||
|
__m128i ad_re_128, bc_re_128, det_re_128;
|
||||||
|
|
||||||
|
__m128i *a_mf_00_128 = (__m128i *)a_mf_00;
|
||||||
|
__m128i *a_mf_01_128 = (__m128i *)a_mf_01;
|
||||||
|
__m128i *a_mf_10_128 = (__m128i *)a_mf_10;
|
||||||
|
__m128i *a_mf_11_128 = (__m128i *)a_mf_11;
|
||||||
|
__m128i *det_fin_128 = (__m128i *)det_fin;
|
||||||
|
|
||||||
|
for (int rb = 0; rb<3*nb_rb; rb++) {
|
||||||
|
|
||||||
|
//complex multiplication (I_a+jQ_a)(I_d+jQ_d) = (I_aI_d - Q_aQ_d) + j(Q_aI_d + I_aQ_d)
|
||||||
|
//The imag part is often zero, we compute only the real part
|
||||||
|
ad_re_128 = _mm_sign_epi16(a_mf_00_128[0],*(__m128i*)&nr_conjug2[0]);
|
||||||
|
ad_re_128 = _mm_madd_epi16(ad_re_128,a_mf_11_128[0]); //Re: I_a0*I_d0 - Q_a1*Q_d1
|
||||||
|
|
||||||
|
//complex multiplication (I_b+jQ_b)(I_c+jQ_c) = (I_bI_c - Q_bQ_c) + j(Q_bI_c + I_bQ_c)
|
||||||
|
//The imag part is often zero, we compute only the real part
|
||||||
|
bc_re_128 = _mm_sign_epi16(a_mf_01_128[0],*(__m128i*)&nr_conjug2[0]);
|
||||||
|
bc_re_128 = _mm_madd_epi16(bc_re_128,a_mf_10_128[0]); //Re: I_b0*I_c0 - Q_b1*Q_c1
|
||||||
|
|
||||||
|
det_re_128 = _mm_sub_epi32(ad_re_128, bc_re_128);
|
||||||
|
|
||||||
|
//det in Q30 format
|
||||||
|
det_fin_128[0] = _mm_abs_epi32(det_re_128);
|
||||||
|
|
||||||
|
det_fin_128+=1;
|
||||||
|
a_mf_00_128+=1;
|
||||||
|
a_mf_01_128+=1;
|
||||||
|
a_mf_10_128+=1;
|
||||||
|
a_mf_11_128+=1;
|
||||||
|
}
|
||||||
|
_mm_empty();
|
||||||
|
_m_empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_squared_matrix_element(int32_t *a,
|
||||||
|
int32_t *a_sq,
|
||||||
|
unsigned short nb_rb) {
|
||||||
|
__m128i *a_128 = (__m128i *)a;
|
||||||
|
__m128i *a_sq_128 = (__m128i *)a_sq;
|
||||||
|
for (int rb=0; rb<3*nb_rb; rb++) {
|
||||||
|
a_sq_128[0] = _mm_madd_epi16(a_128[0], a_128[0]);
|
||||||
|
a_sq_128+=1;
|
||||||
|
a_128+=1;
|
||||||
|
}
|
||||||
|
_mm_empty();
|
||||||
|
_m_empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_numer_2x2(int32_t *a_00_sq,
|
||||||
|
int32_t *a_01_sq,
|
||||||
|
int32_t *a_10_sq,
|
||||||
|
int32_t *a_11_sq,
|
||||||
|
int32_t *num_fin,
|
||||||
|
unsigned short nb_rb) {
|
||||||
|
__m128i *a_00_sq_128 = (__m128i *)a_00_sq;
|
||||||
|
__m128i *a_01_sq_128 = (__m128i *)a_01_sq;
|
||||||
|
__m128i *a_10_sq_128 = (__m128i *)a_10_sq;
|
||||||
|
__m128i *a_11_sq_128 = (__m128i *)a_11_sq;
|
||||||
|
__m128i *num_fin_128 = (__m128i *)num_fin;
|
||||||
|
for (int rb=0; rb<3*nb_rb; rb++) {
|
||||||
|
__m128i sq_a_plus_sq_d_128 = _mm_add_epi32(a_00_sq_128[0], a_11_sq_128[0]);
|
||||||
|
__m128i sq_b_plus_sq_c_128 = _mm_add_epi32(a_01_sq_128[0], a_10_sq_128[0]);
|
||||||
|
num_fin_128[0] = _mm_add_epi32(sq_a_plus_sq_d_128, sq_b_plus_sq_c_128);
|
||||||
|
num_fin_128+=1;
|
||||||
|
a_00_sq_128+=1;
|
||||||
|
a_01_sq_128+=1;
|
||||||
|
a_10_sq_128+=1;
|
||||||
|
a_11_sq_128+=1;
|
||||||
|
}
|
||||||
|
_mm_empty();
|
||||||
|
_m_empty();
|
||||||
|
}
|
||||||
|
|
||||||
bool is_csi_rs_in_symbol(fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu, int symbol) {
|
bool is_csi_rs_in_symbol(fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu, int symbol) {
|
||||||
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|||||||
@@ -1870,89 +1870,6 @@ void nr_dlsch_detection_mrc(int **rxdataF_comp,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_det_A_MF_2x2(int32_t *a_mf_00,
|
|
||||||
int32_t *a_mf_01,
|
|
||||||
int32_t *a_mf_10,
|
|
||||||
int32_t *a_mf_11,
|
|
||||||
int32_t *det_fin,
|
|
||||||
unsigned short nb_rb) {
|
|
||||||
|
|
||||||
int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
|
|
||||||
|
|
||||||
__m128i ad_re_128, bc_re_128, det_re_128;
|
|
||||||
|
|
||||||
__m128i *a_mf_00_128 = (__m128i *)a_mf_00;
|
|
||||||
__m128i *a_mf_01_128 = (__m128i *)a_mf_01;
|
|
||||||
__m128i *a_mf_10_128 = (__m128i *)a_mf_10;
|
|
||||||
__m128i *a_mf_11_128 = (__m128i *)a_mf_11;
|
|
||||||
__m128i *det_fin_128 = (__m128i *)det_fin;
|
|
||||||
|
|
||||||
for (int rb = 0; rb<3*nb_rb; rb++) {
|
|
||||||
|
|
||||||
//complex multiplication (I_a+jQ_a)(I_d+jQ_d) = (I_aI_d - Q_aQ_d) + j(Q_aI_d + I_aQ_d)
|
|
||||||
//The imag part is often zero, we compute only the real part
|
|
||||||
ad_re_128 = _mm_sign_epi16(a_mf_00_128[0],*(__m128i*)&nr_conjug2[0]);
|
|
||||||
ad_re_128 = _mm_madd_epi16(ad_re_128,a_mf_11_128[0]); //Re: I_a0*I_d0 - Q_a1*Q_d1
|
|
||||||
|
|
||||||
//complex multiplication (I_b+jQ_b)(I_c+jQ_c) = (I_bI_c - Q_bQ_c) + j(Q_bI_c + I_bQ_c)
|
|
||||||
//The imag part is often zero, we compute only the real part
|
|
||||||
bc_re_128 = _mm_sign_epi16(a_mf_01_128[0],*(__m128i*)&nr_conjug2[0]);
|
|
||||||
bc_re_128 = _mm_madd_epi16(bc_re_128,a_mf_10_128[0]); //Re: I_b0*I_c0 - Q_b1*Q_c1
|
|
||||||
|
|
||||||
det_re_128 = _mm_sub_epi32(ad_re_128, bc_re_128);
|
|
||||||
|
|
||||||
//det in Q30 format
|
|
||||||
det_fin_128[0] = _mm_abs_epi32(det_re_128);
|
|
||||||
|
|
||||||
det_fin_128+=1;
|
|
||||||
a_mf_00_128+=1;
|
|
||||||
a_mf_01_128+=1;
|
|
||||||
a_mf_10_128+=1;
|
|
||||||
a_mf_11_128+=1;
|
|
||||||
}
|
|
||||||
_mm_empty();
|
|
||||||
_m_empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
void nr_squared_matrix_element(int32_t *a,
|
|
||||||
int32_t *a_sq,
|
|
||||||
unsigned short nb_rb) {
|
|
||||||
__m128i *a_128 = (__m128i *)a;
|
|
||||||
__m128i *a_sq_128 = (__m128i *)a_sq;
|
|
||||||
for (int rb=0; rb<3*nb_rb; rb++) {
|
|
||||||
a_sq_128[0] = _mm_madd_epi16(a_128[0], a_128[0]);
|
|
||||||
a_sq_128+=1;
|
|
||||||
a_128+=1;
|
|
||||||
}
|
|
||||||
_mm_empty();
|
|
||||||
_m_empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
void nr_numer_2x2(int32_t *a_00_sq,
|
|
||||||
int32_t *a_01_sq,
|
|
||||||
int32_t *a_10_sq,
|
|
||||||
int32_t *a_11_sq,
|
|
||||||
int32_t *num_fin,
|
|
||||||
unsigned short nb_rb) {
|
|
||||||
__m128i *a_00_sq_128 = (__m128i *)a_00_sq;
|
|
||||||
__m128i *a_01_sq_128 = (__m128i *)a_01_sq;
|
|
||||||
__m128i *a_10_sq_128 = (__m128i *)a_10_sq;
|
|
||||||
__m128i *a_11_sq_128 = (__m128i *)a_11_sq;
|
|
||||||
__m128i *num_fin_128 = (__m128i *)num_fin;
|
|
||||||
for (int rb=0; rb<3*nb_rb; rb++) {
|
|
||||||
__m128i sq_a_plus_sq_d_128 = _mm_add_epi32(a_00_sq_128[0], a_11_sq_128[0]);
|
|
||||||
__m128i sq_b_plus_sq_c_128 = _mm_add_epi32(a_01_sq_128[0], a_10_sq_128[0]);
|
|
||||||
num_fin_128[0] = _mm_add_epi32(sq_a_plus_sq_d_128, sq_b_plus_sq_c_128);
|
|
||||||
num_fin_128+=1;
|
|
||||||
a_00_sq_128+=1;
|
|
||||||
a_01_sq_128+=1;
|
|
||||||
a_10_sq_128+=1;
|
|
||||||
a_11_sq_128+=1;
|
|
||||||
}
|
|
||||||
_mm_empty();
|
|
||||||
_m_empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Zero Forcing Rx function: nr_a_sum_b()
|
/* Zero Forcing Rx function: nr_a_sum_b()
|
||||||
* Compute the complex addition x=x+y
|
* Compute the complex addition x=x+y
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -891,24 +891,6 @@ void nr_a_sum_b(__m128i *input_x,
|
|||||||
__m128i *input_y,
|
__m128i *input_y,
|
||||||
unsigned short nb_rb);
|
unsigned short nb_rb);
|
||||||
|
|
||||||
void nr_det_A_MF_2x2(int32_t *a_mf_00,
|
|
||||||
int32_t *a_mf_01,
|
|
||||||
int32_t *a_mf_10,
|
|
||||||
int32_t *a_mf_11,
|
|
||||||
int32_t *det_fin,
|
|
||||||
unsigned short nb_rb);
|
|
||||||
|
|
||||||
void nr_squared_matrix_element(int32_t *a,
|
|
||||||
int32_t *a_sq,
|
|
||||||
unsigned short nb_rb);
|
|
||||||
|
|
||||||
void nr_numer_2x2(int32_t *a_00_sq,
|
|
||||||
int32_t *a_01_sq,
|
|
||||||
int32_t *a_10_sq,
|
|
||||||
int32_t *a_11_sq,
|
|
||||||
int32_t *num_fin,
|
|
||||||
unsigned short nb_rb);
|
|
||||||
|
|
||||||
uint8_t rank_estimation_tm3_tm4(int *dl_ch_estimates_00,
|
uint8_t rank_estimation_tm3_tm4(int *dl_ch_estimates_00,
|
||||||
int *dl_ch_estimates_01,
|
int *dl_ch_estimates_01,
|
||||||
int *dl_ch_estimates_10,
|
int *dl_ch_estimates_10,
|
||||||
|
|||||||
Reference in New Issue
Block a user