nsss_NB_IoT.c 3.38 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/***********************************************************************

**********************************************************************/
/*! \file PHY/LTE_TRANSPORT/nsss_NB_IoT.c
* \Generation of Narrowband Secondary Synchronisation Signal(NSSS) for NB-IoT,	 TS 36-212, V13.4.0 2017-02
* \author M. KANJ
* \date 2017
* \version 0.0
* \company bcom
* \email: matthieu.kanj@b-com.com
* \note
* \warning
*/


16
//#include "PHY/defs.h"
17
#include "PHY/defs_nb_iot.h"
18
//#include "defs.h"
19
//#include "PHY/extern_NB_IoT.h"
20
#include "nsss_NB_IoT.h"
21 22 23

int generate_sss_NB_IoT(int32_t **txdataF,
						int16_t amp,
24
						NB_IoT_DL_FRAME_PARMS *frame_parms, 
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
						uint16_t symbol_offset, 				// symbol_offset = 3 for NB-IoT 
						uint16_t slot_offset, 
						unsigned short frame_number, 			// new attribute (Get value from higher layer), it does not exist for LTE
						unsigned short RB_IoT_ID)				// new attribute (values are between 0.. Max_RB_number-1), it does not exist for LTE
{
	uint8_t aa,Nid_NB_IoT,Nid2,f,q,s,c,u;
	int16_t *d;
	uint16_t n_f;
	unsigned short a;
	uint16_t slot_id;  						// slot_id = 17 in NB_IoT
	unsigned short bandwidth_even_odd;
	unsigned short NB_IoT_start;
  
	n_f = frame_number;
	Nid_NB_IoT = frame_parms->Nid_cell;     // supposing Cell_Id of LTE = Cell_Id of NB-IoT  // if different , NB_IOT_DL_FRAME_PARMS should be includes as attribute
  
	f = (n_f/2) % 4;   						// f = 0, 1, 2, 3
	q = Nid_NB_IoT/126; 					// q = 0, 1, 2, 3
	u = (Nid_NB_IoT % 126); 
  
	Nid2 = q*4 + f; 						// Nid2 = 0..15
  
	switch (Nid2) {
	case 0:
		d = d0f0;
		break;
	case 1:
		d = d0f1;
		break;
	case 2:
		d = d0f2;
		break;
	case 3:
		d = d0f3;
		break;
	case 4:
		d = d1f0;
		break;
	case 5:
		d = d1f1;
		break;
	case 6:
		d = d1f2;
		break;
	case 7:
		d = d1f3;
		break;
	case 8:
		d = d2f0;
		break;
	case 9:
		d = d2f1;
		break;
	case 10:
		d = d2f2;
		break;
	case 11:
		d = d2f3;
	case 12:
		d = d3f0;
		break;
	case 13:
		d = d3f1;
		break;
	case 14:
		d = d3f2;
		break;
	case 15:
		d = d3f3;
		break;

	default:
		msg("[NSSS] ERROR\n");
		return(-1);
	}

	slot_id = slot_offset;
   
	//  Signal amplitude
104
	a = (frame_parms->nb_antennas_tx == 1) ? amp: (amp*ONE_OVER_SQRT2_Q15_NB_IoT)>>15;
105 106 107 108 109 110 111 112
   
	// Testing if the total number of RBs is even or odd (i.e. Identification of the bandwidth: 1.4, 3, 5, 10, ... MHz)
	bandwidth_even_odd = frame_parms->N_RB_DL % 2;  		// 0 even, 1 odd

	for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {

		if(RB_IoT_ID < (frame_parms->N_RB_DL/2))
		{
113
			NB_IoT_start = frame_parms->ofdm_symbol_size - 12*(frame_parms->N_RB_DL/2) - (bandwidth_even_odd*6) + 12*(RB_IoT_ID%(int)(ceil(frame_parms->N_RB_DL/(float)2)));
114
		} else {
115
			NB_IoT_start = (bandwidth_even_odd*6) + 12*(RB_IoT_ID%(int)(ceil(frame_parms->N_RB_DL/(float)2)));
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
		}
		// For the In-band or Stand-alone case the REs of NPSS signal have the same positions
		for (s=0; s<11; s++ ) 								// loop on OFDM symbols
		{		
			for (c=0; c<12; c++) {							// loop on NB-IoT carriers
			
				((short*)txdataF[aa])[2*( (slot_id*7*frame_parms->ofdm_symbol_size) + ((symbol_offset+s)*frame_parms->ofdm_symbol_size) + NB_IoT_start + c )] =
			
										(a * d[(2*u*132) + (2*c) + (2*s*12) ]) >> 15;
										
				((short*)txdataF[aa])[2*( (slot_id*7*frame_parms->ofdm_symbol_size) + ((symbol_offset+s)*frame_parms->ofdm_symbol_size) + NB_IoT_start + c )+1] =
			
										(a * d[(2*u*132) + (2*c) + (2*s*12) + 1]) >> 15;

			}
		}
	}
  return(0);
}