aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/sigProcLib.h
diff options
context:
space:
mode:
Diffstat (limited to 'Transceiver52M/sigProcLib.h')
-rw-r--r--Transceiver52M/sigProcLib.h386
1 files changed, 386 insertions, 0 deletions
diff --git a/Transceiver52M/sigProcLib.h b/Transceiver52M/sigProcLib.h
new file mode 100644
index 0000000..f9f0dce
--- /dev/null
+++ b/Transceiver52M/sigProcLib.h
@@ -0,0 +1,386 @@
+/*
+* 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.
+
+*/
+
+
+
+#include "Vector.h"
+#include "Complex.h"
+#include "GSMTransfer.h"
+
+
+using namespace GSM;
+
+/** Indicated signalVector symmetry */
+typedef enum Symmetry {
+ NONE = 0,
+ ABSSYM = 1
+};
+
+/** Convolution type indicator */
+typedef enum ConvType {
+ FULL_SPAN = 0,
+ OVERLAP_ONLY = 1,
+ START_ONLY = 2,
+ WITH_TAIL = 3,
+ NO_DELAY = 4,
+ CUSTOM = 5,
+ UNDEFINED = 255
+};
+
+/** the core data structure of the Transceiver */
+class signalVector: public Vector<complex>
+{
+
+ private:
+
+ Symmetry symmetry; ///< the symmetry of the vector
+ bool realOnly; ///< true if vector is real-valued, not complex-valued
+
+ public:
+
+ /** Constructors */
+ signalVector(int dSize=0, Symmetry wSymmetry = NONE):
+ Vector<complex>(dSize),
+ realOnly(false)
+ {
+ symmetry = wSymmetry;
+ };
+
+ signalVector(complex* wData, size_t start,
+ size_t span, Symmetry wSymmetry = NONE):
+ Vector<complex>(NULL,wData+start,wData+start+span),
+ realOnly(false)
+ {
+ symmetry = wSymmetry;
+ };
+
+ signalVector(const signalVector &vec1, const signalVector &vec2):
+ Vector<complex>(vec1,vec2),
+ realOnly(false)
+ {
+ symmetry = vec1.symmetry;
+ };
+
+ signalVector(const signalVector &wVector):
+ Vector<complex>(wVector.size()),
+ realOnly(false)
+ {
+ wVector.copyTo(*this);
+ symmetry = wVector.getSymmetry();
+ };
+
+ /** symmetry operators */
+ Symmetry getSymmetry() const { return symmetry;};
+ void setSymmetry(Symmetry wSymmetry) { symmetry = wSymmetry;};
+
+ /** real-valued operators */
+ bool isRealOnly() const { return realOnly;};
+ void isRealOnly(bool wOnly) { realOnly = wOnly;};
+};
+
+/** Convert a linear number to a dB value */
+float dB(float x);
+
+/** Convert a dB value into a linear value */
+float dBinv(float x);
+
+/** Compute the energy of a vector */
+float vectorNorm2(const signalVector &x);
+
+/** Compute the average power of a vector */
+float vectorPower(const signalVector &x);
+
+/** Setup the signal processing library */
+void sigProcLibSetup(int samplesPerSymbol);
+
+/** Destroy the signal processing library */
+void sigProcLibDestroy(void);
+
+/**
+ Convolve two vectors.
+ @param a,b The vectors to be convolved.
+ @param c, A preallocated vector to hold the convolution result.
+ @param spanType The type/span of the convolution.
+ @return The convolution result.
+*/
+signalVector* convolve(const signalVector *a,
+ const signalVector *b,
+ signalVector *c,
+ ConvType spanType,
+ unsigned startIx = 0,
+ unsigned len = 0);
+
+/**
+ Generate the GSM pulse.
+ @param samplesPerSymbol The number of samples per GSM symbol.
+ @param symbolLength The size of the pulse.
+ @return The GSM pulse.
+*/
+signalVector* generateGSMPulse(int samplesPerSymbol,
+ int symbolLength);
+
+/**
+ Frequency shift a vector.
+ @param y The frequency shifted vector.
+ @param x The vector to-be-shifted.
+ @param freq The digital frequency shift
+ @param startPhase The starting phase of the oscillator
+ @param finalPhase The final phase of the oscillator
+ @return The frequency shifted vector.
+*/
+signalVector* frequencyShift(signalVector *y,
+ signalVector *x,
+ float freq = 0.0,
+ float startPhase = 0.0,
+ float *finalPhase=NULL);
+
+/**
+ Correlate two vectors.
+ @param a,b The vectors to be correlated.
+ @param c, A preallocated vector to hold the correlation result.
+ @param spanType The type/span of the correlation.
+ @return The correlation result.
+*/
+signalVector* correlate(signalVector *a,
+ signalVector *b,
+ signalVector *c,
+ ConvType spanType,
+ bool bReversedConjugated = false,
+ unsigned startIx = 0,
+ unsigned len = 0);
+
+/** Operate soft slicer on real-valued portion of vector */
+bool vectorSlicer(signalVector *x);
+
+/** GMSK modulate a GSM burst of bits */
+signalVector *modulateBurst(const BitVector &wBurst,
+ const signalVector &gsmPulse,
+ int guardPeriodLength,
+ int samplesPerSymbol);
+
+/** Sinc function */
+float sinc(float x);
+
+/** Delay a vector */
+void delayVector(signalVector &wBurst,
+ float delay);
+
+/** Add two vectors in-place */
+bool addVector(signalVector &x,
+ signalVector &y);
+
+/** Multiply two vectors in-place*/
+bool multVector(signalVector &x,
+ signalVector &y);
+
+/** Generate a vector of gaussian noise */
+signalVector *gaussianNoise(int length,
+ float variance = 1.0,
+ complex mean = complex(0.0));
+
+/**
+ Given a non-integer index, interpolate a sample.
+ @param inSig The signal from which to interpolate.
+ @param ix The index.
+ @return The interpolated signal value.
+*/
+complex interpolatePoint(const signalVector &inSig,
+ float ix);
+
+/**
+ Given a correlator output, locate the correlation peak.
+ @param rxBurst The correlator result.
+ @param peakIndex Pointer to value to receive interpolated peak index.
+ @param avgPower Power to value to receive mean power.
+ @return Peak value.
+*/
+complex peakDetect(const signalVector &rxBurst,
+ float *peakIndex,
+ float *avgPwr);
+
+/**
+ Apply a scalar to a vector.
+ @param x The vector of interest.
+ @param scale The scalar.
+*/
+void scaleVector(signalVector &x,
+ complex scale);
+
+/**
+ Add a constant offset to a vecotr.
+ @param x The vector of interest.
+ @param offset The offset.
+*/
+void offsetVector(signalVector &x,
+ complex offset);
+
+/**
+ Generate a modulated GSM midamble, stored within the library.
+ @param gsmPulse The GSM pulse used for modulation.
+ @param samplesPerSymbol The number of samples per GSM symbol.
+ @param TSC The training sequence [0..7]
+ @return Success.
+*/
+bool generateMidamble(signalVector &gsmPulse,
+ int samplesPerSymbol,
+ int TSC);
+/**
+ Generate a modulated RACH sequence, stored within the library.
+ @param gsmPulse The GSM pulse used for modulation.
+ @param samplesPerSymbol The number of samples per GSM symbol.
+ @return Success.
+*/
+bool generateRACHSequence(signalVector &gsmPulse,
+ int samplesPerSymbol);
+
+/**
+ Energy detector, checks to see if received burst energy is above a threshold.
+ @param rxBurst The received GSM burst of interest.
+ @param windowLength The number of burst samples used to compute burst energy
+ @param detectThreshold The detection threshold, a linear value.
+ @param avgPwr The average power of the received burst.
+ @return True if burst energy is above threshold.
+*/
+bool energyDetect(signalVector &rxBurst,
+ unsigned windowLength,
+ float detectThreshold,
+ float *avgPwr = NULL);
+
+/**
+ RACH correlator/detector.
+ @param rxBurst The received GSM burst of interest.
+ @param detectThreshold The threshold that the received burst's post-correlator SNR is compared against to determine validity.
+ @param samplesPerSymbol The number of samples per GSM symbol.
+ @param amplitude The estimated amplitude of received RACH burst.
+ @param TOA The estimate time-of-arrival of received RACH burst.
+ @return True if burst SNR is larger that the detectThreshold value.
+*/
+bool detectRACHBurst(signalVector &rxBurst,
+ float detectThreshold,
+ int samplesPerSymbol,
+ complex *amplitude,
+ float* TOA);
+
+/**
+ Normal burst correlator, detector, channel estimator.
+ @param rxBurst The received GSM burst of interest.
+
+ @param detectThreshold The threshold that the received burst's post-correlator SNR is compared against to determine validity.
+ @param samplesPerSymbol 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.
+ @param maxTOA The maximum expected time-of-arrival
+ @param requestChannel Set to true if channel estimation is desired.
+ @param channelResponse The estimated channel.
+ @param channelResponseOffset The time offset b/w the first sample of the channel response and the reported TOA.
+ @return True if burst SNR is larger that the detectThreshold value.
+*/
+bool analyzeTrafficBurst(signalVector &rxBurst,
+ unsigned TSC,
+ float detectThreshold,
+ int samplesPerSymbol,
+ complex *amplitude,
+ float *TOA,
+ unsigned maxTOA,
+ bool requestChannel = false,
+ signalVector** channelResponse = NULL,
+ float *channelResponseOffset = NULL);
+
+/**
+ Decimate a vector.
+ @param wVector The vector of interest.
+ @param decimationFactor The amount of decimation, i.e. the decimation factor.
+ @return The decimated signal vector.
+*/
+signalVector *decimateVector(signalVector &wVector,
+ int decimationFactor);
+
+/**
+ Demodulates a received burst using a soft-slicer.
+ @param rxBurst The burst to be demodulated.
+ @param gsmPulse The GSM pulse.
+ @param samplesPerSymbol The number of samples per GSM symbol.
+ @param channel The amplitude estimate of the received burst.
+ @param TOA The time-of-arrival of the received burst.
+ @return The demodulated bit sequence.
+*/
+SoftVector *demodulateBurst(signalVector &rxBurst,
+ const signalVector &gsmPulse,
+ int samplesPerSymbol,
+ complex channel,
+ float TOA);
+
+/**
+ Creates a simple Kaiser-windowed low-pass FIR filter.
+ @param cutoffFreq The digital 3dB bandwidth of the filter.
+ @param filterLen The number of taps in the filter.
+ @param gainDC The DC gain of the filter.
+ @return The desired LPF
+*/
+signalVector *createLPF(float cutoffFreq,
+ int filterLen,
+ float gainDC = 1.0);
+
+/**
+ Change sampling rate of a vector via polyphase resampling.
+ @param wVector The vector to be resampled.
+ @param P The numerator, i.e. the amount of upsampling.
+ @param Q The denominator, i.e. the amount of downsampling.
+ @param LPF An optional low-pass filter used in the resampling process.
+ @return A vector resampled at P/Q of the original sampling rate.
+*/
+signalVector *polyphaseResampleVector(signalVector &wVector,
+ int P, int Q,
+ signalVector *LPF);
+
+/**
+ Change the sampling rate of a vector via linear interpolation.
+ @param wVector The vector to be resampled.
+ @param expFactor Ratio of new sampling rate/original sampling rate.
+ @param endPoint ???
+ @return A vector resampled a expFactor*original sampling rate.
+*/
+signalVector *resampleVector(signalVector &wVector,
+ float expFactor,
+ complex endPoint);
+
+/**
+ Design the necessary filters for a decision-feedback equalizer.
+ @param channelResponse The multipath channel that we're mitigating.
+ @param SNRestimate The signal-to-noise estimate of the channel, a linear value
+ @param Nf The number of taps in the feedforward filter.
+ @param feedForwardFilter The designed feed forward filter.
+ @param feedbackFilter The designed feedback filter.
+ @return True if DFE can be designed.
+*/
+bool designDFE(signalVector &channelResponse,
+ float SNRestimate,
+ int Nf,
+ signalVector **feedForwardFilter,
+ signalVector **feedbackFilter);
+
+/**
+ Equalize/demodulate a received burst via a decision-feedback equalizer.
+ @param rxBurst The received burst to be demodulated.
+ @param TOA The time-of-arrival of the received burst.
+ @param samplesPerSymbol The number of samples per GSM symbol.
+ @param w The feed forward filter of the DFE.
+ @param b The feedback filter of the DFE.
+ @return The demodulated bit sequence.
+*/
+SoftVector *equalizeBurst(signalVector &rxBurst,
+ float TOA,
+ int samplesPerSymbol,
+ signalVector &w,
+ signalVector &b);