aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Tsou <tom@tsou.cc>2013-09-02 14:39:35 +0800
committerThomas Tsou <tom@tsou.cc>2013-09-05 06:07:50 -0400
commitfb6e75789b9a87065814b4caf8c5cad77f253df6 (patch)
tree35cf621e3762d932d6930b4b3b34a74f7f3dba87
parent23ee9002b4cafa22b3a905d1b9dda7eafd8dc90d (diff)
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 and/or input scaling levels. This patch switches solely to correlation based gating for burst detection. The main computational load with this approach is sub-sample peak interpolation, which we disable during intial detection. Signed-off-by: Thomas Tsou <tom@tsou.cc>
-rw-r--r--Transceiver52M/Transceiver.cpp4
-rw-r--r--Transceiver52M/sigProcLib.cpp32
2 files changed, 32 insertions, 4 deletions
diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp
index 27e9c12..46c7213 100644
--- a/Transceiver52M/Transceiver.cpp
+++ b/Transceiver52M/Transceiver.cpp
@@ -138,7 +138,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;
@@ -153,7 +153,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 == DriveLoop::TSC) {
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;