airprobe/gsm-tvoid/src/lib/gsm_burst.h

194 lines
5.1 KiB
C++
Executable File

#ifndef INCLUDED_GSM_BURST_H
#define INCLUDED_GSM_BURST_H
//TODO: rename to gsm_burst_receiver ? use gsm_burst as encapsulation of an actual burst, incl bbuf, etc.
// need to determine what is a decoder vs. burst function. E.g. calc_freq_offset
// everything but I/O & clocking & sync_state?
// What about handling complex&diff&bin data?
#include "gsm_constants.h"
#include <gr_math.h>
#include <gr_feval.h>
#include "gsmstack.h"
//Testing Modes
//Tune test measures hopping latency by hopping between good and empty ARFCNs
#define TEST_HOP_SPEED
//Test Options
#define OPT_TEST_HOP_SPEED 0x00000001
//Console printing options
#define PRINT_NOTHING 0x00000000
#define PRINT_EVERYTHING 0x7FFFFFFF //7 for SWIG overflow check work around
#define PRINT_BITS 0x00000001
#define PRINT_ALL_BITS 0x00000002
#define PRINT_CORR_BITS 0x00000004
#define PRINT_STATE 0x00000008
#define PRINT_ALL_TYPES 0x00000FF0
#define PRINT_KNOWN 0x00000FE0
#define PRINT_UNKNOWN 0x00000010
#define PRINT_TS0 0x00000020
#define PRINT_FCCH 0x00000040
#define PRINT_SCH 0x00000080
#define PRINT_DUMMY 0x00000100
#define PRINT_NORMAL 0x00000200
#define PRINT_GSM_DECODE 0x00004000
#define PRINT_HEX 0x00001000
//Timing/clock options
#define QB_NONE 0x00000000
#define QB_QUARTER 0x00000001 //only for internal clocked versions
#define QB_FULL04 0x00000003
#define QB_MASK 0x0000000F
#define CLK_CORR_TRACK 0x00000010 //adjust timing based on correlation offsets
#define DEFAULT_CLK_OPTS ( QB_QUARTER | CLK_CORR_TRACK )
#define SIGNUM(x) ((x>0)-(x<0))
#define BBUF_SIZE TS_BITS
// Center bursts in the TS, splitting the guard period
//
// +--+--+---...-----+--...---+----...----+--+--+
// G T D1 TS D2 T G
// Start ^
//#define MAX_SYNC_WAIT 32 //Number of missed bursts before reverting to WAIT_FCCH.
#define MAX_SYNC_WAIT 64 //Number of missed bursts before reverting to WAIT_FCCH.
#define MAX_CORR_DIST 7 // 4 + 3 = 1/2 GUARD + TAIL
#define SCH_CORR_THRESHOLD 0.80
#define FCCH_CORR_THRESHOLD 0.90
#define NORM_CORR_THRESHOLD 0.80
#define FCCH_HITS_NEEDED (USEFUL_BITS - 4)
#define FCCH_MAX_MISSES 1
enum EQ_TYPE {
EQ_NONE,
EQ_FIXED_LINEAR,
EQ_ADAPTIVE_LINEAR,
EQ_FIXED_DFE,
EQ_ADAPTIVE_DFE,
EQ_ADAPT_TRAINING,
EQ_VITERBI
};
#define BURST_CB_SYNC_OFFSET 1
#define BURST_CB_ADJ_OFFSET 2
#define BURST_CB_TUNE 3
class gsm_burst;
class gsm_burst
{
protected:
gsm_burst(gr_feval_ll *t);
//Burst Buffer: Storage for burst data
float d_burst_buffer[BBUF_SIZE];
int d_bbuf_pos; //write position
int d_burst_start; //first useful bit (beginning of output)
unsigned long d_sample_count; //sample count at end (TODO:beginning) of BBUF (bit count if external clock)
unsigned long d_last_burst_s_count; //sample count from previous burst
unsigned char d_decoded_burst[USEFUL_BITS]; //Differentially Decoded burst buffer {0,1}
///// Sync/training sequence correlation
float corr_sync[N_SYNC_BITS]; //encoded sync bits for correlation
float corr_train_seq[10][N_TRAIN_BITS];
const float *d_corr_pattern;
int d_corr_pat_size;
float d_corr_max;
int d_corr_maxpos;
int d_corr_center;
///// GSM Stack
GS_CTX d_gs_ctx;
///// Burst information
SYNC_STATE d_sync_state;
SYNC_STATE d_last_sync_state;
BURST_TYPE d_burst_type;
unsigned d_ts; //timeslot 0-7
unsigned long d_last_good; //Burst count of last good burst
unsigned long d_burst_count; //Bursts received starting w/ initial FCCH reset after lost sync
unsigned long d_last_sch; //Burst count of last SCH
int d_color_code;
float d_freq_offset;
float d_freq_off_sum;
float d_freq_off_weight;
gr_feval_ll *p_tuner;
//////// Methods
int get_burst(void);
BURST_TYPE get_fcch_burst(void);
BURST_TYPE get_sch_burst(void);
BURST_TYPE get_norm_burst(void);
virtual void shift_burst(int);
void calc_freq_offset(void);
virtual void equalize(void);
float correlate_pattern(const float *,const int,const int,const int);
void diff_decode_burst(void);
void sync_reset(void);
void print_bits(const float *data,int length);
void print_hex(const unsigned char *data,int length);
// void soft2hardbit(char *dst, const float *data, int len); //need this?
void print_burst(void);
void diff_encode(const float *in,float *out,int length,float lastbit = 1.0);
void diff_decode(const float *in,float *out,int length,float lastbit = 1.0);
public:
virtual ~gsm_burst ();
////// General Stats
//TODO: Maybe there should be a burst_stats class?
long d_sync_loss_count;
long d_fcch_count;
long d_part_sch_count;
long d_sch_count;
long d_normal_count;
long d_dummy_count;
long d_unknown_count;
long d_total_count;
////// Options
unsigned long d_test_options;
unsigned long d_clock_options;
unsigned long d_print_options;
EQ_TYPE d_equalizer_type;
//Hop speed info
long d_hop_good_arfcn;
long d_hop_bad_arfcn;
//Methods
void full_reset(void);
int sync_state() { return d_sync_state;}
//Frequency
float last_freq_offset() {return d_freq_offset;}
float mean_freq_offset(void);
long next_arfcn;
};
#endif /* INCLUDED_GSM_BURST_H */