mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-trx.git
synced 2025-11-02 13:13:17 +00:00
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:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user