srsRAN/srslte/include/srslte/common/phy_common.h

230 lines
6.5 KiB
C
Raw Normal View History

/**
2014-01-28 11:41:17 +00:00
*
* \section COPYRIGHT
2014-01-28 11:41:17 +00:00
*
* Copyright 2013-2014 The srsLTE Developers. See the
* COPYRIGHT file at the top-level directory of this distribution.
*
* \section LICENSE
*
* This file is part of the srsLTE library.
*
* srsLTE is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* srsLTE is distributed in the hope that it will be useful,
2014-01-28 11:41:17 +00:00
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* A copy of the GNU Lesser General Public License can be found in
* the LICENSE file in the top-level directory of this distribution
* and at http://www.gnu.org/licenses/.
*
2014-01-28 11:41:17 +00:00
*/
2014-01-28 11:41:17 +00:00
#ifndef _LTEBASE_
#define _LTEBASE_
2014-10-24 10:06:04 +00:00
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
2014-12-09 23:29:48 +00:00
#include <math.h>
#include "srslte/config.h"
2015-03-18 12:41:50 +00:00
#define SRSLTE_NSUBFRAMES_X_FRAME 10
#define SRSLTE_NSLOTS_X_FRAME (2*SRSLTE_NSUBFRAMES_X_FRAME)
2014-01-28 11:41:17 +00:00
2014-06-17 14:32:19 +00:00
#define LTE_NSOFT_BITS 250368 // Soft buffer size for Category 1 UE
2015-03-18 12:41:50 +00:00
#define SRSLTE_MAX_PORTS 4
2014-06-17 09:11:41 +00:00
#define MAX_LAYERS 8
2014-06-17 14:32:19 +00:00
#define MAX_CODEWORDS 2
2014-01-28 11:41:17 +00:00
2014-06-17 09:11:41 +00:00
#define LTE_CRC24A 0x1864CFB
#define LTE_CRC24B 0X1800063
#define LTE_CRC16 0x11021
#define LTE_CRC8 0x19B
2015-03-18 12:41:50 +00:00
typedef enum {CPNORM, CPEXT} srslte_cp_t;
2014-01-28 11:41:17 +00:00
#define CRNTI_START 0x003D
#define CRNTI_END 0xFFF3
#define RARNTI_START 0x0001
#define RARNTI_END 0x003C
#define SIRNTI 0xFFFF
#define PRNTI 0xFFFE
#define MRNTI 0xFFFD
2014-04-17 10:28:21 +00:00
#define CELL_ID_UNKNOWN 1000
#define MAX_NSYMB 7
2014-01-28 11:41:17 +00:00
#define MAX_PRB 110
#define RE_X_RB 12
#define SYMBOL_SZ_MAX 2048
2015-03-18 12:41:50 +00:00
#define SRSLTE_CPNORM_NSYMB 7
#define CPNORM_SF_NSYMB (2*SRSLTE_CPNORM_NSYMB)
#define CPNORM_0_LEN 160
#define CPNORM_LEN 144
2014-01-28 11:41:17 +00:00
#define CPEXT_NSYMB 6
2014-08-02 00:38:47 +00:00
#define CPEXT_SF_NSYMB (2*CPEXT_NSYMB)
#define CPEXT_LEN 512
#define CPEXT_7_5_LEN 1024
2014-01-28 11:41:17 +00:00
#define CP_ISNORM(cp) (cp==CPNORM)
#define CP_ISEXT(cp) (cp==CPEXT)
2015-03-18 12:41:50 +00:00
#define CP_NSYMB(cp) (CP_ISNORM(cp)?SRSLTE_CPNORM_NSYMB:CPEXT_NSYMB)
2014-01-28 11:41:17 +00:00
2014-12-09 23:29:48 +00:00
#define CP(symbol_sz, c) ((int) ceil((((float) (c)*(symbol_sz))/2048)))
2014-08-02 00:38:47 +00:00
#define CP_NORM(symbol, symbol_sz) ((symbol==0)?CP((symbol_sz),CPNORM_0_LEN):CP((symbol_sz),CPNORM_LEN))
#define CP_EXT(symbol_sz) (CP((symbol_sz),CPEXT_LEN))
2014-01-28 11:41:17 +00:00
#define SLOT_LEN(symbol_sz) (480*((symbol_sz)/64))
#define SF_LEN(symbol_sz) (2*SLOT_LEN(symbol_sz))
2014-08-02 00:38:47 +00:00
#define SF_LEN_MAX (SF_LEN(SYMBOL_SZ_MAX))
2014-01-28 11:41:17 +00:00
2014-10-24 10:06:04 +00:00
#define SLOT_LEN_PRB(nof_prb) (SLOT_LEN(lte_symbol_sz(nof_prb)))
#define SF_LEN_PRB(nof_prb) (SF_LEN(lte_symbol_sz(nof_prb)))
#define SLOT_LEN_RE(nof_prb, cp) (nof_prb*RE_X_RB*CP_NSYMB(cp))
#define SF_LEN_RE(nof_prb, cp) (2*SLOT_LEN_RE(nof_prb, cp))
2014-01-28 11:41:17 +00:00
2015-03-17 17:26:23 +00:00
#define TA_OFFSET (10e-6)
2015-03-09 10:53:15 +00:00
#define LTE_TS 1.0/(15000.0*2048)
2015-03-06 12:51:02 +00:00
#define SLOT_IDX_CPNORM(symbol_idx, symbol_sz) (symbol_idx==0?0:(symbol_sz + CP(symbol_sz, CPNORM_0_LEN) + \
(symbol_idx-1)*(symbol_sz+CP(symbol_sz, CPNORM_LEN))))
#define SLOT_IDX_CPEXT(idx, symbol_sz) (idx*(symbol_sz+CP(symbol_sz, CPEXT_LEN)))
2014-01-28 11:41:17 +00:00
#define RE_IDX(nof_prb, symbol_idx, sample_idx) ((symbol_idx)*(nof_prb)*(RE_X_RB) + sample_idx)
2014-01-28 11:41:17 +00:00
#define RS_VSHIFT(cell_id) (cell_id%6)
2014-06-17 14:32:19 +00:00
#define GUARD_RE(nof_prb) ((lte_symbol_sz(nof_prb)-nof_prb*RE_X_RB)/2)
2014-01-28 11:41:17 +00:00
#define SYMBOL_HAS_REF(l, cp, nof_ports) ((l == 1 && nof_ports == 4) \
|| l == 0 \
|| l == CP_NSYMB(cp) - 3)
2014-01-28 11:41:17 +00:00
2014-06-17 14:32:19 +00:00
#define NOF_LTE_BANDS 29
2014-01-28 11:41:17 +00:00
2014-05-13 15:00:49 +00:00
#define NOF_TC_CB_SIZES 188
typedef _Complex float cf_t;
typedef enum SRSLTE_API { PHICH_NORM = 0, PHICH_EXT} phich_length_t;
typedef enum SRSLTE_API { R_1_6 = 0, R_1_2, R_1, R_2} phich_resources_t;
2014-10-17 18:16:20 +00:00
typedef struct SRSLTE_API {
uint32_t nof_prb;
uint32_t nof_ports;
uint32_t bw_idx;
uint32_t id;
2015-03-18 12:41:50 +00:00
srslte_cp_t cp;
2014-10-17 18:16:20 +00:00
phich_length_t phich_length;
phich_resources_t phich_resources;
2015-03-18 12:41:50 +00:00
}srslte_cell_t;
typedef enum SRSLTE_API {
2014-06-17 09:11:41 +00:00
SINGLE_ANTENNA,TX_DIVERSITY, SPATIAL_MULTIPLEX
} lte_mimo_type_t;
typedef enum SRSLTE_API {
LTE_BPSK = 0, LTE_QPSK = 1, LTE_QAM16 = 2, LTE_QAM64 = 3
} lte_mod_t;
typedef struct SRSLTE_API {
2014-06-17 09:11:41 +00:00
int id;
float fd;
2015-02-16 07:55:17 +00:00
} lte_earfcn_t;
2014-01-28 11:41:17 +00:00
2015-03-11 08:52:13 +00:00
enum band_geographical_area {
2014-06-17 09:11:41 +00:00
ALL, NAR, APAC, EMEA, JAPAN, CALA, NA
2014-01-28 11:41:17 +00:00
};
2015-03-18 12:41:50 +00:00
SRSLTE_API bool lte_cell_isvalid(srslte_cell_t *cell);
SRSLTE_API void lte_cell_fprint(FILE *stream,
2015-03-18 12:41:50 +00:00
srslte_cell_t *cell);
2014-10-24 10:06:04 +00:00
SRSLTE_API bool lte_cellid_isvalid(uint32_t cell_id);
2014-11-05 13:19:35 +00:00
SRSLTE_API bool lte_nofprb_isvalid(uint32_t nof_prb);
2014-11-05 13:19:35 +00:00
SRSLTE_API bool lte_sfidx_isvalid(uint32_t sf_idx);
2014-11-05 13:19:35 +00:00
SRSLTE_API bool lte_portid_isvalid(uint32_t port_id);
2014-11-05 13:19:35 +00:00
SRSLTE_API bool lte_N_id_2_isvalid(uint32_t N_id_2);
SRSLTE_API bool lte_N_id_1_isvalid(uint32_t N_id_1);
SRSLTE_API bool lte_symbol_sz_isvalid(uint32_t symbol_sz);
SRSLTE_API int lte_symbol_sz(uint32_t nof_prb);
SRSLTE_API int lte_sampling_freq_hz(uint32_t nof_prb);
SRSLTE_API uint32_t lte_re_x_prb(uint32_t ns,
uint32_t symbol,
uint32_t nof_ports,
uint32_t nof_symbols);
SRSLTE_API uint32_t lte_voffset(uint32_t symbol_id,
uint32_t cell_id,
uint32_t nof_ports);
SRSLTE_API uint32_t lte_N_ta_new_rar(uint32_t ta);
SRSLTE_API uint32_t lte_N_ta_new(uint32_t N_ta_old,
uint32_t ta);
SRSLTE_API int lte_cb_size(uint32_t index);
SRSLTE_API bool lte_cb_size_isvalid(uint32_t size);
2015-03-18 12:41:50 +00:00
SRSLTE_API char *lte_cp_string(srslte_cp_t cp);
SRSLTE_API char *lte_mod_string(lte_mod_t mod);
SRSLTE_API uint32_t lte_mod_bits_x_symbol(lte_mod_t mod);
SRSLTE_API int lte_find_cb_index(uint32_t long_cb);
2014-05-13 15:00:49 +00:00
SRSLTE_API float lte_band_fd(uint32_t earfcn);
2014-01-28 11:41:17 +00:00
SRSLTE_API int lte_band_get_fd_band(uint32_t band,
lte_earfcn_t *earfcn,
int earfcn_start,
int earfcn_end,
uint32_t max_elems);
SRSLTE_API int lte_band_get_fd_band_all(uint32_t band,
lte_earfcn_t *earfcn,
uint32_t max_nelems);
SRSLTE_API int lte_band_get_fd_region(enum band_geographical_area region,
lte_earfcn_t *earfcn,
uint32_t max_elems);
SRSLTE_API int lte_str2mimotype(char *mimo_type_str,
lte_mimo_type_t *type);
SRSLTE_API char *lte_mimotype2str(lte_mimo_type_t type);
2014-01-28 11:41:17 +00:00
2014-01-28 11:41:17 +00:00
#endif