/* * Copyright 2008 Free Software Foundation, Inc. * * This software is distributed under multiple licenses; see the COPYING file in the main directory for licensing information for this specific distribuion. * * This use of this software may be subject to additional restrictions. * See the LEGAL file in the main directory for details. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef SIGPROCLIB_H #define SIGPROCLIB_H #include "Vector.h" #include "Complex.h" #include "BitVector.h" #include "signalVector.h" /* Burst lengths */ #define NORMAL_BURST_NBITS 148 #define EDGE_BURST_NBITS 444 #define EDGE_BURST_NSYMS (EDGE_BURST_NBITS / 3) /** Codes for burst types of received bursts*/ enum CorrType{ OFF, ///< timeslot is off TSC, ///< timeslot should contain a normal burst EXT_RACH, ///< timeslot should contain an extended access burst RACH, ///< timeslot should contain an access burst EDGE, ///< timeslot should contain an EDGE burst IDLE ///< timeslot is an idle (or dummy) burst }; enum SignalError { SIGERR_NONE, SIGERR_BOUNDS, SIGERR_CLIP, SIGERR_UNSUPPORTED, SIGERR_INTERNAL, }; /* * Burst detection threshold * * Decision threshold value for burst gating on peak-to-average value of * correlated synchronization sequences. Lower values pass more bursts up * to upper layers but will increase the false detection rate. */ #define BURST_THRESH 4.0 /** Setup the signal processing library */ bool sigProcLibSetup(); /** Destroy the signal processing library */ void sigProcLibDestroy(void); /** Operate soft slicer on a soft-bit vector */ bool vectorSlicer(SoftVector *x); /** GMSK modulate a GSM burst of bits */ signalVector *modulateBurst(const BitVector &wBurst, int guardPeriodLength, int sps, bool emptyPulse = false); /** 8-PSK modulate a burst of bits */ signalVector *modulateEdgeBurst(const BitVector &bits, int sps, bool emptyPulse = false); /** Generate a EDGE burst with random payload - 4 SPS (625 samples) only */ signalVector *generateEdgeBurst(int tsc); /** Generate an empty burst - 4 or 1 SPS */ signalVector *generateEmptyBurst(int sps, int tn); /** Generate a normal GSM burst with random payload - 4 or 1 SPS */ signalVector *genRandNormalBurst(int tsc, int sps, int tn); /** Generate an access GSM burst with random payload - 4 or 1 SPS */ signalVector *genRandAccessBurst(int delay, int sps, int tn); /** Generate a dummy GSM burst - 4 or 1 SPS */ signalVector *generateDummyBurst(int sps, int tn); /** Apply a scalar to a vector. @param x The vector of interest. @param scale The scalar. */ void scaleVector(signalVector &x, complex scale); /** Rough energy estimator. @param rxBurst A GSM burst. @param windowLength The number of burst samples used to compute burst energy @return The average power of the received burst. */ float energyDetect(const signalVector &rxBurst, unsigned windowLength); /** 8-PSK/GMSK/RACH burst detector @param burst The received GSM burst of interest @param tsc Midamble type (0..7) also known as TSC @param threshold The threshold that the received burst's post-correlator SNR is compared against to determine validity. @param sps The number of samples per GSM symbol. @param amplitude The estimated amplitude of received TSC burst. @param toa The estimate time-of-arrival of received TSC burst (in symbols). @param max_toa The maximum expected time-of-arrival (in symbols). @return positive value (CorrType) if threshold value is reached, negative value (-SignalError) on error, zero (SIGERR_NONE) if no burst is detected */ int detectAnyBurst(const signalVector &burst, unsigned tsc, float threshold, int sps, CorrType type, complex &, float &toa, unsigned max_toa); /** Demodulate burst basde on type and output soft bits */ SoftVector *demodAnyBurst(const signalVector &burst, int sps, complex amp, float toa, CorrType type); #endif /* SIGPROCLIB_H */