srsLTE/lib/include/srslte/phy/sync/sync.h

209 lines
6.8 KiB
C
Raw Normal View History

/**
2014-01-28 03:41:17 -08:00
*
* \section COPYRIGHT
2014-01-28 03:41:17 -08:00
*
2015-11-13 04:22:33 -08:00
* Copyright 2013-2015 Software Radio Systems Limited
*
* \section LICENSE
*
* This file is part of the srsLTE library.
*
* srsLTE is free software: you can redistribute it and/or modify
2015-05-08 08:05:40 -07:00
* it under the terms of the GNU Affero 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 03:41:17 -08:00
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2015-05-08 08:05:40 -07:00
* GNU Affero General Public License for more details.
2014-01-28 03:41:17 -08:00
*
2015-05-08 08:05:40 -07:00
* A copy of the GNU Affero 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 03:41:17 -08:00
*/
/******************************************************************************
* File: sync.h
*
* Description: Time and frequency synchronization using the PSS and SSS signals.
*
* The object is designed to work with signals sampled at 1.92 Mhz
* centered at the carrier frequency. Thus, downsampling is required
* if the signal is sampled at higher frequencies.
*
* Correlation peak is detected comparing the maximum at the output
* of the correlator with a threshold. The comparison accepts two
* modes: absolute value or peak-to-mean ratio, which are configured
* with the functions sync_pss_det_absolute() and sync_pss_det_peakmean().
*
*
* Reference: 3GPP TS 36.211 version 10.0.0 Release 10 Sec. 6.11.1, 6.11.2
*****************************************************************************/
2014-01-28 03:41:17 -08:00
#ifndef SYNC_
#define SYNC_
2014-03-27 09:31:25 -07:00
#include <stdbool.h>
#include <math.h>
2014-03-27 09:31:25 -07:00
#include "srslte/config.h"
2017-05-18 00:48:24 -07:00
#include "srslte/phy/sync/pss.h"
#include "srslte/phy/sync/sss.h"
#include "srslte/phy/sync/cfo.h"
#include "srslte/phy/sync/cp.h"
2014-01-28 03:41:17 -08:00
2015-03-18 11:14:24 -07:00
#define SRSLTE_SYNC_FFT_SZ_MIN 64
#define SRSLTE_SYNC_FFT_SZ_MAX 2048
2014-12-09 15:29:48 -08:00
typedef enum {SSS_DIFF=0, SSS_PARTIAL_3=2, SSS_FULL=1} sss_alg_t;
typedef struct SRSLTE_API {
2015-03-18 11:14:24 -07:00
srslte_pss_synch_t pss;
srslte_pss_synch_t pss_i[2];
2015-03-18 11:14:24 -07:00
srslte_sss_synch_t sss;
srslte_cp_synch_t cp_synch;
cf_t *cfo_i_corr[2];
int decimate;
float threshold;
2014-07-21 08:54:25 -07:00
float peak_value;
uint32_t N_id_2;
uint32_t N_id_1;
uint32_t sf_idx;
uint32_t fft_size;
uint32_t frame_size;
uint32_t max_offset;
2015-11-10 08:13:08 -08:00
bool enable_cfo_corr;
2014-12-09 15:29:48 -08:00
float mean_cfo;
float mean_cfo2;
int cfo_i;
bool find_cfo_i;
2016-01-21 00:59:48 -08:00
bool find_cfo_i_initiated;
float cfo_ema_alpha;
uint32_t nof_symbols;
uint32_t cp_len;
2015-03-18 11:14:24 -07:00
srslte_cfo_t cfocorr;
srslte_cfo_t cfocorr2;
2014-12-09 15:29:48 -08:00
sss_alg_t sss_alg;
2014-06-17 02:11:41 -07:00
bool detect_cp;
bool sss_en;
2015-03-18 05:41:50 -07:00
srslte_cp_t cp;
uint32_t m0;
uint32_t m1;
float m0_value;
float m1_value;
float M_norm_avg;
float M_ext_avg;
cf_t *temp;
2015-03-18 11:14:24 -07:00
}srslte_sync_t;
2014-01-28 03:41:17 -08:00
typedef enum {
SRSLTE_SYNC_FOUND = 1,
SRSLTE_SYNC_FOUND_NOSPACE = 2,
SRSLTE_SYNC_NOFOUND = 0,
SRSLTE_SYNC_ERROR = -1
} srslte_sync_find_ret_t;
2014-03-27 09:31:25 -07:00
2015-03-18 11:14:24 -07:00
SRSLTE_API int srslte_sync_init(srslte_sync_t *q,
uint32_t frame_size,
uint32_t max_offset,
2015-03-18 11:14:24 -07:00
uint32_t fft_size);
SRSLTE_API int srslte_sync_init_decim(srslte_sync_t *q,
uint32_t frame_size,
uint32_t max_offset,
uint32_t fft_size,
int decimate);
2015-03-18 11:14:24 -07:00
SRSLTE_API void srslte_sync_free(srslte_sync_t *q);
2014-03-27 09:31:25 -07:00
2015-03-18 11:14:24 -07:00
SRSLTE_API void srslte_sync_reset(srslte_sync_t *q);
/* Finds a correlation peak in the input signal around position find_offset */
SRSLTE_API srslte_sync_find_ret_t srslte_sync_find(srslte_sync_t *q,
cf_t *input,
uint32_t find_offset,
uint32_t *peak_position);
2014-12-09 15:29:48 -08:00
/* Estimates the CP length */
2015-03-18 11:14:24 -07:00
SRSLTE_API srslte_cp_t srslte_sync_detect_cp(srslte_sync_t *q,
cf_t *input,
uint32_t peak_pos);
2014-12-09 15:29:48 -08:00
2014-03-27 09:31:25 -07:00
/* Sets the threshold for peak comparison */
2015-03-18 11:14:24 -07:00
SRSLTE_API void srslte_sync_set_threshold(srslte_sync_t *q,
float threshold);
/* Gets the subframe idx (0 or 5) */
2015-03-18 11:14:24 -07:00
SRSLTE_API uint32_t srslte_sync_get_sf_idx(srslte_sync_t *q);
2014-03-27 09:31:25 -07:00
/* Gets the last peak value */
2015-03-18 11:14:24 -07:00
SRSLTE_API float srslte_sync_get_last_peak_value(srslte_sync_t *q);
/* Gets the mean peak value */
2015-03-18 11:14:24 -07:00
SRSLTE_API float srslte_sync_get_peak_value(srslte_sync_t *q);
2014-12-09 15:29:48 -08:00
/* Choose SSS detection algorithm */
2015-03-18 11:14:24 -07:00
SRSLTE_API void srslte_sync_set_sss_algorithm(srslte_sync_t *q,
sss_alg_t alg);
2014-12-09 15:29:48 -08:00
/* Sets PSS exponential averaging alpha weight */
2015-03-18 11:14:24 -07:00
SRSLTE_API void srslte_sync_set_em_alpha(srslte_sync_t *q,
float alpha);
/* Sets the N_id_2 to search for */
2015-03-18 11:14:24 -07:00
SRSLTE_API int srslte_sync_set_N_id_2(srslte_sync_t *q,
uint32_t N_id_2);
2014-03-27 09:31:25 -07:00
/* Gets the Physical CellId from the last call to synch_run() */
2015-03-18 11:14:24 -07:00
SRSLTE_API int srslte_sync_get_cell_id(srslte_sync_t *q);
2014-03-27 09:31:25 -07:00
/* Gets the CFO estimation from the last call to synch_run() */
2015-03-18 11:14:24 -07:00
SRSLTE_API float srslte_sync_get_cfo(srslte_sync_t *q);
/* Sets known CFO to avoid long transients due to average */
SRSLTE_API void srslte_sync_set_cfo(srslte_sync_t *q, float cfo);
/* Set integer CFO */
SRSLTE_API void srslte_sync_set_cfo_i(srslte_sync_t *q,
int cfo_i);
2015-11-10 08:13:08 -08:00
SRSLTE_API void srslte_sync_set_cfo_enable(srslte_sync_t *q,
bool enable);
/* Sets the exponential moving average coefficient for CFO averaging */
SRSLTE_API void srslte_sync_set_cfo_ema_alpha(srslte_sync_t *q,
float alpha);
2014-03-27 09:31:25 -07:00
/* Gets the CP length estimation from the last call to synch_run() */
2015-03-18 11:14:24 -07:00
SRSLTE_API srslte_cp_t srslte_sync_get_cp(srslte_sync_t *q);
/* Sets the CP length estimation (must do it if disabled) */
2015-03-18 11:14:24 -07:00
SRSLTE_API void srslte_sync_set_cp(srslte_sync_t *q,
srslte_cp_t cp);
/* Enable integer CFO detection */
SRSLTE_API void srslte_sync_cfo_i_detec_en(srslte_sync_t *q,
bool enabled);
/* Enables/Disables SSS detection */
2015-03-18 11:14:24 -07:00
SRSLTE_API void srslte_sync_sss_en(srslte_sync_t *q,
bool enabled);
SRSLTE_API srslte_pss_synch_t* srslte_sync_get_cur_pss_obj(srslte_sync_t *q);
2015-03-18 11:14:24 -07:00
SRSLTE_API bool srslte_sync_sss_detected(srslte_sync_t *q);
2015-03-18 11:14:24 -07:00
SRSLTE_API bool srslte_sync_sss_is_en(srslte_sync_t *q);
2014-12-09 15:29:48 -08:00
/* Enables/Disables CP detection */
2015-03-18 11:14:24 -07:00
SRSLTE_API void srslte_sync_cp_en(srslte_sync_t *q,
bool enabled);
2014-01-28 03:41:17 -08:00
#endif // SYNC_
2014-01-28 03:41:17 -08:00