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>
This commit is contained in:
Thomas Tsou
2013-09-02 14:39:35 +08:00
parent 23ee9002b4
commit fb6e75789b
2 changed files with 32 additions and 4 deletions

View File

@@ -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) {

View File

@@ -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;