From 8181b0104acd78f8e4a1ddb6df105cab24bba4c1 Mon Sep 17 00:00:00 2001 From: Thomas Tsou Date: Tue, 20 Aug 2013 21:17:19 -0400 Subject: Transceiver52M: Disable energy detector The adaptive energy threshold gating suffers a near-far problem at certain gain levels. This is due to exponential threshold raising, but linear decreases. A large signal level followed by a period low signal level causes (comparatively) weak signals to go undetected. Additionally, the algorithm performs differently at multiple RF gain levels. This patch switches solely to correlation based gating for burst detection. The main computational load with this approach is sub-sample width peak interpolation, which we disable for intial detection and run after threshold passing. Signed-off-by: Thomas Tsou --- Transceiver52M/Transceiver.cpp | 3 ++- Transceiver52M/sigProcLib.cpp | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 4 deletions(-) (limited to 'Transceiver52M') diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp index f09f036..ad048ee 100644 --- a/Transceiver52M/Transceiver.cpp +++ b/Transceiver52M/Transceiver.cpp @@ -327,6 +327,7 @@ SoftVector *Transceiver::pullRadioVector(GSM::Time &wTime, complex amplitude = 0.0; float TOA = 0.0; float avgPwr = 0.0; +#ifdef ENERGY_DETECT if (!energyDetect(*vectorBurst, 20 * mSPS, mEnergyThreshold, &avgPwr)) { LOG(DEBUG) << "Estimated Energy: " << sqrt(avgPwr) << ", at time " << rxBurst->getTime(); double framesElapsed = rxBurst->getTime()-prevFalseDetectionTime; @@ -341,7 +342,7 @@ SoftVector *Transceiver::pullRadioVector(GSM::Time &wTime, return NULL; } LOG(DEBUG) << "Estimated Energy: " << sqrt(avgPwr) << ", at time " << rxBurst->getTime(); - +#endif // run the proper correlator bool success = false; if (corrType==TSC) { diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp index a647f84..b0ef21a 100644 --- a/Transceiver52M/sigProcLib.cpp +++ b/Transceiver52M/sigProcLib.cpp @@ -653,8 +653,27 @@ complex interpolatePoint(const signalVector &inSig, return pVal; } - - +static complex fastPeakDetect(const signalVector &rxBurst, float *index) +{ + float val, max = 0.0f; + complex amp; + int _index = -1; + + for (int i = 0; i < rxBurst.size(); i++) { + val = rxBurst[i].norm2(); + if (val > max) { + max = val; + _index = i; + amp = rxBurst[i]; + } + } + + if (index) + *index = (float) _index; + + return amp; +} + complex peakDetect(const signalVector &rxBurst, float *peakIndex, float *avgPwr) @@ -928,12 +947,15 @@ int detectRACHBurst(signalVector &rxBurst, return -1; } - _amp = peakDetect(corr, &_toa, NULL); + _amp = fastPeakDetect(corr, &_toa); + + /* Restrict peak-to-average calculations at the edges */ if ((_toa < 3) || (_toa > len - 3)) goto notfound; peak = corr.begin() + (int) rint(_toa); + /* Compute peak-to-average ratio. Reject if we don't have enough values */ for (int i = 2 * sps; i <= 5 * sps; i++) { if (peak - i >= corr.begin()) { avg += (peak - i)->norm2(); @@ -953,9 +975,14 @@ int detectRACHBurst(signalVector &rxBurst, if (par < thresh) goto notfound; + /* Run the full peak detection to obtain interpolated values */ + _amp = peakDetect(corr, &_toa, NULL); + /* Subtract forward tail bits from delay */ if (toa) *toa = _toa - 8 * sps; + + /* Normalize our channel gain */ if (amp) *amp = _amp / gRACHSequence->gain; -- cgit v1.2.3