[hamradio-commits] [dump1090] 75/389: Change the I/Q lookup table values for better detection

Matthew Ernisse mernisse-guest at moszumanska.debian.org
Wed Nov 5 00:19:42 UTC 2014


This is an automated email from the git hooks/post-receive script.

mernisse-guest pushed a commit to branch master
in repository dump1090.

commit 22c329849ac9a00e41ca5a15631b6c8a88ad8403
Author: Malcolm Robb <Support at ATTAvionics.com>
Date:   Wed Apr 10 20:57:09 2013 +0100

    Change the I/Q lookup table values for better detection
    
    Change the I/Q lookup table for better detection. Changes fully
    described in the source dump1090.c at line 347 onwards. This change
    results in about 30% more frames being detected at weak signal input
    levels.
    
    Also a bug fix from the last commit - C doesn't support the min()
    function.
---
 dump1090.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 48 insertions(+), 3 deletions(-)

diff --git a/dump1090.c b/dump1090.c
index b0d779f..ee61524 100644
--- a/dump1090.c
+++ b/dump1090.c
@@ -334,15 +334,59 @@ void modesInit(void) {
      * We scale to 0-255 range multiplying by 1.4 in order to ensure that
      * every different I/Q pair will result in a different magnitude value,
      * not losing any resolution. */
+/*
     for (i = 0; i <= 255; i++) {
-        int mag_i = i - 127;
         for (q = 0; q <= 255; q++) {
+            int mag_i = i - 127;
             int mag_q = q - 127;
-            int mag   = 0;
+            int mag   = 0;           
             mag = (int) round(sqrt((mag_i*mag_i)+(mag_q*mag_q)) * 360);
             Modes.maglut[(i*256)+q] = (uint16_t) min(mag,65535);
         }
     }
+*/
+    // Each I and Q value varies from 0 to 255, which represents a range from -1 to +1. To get from the 
+    // unsigned (0-255) range you therefore subtract 127 (or 128 or 127.5) from each I and Q, giving you 
+    // a range from -127 to +128 (or -128 to +127, or -127.5 to +127.5)..
+    //
+    // To decode the AM signal, you need the magnitude of the waveform, which is given by sqrt((I^2)+(Q^2))
+    // The most this could be is if I&Q are both 128 (or 127 or 127.5), so you could end up with a magnitude 
+    // of 181.019 (or 179.605, or 180.312)
+    //
+    // However, in reality the magnitude of the signal should never exceed the range -1 to +1, becaure the 
+    // values are I = rCos(w) and Q = rSin(w). Therefore the integer computed magnitude should (can?) never 
+    // exceed 128 (or 127, or 127.5 or whatever)
+    //
+    // If we scale up the results so that they range from 0 to 65535 (16 bits) then we need to multiply 
+    // by 511.99, (or 516.02 or 514). antirez's original code multiplies by 360, presumably because he's 
+    // assuming the maximim calculated amplitude is 181.019, and (181.019 * 360) = 65166.
+    //
+    // So lets see if we can improve things by subtracting 127.5, Well in integer arithmatic we can't
+    // subtract half, so, we'll double everything up and subtract one, and then compensate for the doubling 
+    // in the multiplier at the end.
+    //
+    // If we do this we can never have I or Q equal to 0 - they can only be as small as +/- 1.
+    // This gives us a minimum magnitude of root 2 (0.707), so the dynamic range becomes (1.414-255). This 
+    // also affects our scaling value, which is now 65535/(255 - 1.414), or 258.433254
+    //
+    // The sums then become mag = 258.433254 * (sqrt((I*2-255)^2 + (Q*2-255)^2) - 1.414)
+    //                   or mag = (258.433254 * sqrt((I*2-255)^2 + (Q*2-255)^2)) - 365.4798
+    //
+    // We also need to clip mag just incaes any rogue I/Q values somehow do have a magnitude greater than 255.
+    //
+
+    for (i = 0; i <= 255; i++) {
+        for (q = 0; q <= 255; q++) {
+            int mag, mag_i, mag_q;
+
+            mag_i = (i * 2) - 255;
+            mag_q = (q * 2) - 255;
+
+            mag = (int) round((sqrt((mag_i*mag_i)+(mag_q*mag_q)) * 258.433254) - 365.4798);
+
+            Modes.maglut[(i*256)+q] = (uint16_t) ((mag < 65535) ? mag : 65535);
+        }
+    }
 
     /* Statistics */
     Modes.stat_valid_preamble = 0;
@@ -1472,7 +1516,8 @@ void detectModeS(uint16_t *m, uint32_t mlen) {
 
             /* Decode the received message and update statistics */
             mm.timestampMsg = Modes.timestampBlk + (j*6);
-            mm.signalLevel  = min(((sigStrength+0x7F) >> 8), 255);
+            sigStrength    = (sigStrength + 0x7F) >> 8;
+            mm.signalLevel = ((sigStrength < 255) ? sigStrength : 255);
             decodeModesMessage(&mm,msg);
 
             /* Update statistics. */

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/dump1090.git



More information about the pkg-hamradio-commits mailing list