diff options
Diffstat (limited to 'Transceiver52M/sigProcLib.cpp')
-rw-r--r-- | Transceiver52M/sigProcLib.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp index 54dd8fc..4501a13 100644 --- a/Transceiver52M/sigProcLib.cpp +++ b/Transceiver52M/sigProcLib.cpp @@ -40,6 +40,9 @@ using namespace GSM; #define TABLESIZE 1024 #define DELAYFILTS 64 +/* Clipping detection threshold */ +#define CLIP_THRESH 30000.0f + /** Lookup tables for trigonometric approximation */ float cosTable[TABLESIZE+1]; // add 1 element for wrap around float sinTable[TABLESIZE+1]; @@ -1369,6 +1372,18 @@ static int detectBurst(signalVector &burst, return 1; } +static int detectClipping(signalVector &burst, float thresh) +{ + for (size_t i = 0; i < burst.size(); i++) { + if (fabs(burst[i].real()) > thresh) + return 1; + if (fabs(burst[i].imag()) > thresh) + return 1; + } + + return 0; +} + /* * RACH burst detection * @@ -1390,7 +1405,10 @@ int detectRACHBurst(signalVector &rxBurst, CorrelationSequence *sync; if ((sps != 1) && (sps != 4)) - return -1; + return -SIGERR_UNSUPPORTED; + + if (detectClipping(rxBurst, CLIP_THRESH)) + return -SIGERR_CLIP; target = 8 + 40; head = 4; @@ -1406,7 +1424,7 @@ int detectRACHBurst(signalVector &rxBurst, delete corr; if (rc < 0) { - return -1; + return -SIGERR_INTERNAL; } else if (!rc) { if (amp) *amp = 0.0f; @@ -1443,7 +1461,10 @@ int analyzeTrafficBurst(signalVector &rxBurst, unsigned tsc, float thresh, CorrelationSequence *sync; if ((tsc < 0) || (tsc > 7) || ((sps != 1) && (sps != 4))) - return -1; + return -SIGERR_UNSUPPORTED; + + if (detectClipping(rxBurst, CLIP_THRESH)) + return -SIGERR_CLIP; target = 3 + 58 + 16 + 5; head = 4; @@ -1459,7 +1480,7 @@ int analyzeTrafficBurst(signalVector &rxBurst, unsigned tsc, float thresh, delete corr; if (rc < 0) { - return -1; + return -SIGERR_INTERNAL; } else if (!rc) { if (amp) *amp = 0.0f; |