diff options
Diffstat (limited to 'Transceiver52M/sigProcLib.cpp')
-rw-r--r-- | Transceiver52M/sigProcLib.cpp | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp index bfcf5a4..b34c580 100644 --- a/Transceiver52M/sigProcLib.cpp +++ b/Transceiver52M/sigProcLib.cpp @@ -684,7 +684,26 @@ 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, @@ -959,12 +978,16 @@ int detectRACHBurst(signalVector &rxBurst, return -1; } - _amp = peakDetect(corr, &_toa, NULL); + /* Perform fast peak detection (no interpolation) for initial gating */ + _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(); @@ -984,9 +1007,14 @@ int detectRACHBurst(signalVector &rxBurst, if (par < thresh) goto notfound; + /* Run the full peak detection to obtain when we have a burst */ + _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; |