diff --git a/openair1/PHY/CODING/TESTBENCH/pdcch_test.c b/openair1/PHY/CODING/TESTBENCH/pdcch_test.c index f4574bb0c5..85dfb074da 100644 --- a/openair1/PHY/CODING/TESTBENCH/pdcch_test.c +++ b/openair1/PHY/CODING/TESTBENCH/pdcch_test.c @@ -246,9 +246,8 @@ int main(int argc, char *argv[]) set_taus_seed(0); ccodelte_init(); - ccodelte_init_inv(); - phy_generate_viterbi_tables_lte(); + phy_generate_viterbi_tables_lte(false); lte_frame_parms = &(PHY_config->lte_frame_parms); lte_frame_parms->N_RB_DL = 25; //50 for 10MHz and 25 for 5 MHz lte_frame_parms->Ncp = 1; diff --git a/openair1/PHY/CODING/ccoding_byte_lte.c b/openair1/PHY/CODING/ccoding_byte_lte.c index becdc59074..4121cf2b36 100644 --- a/openair1/PHY/CODING/ccoding_byte_lte.c +++ b/openair1/PHY/CODING/ccoding_byte_lte.c @@ -32,9 +32,7 @@ static const unsigned short glte[] = {0133, 0171, 0165}; // {A,B} static const unsigned short glte_rev[] = {0155, 0117, 0127}; // {A,B} static const unsigned short gdab[] = {0133, 0171, 0145}; // {A,B} static const unsigned short gdab_rev[] = {0155, 0117, 0123}; // {A,B} -unsigned char ccodelte_table[128]; // for transmitter -unsigned char ccodelte_table_rev[128]; // for receiver - +static unsigned char ccodelte_table[128]; // for transmitter /************************************************************************* @@ -45,8 +43,6 @@ unsigned char ccodelte_table_rev[128]; // for receiver Trellis tail-biting is included here *************************************************************************/ - - void ccodelte_encode (int32_t numbits, uint8_t add_crc, @@ -238,7 +234,8 @@ void ccodelte_init(void) { } /* Input in LSB, followed by state in 6 MSBs */ -void ccodelte_init_inv(void) { +void ccodelte_init_inv(unsigned char ccodelte_table_rev[128]) +{ unsigned int i, j, k, sum; for (i = 0; i < 128; i++) { @@ -279,7 +276,8 @@ void ccodedab_init(void) { } /* Input in LSB, followed by state in 6 MSBs */ -void ccodedab_init_inv(void) { +void ccodedab_init_inv(unsigned char ccodelte_table_rev[128]) +{ unsigned int i, j, k, sum; for (i = 0; i < 128; i++) { @@ -299,7 +297,6 @@ void ccodedab_init_inv(void) { } } - /*****************************************************************/ /** Test program diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h index 7da151fea9..2618036146 100644 --- a/openair1/PHY/CODING/coding_defs.h +++ b/openair1/PHY/CODING/coding_defs.h @@ -304,17 +304,17 @@ void ccodelte_encode(int32_t numbits, uint8_t add_crc, uint8_t *inPtr, uint8_t * \brief This function initializes the generator polynomials for an LTE convolutional code.*/ void ccodelte_init(void); -/*!\fn void ccodelte_init_inv(void) +/*!\fn void ccodelte_init_inv(unsigned char ccodelte_table_rev[128]) \brief This function initializes the trellis structure for decoding an LTE convolutional code.*/ -void ccodelte_init_inv(void); +void ccodelte_init_inv(unsigned char ccodelte_table_rev[128]); /*!\fn void ccodelte_init(void) \brief This function initializes the generator polynomials for an DAB convolutional code (first 3 bits).*/ void ccodedab_init(void); -/*!\fn void ccodelte_init_inv(void) +/*!\fn void ccodelte_init_inv(unsigned char ccodelte_table_rev[128]) \brief This function initializes the trellis structure for decoding an DAB convolutional code (first 3 bits).*/ -void ccodedab_init_inv(void); +void ccodedab_init_inv(unsigned char ccodelte_table_rev[128]); /*!\fn void crcTableInit(void) \brief This function initializes the different crc tables.*/ @@ -399,7 +399,7 @@ void phy_viterbi_lte_sse2(int8_t *y, uint8_t *decoded_bytes, uint16_t n); */ void phy_generate_viterbi_tables(void); -/*!\fn void phy_generate_viterbi_tables_lte(void) +/*!\fn void phy_generate_viterbi_tables_lte(bool dabflag) \brief This routine initializes metric tables for the optimized LTE Viterbi decoder. */ void phy_generate_viterbi_tables_lte(void); diff --git a/openair1/PHY/CODING/viterbi_lte.c b/openair1/PHY/CODING/viterbi_lte.c index c2492edaf4..269fa761b2 100644 --- a/openair1/PHY/CODING/viterbi_lte.c +++ b/openair1/PHY/CODING/viterbi_lte.c @@ -40,16 +40,20 @@ #include "PHY/sse_intrin.h" - -extern uint8_t ccodelte_table[128],ccodelte_table_rev[128]; +#include "coding_defs.h" static int8_t m0_table[64*16*16*16] __attribute__ ((aligned(16))); static int8_t m1_table[64*16*16*16] __attribute__ ((aligned(16))); // Set up Viterbi tables for SSE2 implementation -void phy_generate_viterbi_tables_lte( void ) +void phy_generate_viterbi_tables_lte(bool dabflag) { + uint8_t ccodelte_table_rev[128]; + if (dabflag) + ccodedab_init_inv(ccodelte_table_rev); + else + ccodelte_init_inv(ccodelte_table_rev); int8_t w[8],in0,in1,in2; uint8_t state,index0,index1; @@ -126,52 +130,29 @@ void print_shorts(simde__m128i x,char *s) { void phy_viterbi_lte_sse2(int8_t *y,uint8_t *decoded_bytes,uint16_t n) { simde__m128i TB[4 * 8192]; - simde__m128i *m0_ptr, *m1_ptr, *TB_ptr = &TB[0]; - - simde__m128i metrics0_15, metrics16_31, metrics32_47, metrics48_63, even0_30a, even0_30b, even32_62a, even32_62b, odd1_31a, - odd1_31b, odd33_63a, odd33_63b, TBeven0_30, TBeven32_62, TBodd1_31, TBodd33_63; - - simde__m128i min_state, min_state2; - - int8_t *in = y; - uint8_t prev_state0,maxm,s; - static uint8_t *TB_ptr2; - uint32_t table_offset; - uint8_t iter; - int16_t position; - - // set initial metrics - //debug_msg("Doing viterbi\n"); - - metrics0_15 = simde_mm_setzero_si128(); - metrics16_31 = simde_mm_setzero_si128(); - metrics32_47 = simde_mm_setzero_si128(); - metrics48_63 = simde_mm_setzero_si128(); - - for (iter=0; iter<2; iter++) { - in = y; - TB_ptr=&TB[0]; - - for (position=0; position maxm) { - maxm = ((uint8_t *)&metrics0_15)[s]; + uint prev_state0 = 0; + uint maxm = 0; + uint s = 0; + for (uint8_t *ptr = (uint8_t *)&metrics0_15; s < 16; s++, ptr++) + if (*ptr > maxm) { + maxm = *ptr; prev_state0 = s; } - for (s=0; s<16; s++) - if (((uint8_t *)&metrics16_31)[s] > maxm) { - maxm = ((uint8_t *)&metrics16_31)[s]; - prev_state0 = s+16; + for (uint8_t *ptr = (uint8_t *)&metrics16_31; s < 32; s++, ptr++) + if (*ptr > maxm) { + maxm = *ptr; + prev_state0 = s; + } + for (uint8_t *ptr = (uint8_t *)&metrics32_47; s < 48; s++, ptr++) + if (*ptr > maxm) { + maxm = *ptr; + prev_state0 = s; + } + for (uint8_t *ptr = (uint8_t *)&metrics48_63; s < 64; s++, ptr++) + if (*ptr > maxm) { + maxm = *ptr; + prev_state0 = s; } - for (s=0; s<16; s++) - if (((uint8_t *)&metrics32_47)[s] > maxm) { - maxm = ((uint8_t *)&metrics32_47)[s]; - prev_state0 = s+32; - } - - for (s=0; s<16; s++) - if (((uint8_t *)&metrics48_63)[s] > maxm) { - maxm = ((uint8_t *)&metrics48_63)[s]; - prev_state0 = s+48; - } - - TB_ptr2 = (uint8_t *)&TB[(n-1)*4]; - - for (position = n-1 ; position>-1; position--) { + uint8_t *TB_ptr2 = (uint8_t *)&TB[(n - 1) * 4]; + for (int position = n - 1; position > -1; position--) { decoded_bytes[(position)>>3] += (prev_state0 & 0x1)<<(7-(position & 0x7)); @@ -278,7 +254,6 @@ void phy_viterbi_lte_sse2(int8_t *y,uint8_t *decoded_bytes,uint16_t n) TB_ptr2-=64; } - } #ifdef TEST_DEBUG @@ -304,10 +279,8 @@ int test_viterbi(uint8_t dabflag) if (dabflag==0) { ccodelte_init(); - ccodelte_init_inv(); } else { ccodedab_init(); - ccodedab_init_inv(); printf("Running with DAB polynomials\n"); } diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c index 15b27b4db1..cc7967d306 100644 --- a/openair1/PHY/INIT/init_top.c +++ b/openair1/PHY/INIT/init_top.c @@ -63,8 +63,7 @@ void generate_qpsk_table(void) { void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms) { ccodelte_init(); - ccodelte_init_inv(); - phy_generate_viterbi_tables_lte(); + phy_generate_viterbi_tables_lte(false); load_codinglib(); generate_ul_ref_sigs(); generate_ul_ref_sigs_rx();