diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c index 42d651d140..fd07a4c2de 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c @@ -51,16 +51,19 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, { int k,l; int16_t a; - int16_t mod_dmrs[2 * NR_PBCH_DMRS_LENGTH]; + int16_t mod_dmrs[NR_PBCH_DMRS_LENGTH<<1]; + uint8_t idx=0; LOG_I(PHY, "PBCH DMRS mapping started at symbol %d shift %d\n", ssb_start_symbol+1, nushift); - /// BPSK modulation - for (int m=0; m>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1)]; - mod_dmrs[(m<<1)+1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1) + 1]; + /// QPSK modulation + for (int m=0; m>1; m++) { + idx = ((((gold_pbch_dmrs[(m<<1)>>5])>>((m<<1)&0x1f))&1)<<1) ^ (((gold_pbch_dmrs[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1); + mod_dmrs[m<<1] = nr_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1]; + mod_dmrs[(m<<1)+1] = nr_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1]; #ifdef DEBUG_PBCH_DMRS - printf("m %d mod_dmrs %d %d\n", m, mod_dmrs[2*m], mod_dmrs[2*m+1]); + printf("m %d idx %d gold seq %d b0-b1 %d-%d mod_dmrs %d %d\n", m, idx, gold_pbch_dmrs[(m<<1)>>5], (((gold_pbch_dmrs[(m<<1)>>5])>>((m<<1)&0x1f))&1), + (((gold_pbch_dmrs[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1), mod_dmrs[(m<<1)], mod_dmrs[(m<<1)+1]); #endif } @@ -135,11 +138,24 @@ void nr_pbch_scrambling(uint32_t Nid, { uint8_t reset; uint32_t x1, x2, s=0; + uint64_t tmp=0; + uint8_t M = length - 3; // case Lmax = 4--> 29 reset = 1; // x1 is set in lte_gold_generic x2 = Nid; + // The Gold sequence is shifted by nushift* M, so we skip (nushift*M /32) double words + for (int i=0; i<(nushift*M)>>5; i++) { + s = lte_gold_generic(&x1, &x2, reset); + reset = 0; + } + tmp = (uint64_t)s; + s = lte_gold_generic(&x1, &x2, reset); + tmp^=(uint64_t)(s<<32); + tmp>>=((nushift*M)&0x1f); + s = (uint32_t)(tmp); + for (int i=0; i>1; i++){ - idx = (pbch->pbch_e[i<<1]&1) ^ ((pbch->pbch_e[(i<<1)+1]&1)<<1); + idx = ((pbch->pbch_e[i<<1]&1)<<1) ^ (pbch->pbch_e[(i<<1)+1]&1); mod_pbch_e[i<<1] = nr_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1]; mod_pbch_e[(i<<1)+1] = nr_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1)+1];