lte_dl_cell_spec.c 8.72 KB
Newer Older
1 2 3 4 5
/*
 * 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
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 * 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
 */

22 23 24
#include <stdio.h>
#include <stdlib.h>

25 26 27
#include "PHY/defs_eNB.h"
#include "PHY/defs_UE.h"
#include "PHY/impl_defs_top.h"
28
#include "common/utils/LOG/log.h"
29
//extern unsigned int lte_gold_table[3][20][2][14];
30

31 32 33 34



//Calibration
35
int lte_dl_cell_spec_SS(PHY_VARS_eNB *eNB,
36
                        int32_t *output,
37 38 39 40 41
                        short amp,
                        unsigned char Ns,
                        unsigned char l,//nb of sym per slot
                        unsigned char p)  //nb of antennas
{
42 43 44

  unsigned char nu,mprime,mprime_dword,mprime_qpsk_symb,m;
  unsigned short k,a;
45
  int32_t qpsk[4];
46 47 48 49 50 51 52 53 54 55

  a = (amp*ONE_OVER_SQRT2_Q15)>>15;
  ((short *)&qpsk[0])[0] = a;
  ((short *)&qpsk[0])[1] = a;
  ((short *)&qpsk[1])[0] = -a;
  ((short *)&qpsk[1])[1] = a;
  ((short *)&qpsk[2])[0] = a;
  ((short *)&qpsk[2])[1] = -a;
  ((short *)&qpsk[3])[0] = -a;
  ((short *)&qpsk[3])[1] = -a;
Raymond Knopp's avatar
 
Raymond Knopp committed
56

57 58 59 60 61 62 63 64 65 66

  if ((p==0) && (l==0) )
    nu = 0;
  else if ((p==0) && (l>0))
    nu = 3;
  else if ((p==1) && (l==0))
    nu = 3;
  else if ((p==1) && (l>0))
    nu = 0;
  else {
67
    LOG_E(PHY,"lte_dl_cell_spec: p %d, l %d -> ERROR\n",p,l);
68 69 70
    return(-1);
  }

71
  mprime = 110 - eNB->frame_parms.N_RB_DL;
72

73
  k = (nu + eNB->frame_parms.nushift);
74

75 76 77
  if (k > 6)//b
    k -=6;//b

78
  k+=eNB->frame_parms.first_carrier_offset;
Raymond Knopp's avatar
 
Raymond Knopp committed
79

80
  for (m=0; m<eNB->frame_parms.N_RB_DL<<1; m++) { // loop over pilots in one slot/symbol, 2*N_RB_DL pilots
81 82 83 84

    mprime_dword     = mprime>>4;
    mprime_qpsk_symb = mprime&0xf;

85
    // this is r_mprime from 3GPP 36-211 6.10.1.2
86
    output[k] = qpsk[(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
87
    //output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
88 89 90 91 92
    if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) {
      LOG_I(PHY,"Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
                Ns,l,m,mprime_dword,mprime_qpsk_symb);
      LOG_I(PHY,"index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
    }
93 94

    mprime++;
95

96
    if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) {
97
    if (m<4)
98
      LOG_I(PHY,"Ns %d, l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]);
99

100
    }
101
    k+=6;//b
102

103
    if (k >= eNB->frame_parms.ofdm_symbol_size) {
104
      k++;  // skip DC carrier
105
      k-=eNB->frame_parms.ofdm_symbol_size;
106
    }
107

108
    //    LOG_I(PHY,"** k %d\n",k);
109
  }
110

111 112 113 114
  return(0);
}


115
int lte_dl_cell_spec(PHY_VARS_eNB *eNB,
116
                     int32_t *output,
117 118 119 120 121
                     short amp,
                     unsigned char Ns,
                     unsigned char l,
                     unsigned char p)
{
122 123 124

  unsigned char nu,mprime,mprime_dword,mprime_qpsk_symb,m;
  unsigned short k,a;
125
  int32_t qpsk[4];
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

  a = (amp*ONE_OVER_SQRT2_Q15)>>15;
  ((short *)&qpsk[0])[0] = a;
  ((short *)&qpsk[0])[1] = a;
  ((short *)&qpsk[1])[0] = -a;
  ((short *)&qpsk[1])[1] = a;
  ((short *)&qpsk[2])[0] = a;
  ((short *)&qpsk[2])[1] = -a;
  ((short *)&qpsk[3])[0] = -a;
  ((short *)&qpsk[3])[1] = -a;

  if ((p==0) && (l==0) )
    nu = 0;
  else if ((p==0) && (l>0))
    nu = 3;
  else if ((p==1) && (l==0))
    nu = 3;
  else if ((p==1) && (l>0))
    nu = 0;
  else {
146
    LOG_E(PHY,"lte_dl_cell_spec: p %d, l %d -> ERROR\n",p,l);
147 148 149
    return(-1);
  }

150
  mprime = 110 - eNB->frame_parms.N_RB_DL;
151

152
  k = (nu + eNB->frame_parms.nushift);
153

154 155 156
  if (k > 5)
    k -=6;

157
  k+=eNB->frame_parms.first_carrier_offset;
Raymond Knopp's avatar
 
Raymond Knopp committed
158

159 160 161 162
  DevAssert( Ns < 20 );
  DevAssert( l < 2 );
  DevAssert( mprime>>4 < 14 );

163
  for (m=0; m<eNB->frame_parms.N_RB_DL<<1; m++) {
164 165 166 167

    mprime_dword     = mprime>>4;
    mprime_qpsk_symb = mprime&0xf;

168
    // this is r_mprime from 3GPP 36-211 6.10.1.2
169
    output[k] = qpsk[(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
170
    //output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
171 172 173 174 175
    if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) {
      LOG_I(PHY,"Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
          Ns,l,m,mprime_dword,mprime_qpsk_symb);
      LOG_I(PHY,"index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
    }
176
    mprime++;
177 178 179 180
    if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) {
      if (m<4)
        LOG_I(PHY,"Ns %d, l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]);
    }
181

182
    k+=6;
183
    if (k >= eNB->frame_parms.ofdm_symbol_size) {
184
      k++;  // skip DC carrier
185
      k-=eNB->frame_parms.ofdm_symbol_size;
186
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
187

188
    //    LOG_I(PHY,"** k %d\n",k);
189
  }
190

191 192 193
  return(0);
}

194
int lte_dl_cell_spec_rx(PHY_VARS_UE *ue,
195 196 197 198 199 200 201
                        uint8_t eNB_offset,
                        int *output,
                        unsigned char Ns,
                        unsigned char l,
                        unsigned char p)
{

202 203 204 205 206

  unsigned char mprime,mprime_dword,mprime_qpsk_symb,m;
  unsigned short k=0;
  unsigned int qpsk[4];
  short pamp;
207

208 209 210 211 212 213 214 215 216 217 218 219 220 221
  // Compute the correct pilot amplitude, sqrt_rho_b = Q3.13
  pamp = ONE_OVER_SQRT2_Q15;

  // This includes complex conjugate for channel estimation

  ((short *)&qpsk[0])[0] = pamp;
  ((short *)&qpsk[0])[1] = -pamp;
  ((short *)&qpsk[1])[0] = -pamp;
  ((short *)&qpsk[1])[1] = -pamp;
  ((short *)&qpsk[2])[0] = pamp;
  ((short *)&qpsk[2])[1] = pamp;
  ((short *)&qpsk[3])[0] = -pamp;
  ((short *)&qpsk[3])[1] = pamp;

222
  mprime = 110 - ue->frame_parms.N_RB_DL;
223

224
  for (m=0; m<ue->frame_parms.N_RB_DL<<1; m++) {
225 226 227 228

    mprime_dword     = mprime>>4;
    mprime_qpsk_symb = mprime&0xf;

229
    // this is r_mprime from 3GPP 36-211 6.10.1.2
230
    output[k] = qpsk[(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
231 232 233 234 235
    if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) {
      LOG_I(PHY,"Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
             Ns,l,m,mprime_dword,mprime_qpsk_symb);
      LOG_I(PHY,"index = %d (k %d)\n",(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
    }
236 237

    mprime++;
238
    if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) {
239

240 241
      if (m<4)
        LOG_I(PHY,"Ns %d l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]);
242

243 244 245
      }
      k++;
    //    LOG_I(PHY,"** k %d\n",k);
246
  }
247

248 249 250 251 252 253 254 255
  return(0);
}


#ifdef LTE_DL_CELL_SPEC_MAIN



bruno mongazon's avatar
bruno mongazon committed
256
//extern int LOG_M(const char *,const char *,void *,int,int,char);
257
// flag change eren
bruno mongazon's avatar
bruno mongazon committed
258
extern int LOG_M(const char *,const char *,void *,int,int,char);
259 260
main()
{
261 262 263 264 265 266 267 268 269

  unsigned short Nid_cell=0;
  unsigned int Ncp = 0;
  int output00[1024];
  int output01[1024];
  int output10[1024];
  int output11[1024];

  memset(output00,0,1024*sizeof(int));
270
  memset(output01,0,1024*sizeof(int));
271 272 273 274 275 276
  memset(output10,0,1024*sizeof(int));
  memset(output11,0,1024*sizeof(int));

  lte_gold(Nid_cell,Ncp);

  lte_dl_cell_spec(output00,
277 278 279 280 281 282 283 284 285
                   ONE_OVER_SQRT2_Q15,
                   50,
                   Nid_cell,
                   Ncp,
                   0,
                   0,
                   0,
                   0);

286
  lte_dl_cell_spec(output10,
287 288 289 290 291 292 293 294
                   ONE_OVER_SQRT2_Q15,
                   50,
                   Nid_cell,
                   Ncp,
                   0,
                   1,
                   0,
                   0);
295 296

  lte_dl_cell_spec(output01,
297 298 299 300 301 302 303 304
                   ONE_OVER_SQRT2_Q15,
                   50,
                   Nid_cell,
                   Ncp,
                   0,
                   0,
                   1,
                   0);
305 306

  lte_dl_cell_spec(output11,
307 308 309 310 311 312 313 314 315
                   ONE_OVER_SQRT2_Q15,
                   50,
                   Nid_cell,
                   Ncp,
                   0,
                   1,
                   1,
                   0);

316

bruno mongazon's avatar
bruno mongazon committed
317 318 319 320
  LOG_M("dl_cell_spec00.m","dl_cs00",output00,1024,1,1);
  LOG_M("dl_cell_spec01.m","dl_cs01",output01,1024,1,1);
  LOG_M("dl_cell_spec10.m","dl_cs10",output10,1024,1,1);
  LOG_M("dl_cell_spec11.m","dl_cs11",output11,1024,1,1);
321 322
}

323
#endif