diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp index fbdba8e..2e29164 100644 --- a/Transceiver52M/Transceiver.cpp +++ b/Transceiver52M/Transceiver.cpp @@ -350,6 +350,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; @@ -364,7 +365,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 93f7bc6..3f34fa2 100644 --- a/Transceiver52M/sigProcLib.cpp +++ b/Transceiver52M/sigProcLib.cpp @@ -651,8 +651,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) @@ -926,12 +945,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(); @@ -951,9 +973,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;