nr_dmrs_rx.c 5.76 KB
Newer Older
Hongzhi Wang's avatar
Hongzhi Wang committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.0  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

/*! \file PHY/NR_REFSIG/nr_dl_dmrs.c
23 24 25 26 27 28 29 30 31
 * \brief Top-level routines for generating DMRS from 38-211
 * \author
 * \date 2018
 * \version 0.1
 * \company Eurecom
 * \email:
 * \note
 * \warning
 */
Hongzhi Wang's avatar
Hongzhi Wang committed
32 33 34 35 36 37 38 39 40 41 42 43 44 45

//#define NR_PBCH_DMRS_LENGTH_DWORD 5
//#define NR_PBCH_DMRS_LENGTH 144

#include "refsig_defs_ue.h"
#include "PHY/defs_nr_UE.h"

/*Table 7.4.1.1.2-1/2 from 38.211 */
int wf1[8][2] = {{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,1}};
int wt1[8][2] = {{1,1},{1,1},{1,1},{1,1},{1,-1},{1,-1},{1,-1},{1,-1}};
int wf2[12][2] = {{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,1},{1,1},{1,-1},{1,1},{1,1}};
int wt2[12][2] = {{1,1},{1,1},{1,1},{1,1},{1,1},{1,1},{1,-1},{1,-1},{1,-1},{1,-1},{1,-1},{1,-1}};


Hongzhi Wang's avatar
Hongzhi Wang committed
46 47
short nr_rx_mod_table[14]  = {0,0,23170,-23170,-23170,23170,23170,-23170,23170,23170,-23170,-23170,-23170,23170};
short nr_rx_nmod_table[14] = {0,0,-23170,23170,23170,-23170,-23170,23170,-23170,-23170,23170,23170,23170,-23170};
48 49


Hongzhi Wang's avatar
Hongzhi Wang committed
50 51 52

int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
						unsigned int Ns,
Hongzhi Wang's avatar
Hongzhi Wang committed
53
						unsigned int *nr_gold_pdsch,
Hongzhi Wang's avatar
Hongzhi Wang committed
54
						int32_t *output,
hongzhi wang's avatar
hongzhi wang committed
55
						unsigned short p,
Hongzhi Wang's avatar
Hongzhi Wang committed
56 57
						unsigned char lp,
						unsigned short nb_pdsch_rb)
Hongzhi Wang's avatar
Hongzhi Wang committed
58
{
Hongzhi Wang's avatar
Hongzhi Wang committed
59 60 61
  int8_t w,config_type;
  short *mod_table;
  unsigned char idx=0;
Hongzhi Wang's avatar
Hongzhi Wang committed
62 63 64 65 66

  typedef int array_of_w[2];
  array_of_w *wf;
  array_of_w *wt;

Hongzhi Wang's avatar
Hongzhi Wang committed
67
  config_type = 0; //to be updated by higher layer
Hongzhi Wang's avatar
Hongzhi Wang committed
68 69 70 71 72

  wf = (config_type==0) ? wf1 : wf2;
  wt = (config_type==0) ? wt1 : wt2;

  if (config_type > 1)
73
    LOG_E(PHY,"Bad PDSCH DMRS config type %d\n", config_type);
Hongzhi Wang's avatar
Hongzhi Wang committed
74 75

  if ((p>=1000) && (p<((config_type==0) ? 1008 : 1012))) {
Hongzhi Wang's avatar
Hongzhi Wang committed
76
      if (ue->frame_parms.Ncp == NORMAL) {
Hongzhi Wang's avatar
Hongzhi Wang committed
77

Hongzhi Wang's avatar
Hongzhi Wang committed
78
        for (int i=0; i<nb_pdsch_rb*((config_type==0) ? 6:4); i++) {
Hongzhi Wang's avatar
Hongzhi Wang committed
79

Hongzhi Wang's avatar
Hongzhi Wang committed
80 81
        	w = (wf[p-1000][i&1])*(wt[p-1000][lp]);
        	mod_table = (w==1) ? nr_rx_mod_table : nr_rx_nmod_table;
Hongzhi Wang's avatar
Hongzhi Wang committed
82

Hongzhi Wang's avatar
Hongzhi Wang committed
83 84 85 86 87 88 89 90
        	idx = ((((nr_gold_pdsch[(i<<1)>>5])>>((i<<1)&0x1f))&1)<<1) ^ (((nr_gold_pdsch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1);
    		((int16_t*)output)[i<<1] = mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1];
    		((int16_t*)output)[(i<<1)+1] = mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1];
#ifdef DEBUG_PDSCH
    		printf("nr_pdsch_dmrs_rx dmrs config type %d port %d nb_pdsch_rb %d\n", config_type, p, nb_pdsch_rb);
    		printf("wf[%d] = %d wt[%d]= %d\n", i&1, wf[p-1000][i&1], lp, wt[p-1000][lp]);
    		printf("i %d idx %d pdsch gold %u b0-b1 %d-%d mod_dmrs %d %d\n", i, idx, nr_gold_pdsch[(i<<1)>>5], (((nr_gold_pdsch[(i<<1)>>5])>>((i<<1)&0x1f))&1),
    				(((nr_gold_pdsch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1), ((int16_t*)output)[i<<1], ((int16_t*)output)[(i<<1)+1]);
Hongzhi Wang's avatar
Hongzhi Wang committed
91
#endif
Hongzhi Wang's avatar
Hongzhi Wang committed
92 93 94
       	}
      } else {
        LOG_E(PHY,"extended cp not supported for PDSCH DMRS yet\n");
95
      }
Hongzhi Wang's avatar
Hongzhi Wang committed
96 97 98 99 100 101 102
  } else {
    LOG_E(PHY,"Illegal p %d PDSCH DMRS port\n",p);
  }

  return(0);
}

Hongzhi Wang's avatar
Hongzhi Wang committed
103
int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue,
104 105 106 107 108 109
		     uint8_t eNB_offset,
		     unsigned int Ns,
		     unsigned int *nr_gold_pdcch,
		     int32_t *output,
		     unsigned short p,
		     unsigned short nb_rb_coreset)
Hongzhi Wang's avatar
Hongzhi Wang committed
110 111
{

112 113 114
  uint8_t idx=0;
  //uint8_t pdcch_rb_offset =0;
  //nr_gold_pdcch += ((int)floor(ue->frame_parms.ssb_start_subcarrier/12)+pdcch_rb_offset)*3/32;
Hongzhi Wang's avatar
Hongzhi Wang committed
115

116 117 118 119 120
  if (p==2000) {
    for (int i=0; i<((nb_rb_coreset*6)>>1); i++) {
      idx = ((((nr_gold_pdcch[(i<<1)>>5])>>((i<<1)&0x1f))&1)<<1) ^ (((nr_gold_pdcch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1);
      ((int16_t*)output)[i<<1] = nr_rx_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1];
      ((int16_t*)output)[(i<<1)+1] = nr_rx_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1];
Hongzhi Wang's avatar
Hongzhi Wang committed
121
#ifdef DEBUG_PDCCH
122
      if (i<8)
123 124
	printf("i %d idx %d pdcch gold %u b0-b1 %d-%d mod_dmrs %d %d\n", i, idx, nr_gold_pdcch[(i<<1)>>5], (((nr_gold_pdcch[(i<<1)>>5])>>((i<<1)&0x1f))&1),
	       (((nr_gold_pdcch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1), ((int16_t*)output)[i<<1], ((int16_t*)output)[(i<<1)+1],&output[0]);
Hongzhi Wang's avatar
Hongzhi Wang committed
125
#endif
126 127
    }
  }
Hongzhi Wang's avatar
Hongzhi Wang committed
128

129
  return(0);
Hongzhi Wang's avatar
Hongzhi Wang committed
130 131
}

Raymond Knopp's avatar
Raymond Knopp committed
132
int nr_pbch_dmrs_rx(int symbol,unsigned int *nr_gold_pbch,int32_t *output	)
Hongzhi Wang's avatar
Hongzhi Wang committed
133
{
Raymond Knopp's avatar
Raymond Knopp committed
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
  int m,m0,m1;
  uint8_t idx=0;
  AssertFatal(symbol>=0 && symbol <3,"illegal symbol %d\n",symbol);
  if (symbol == 0) {
    m0=0;
    m1=60;
  }
  else if (symbol == 1) {
    m0=60;
    m1=84;
  }
  else {
    m0=84;
    m1=144;
  }
149
  //    printf("Generating pilots symbol %d, m0 %d, m1 %d\n",symbol,m0,m1);
Raymond Knopp's avatar
Raymond Knopp committed
150 151 152 153 154 155
  /// QPSK modulation
  for (m=m0; m<m1; m++) {
    idx = ((((nr_gold_pbch[(m<<1)>>5])>>((m<<1)&0x1f))&1)<<1) ^ (((nr_gold_pbch[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1);
    ((int16_t*)output)[(m-m0)<<1] = nr_rx_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1];
    ((int16_t*)output)[((m-m0)<<1)+1] = nr_rx_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1];
    
Hongzhi Wang's avatar
Hongzhi Wang committed
156
#ifdef DEBUG_PBCH
Raymond Knopp's avatar
Raymond Knopp committed
157 158
    if (m<16)
      {printf("nr_gold_pbch[(m<<1)>>5] %x\n",nr_gold_pbch[(m<<1)>>5]);
hongzhi wang's avatar
hongzhi wang committed
159
	printf("m %d  output %d %d addr %p\n", m, ((int16_t*)output)[m<<1], ((int16_t*)output)[(m<<1)+1],&output[0]);
Raymond Knopp's avatar
Raymond Knopp committed
160
      }
Hongzhi Wang's avatar
Hongzhi Wang committed
161
#endif
Raymond Knopp's avatar
Raymond Knopp committed
162 163
  }
  
Hongzhi Wang's avatar
Hongzhi Wang committed
164 165 166
  return(0);
}

Guy De Souza's avatar
Guy De Souza committed
167 168