From ed80552ca16b68654e303419d975906160032b51 Mon Sep 17 00:00:00 2001 From: Malcolm Robb Date: Tue, 9 Apr 2013 00:58:32 +0100 Subject: [PATCH] Speed up the I/Q to magnitude calculation Increase the speed of the I/Q to magnitude calculation lookup by expanding the table to 65536 entries (256*256*2 bytes). At runtime, this allows us to pick up raw I/Q bytes as a 16 bit value and index into the magnitude table to get a 16 bit result. This removes the need for subtracting 127, and then correcting for -ve numbers, so should be faster, at the expense of a larger data table. Change the maglut lookup table from 129*129 to 256*256 Initialise the maglut buffer accordingly Change the data->maglut lookup to use the new maglut buffer Change the I/Q data buffer pointet to a uint16_t * --- dump1090.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/dump1090.c b/dump1090.c index ff3208f..1d73db6 100644 --- a/dump1090.c +++ b/dump1090.c @@ -133,7 +133,7 @@ struct { pthread_t reader_thread; pthread_mutex_t data_mutex; /* Mutex to synchronize buffer access. */ pthread_cond_t data_cond; /* Conditional variable associated. */ - unsigned char *data; /* Raw IQ samples buffer */ + uint16_t *data; /* Raw IQ samples buffer */ uint16_t *magnitude; /* Magnitude vector */ long long timestampBlk; /* Timestamp of the start of the current block */ int fd; /* --ifile option file descriptor. */ @@ -328,10 +328,12 @@ 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. */ - Modes.maglut = malloc(129*129*2); - for (i = 0; i <= 128; i++) { - for (q = 0; q <= 128; q++) { - Modes.maglut[i*129+q] = round(sqrt(i*i+q*q)*360); + Modes.maglut = malloc(256*256*2); + for (i = 0; i <= 255; i++) { + int mag_i = i-127; + for (q = 0; q <= 255; q++) { + int mag_q = q - 127; + Modes.maglut[i*256+q] = round(sqrt((mag_i*mag_i)+(mag_q*mag_q))*360); } } @@ -443,7 +445,7 @@ void readDataFromFile(void) { } toread = MODES_ASYNC_BUF_SIZE; - p = Modes.data; + p = (unsigned char *) Modes.data; while(toread) { nread = read(Modes.fd, p, toread); if (nread <= 0) { @@ -1236,7 +1238,7 @@ void displayModesMessage(struct modesMessage *mm) { * pointed by Modes.magnitude. */ void computeMagnitudeVector(void) { uint16_t *m = &Modes.magnitude[MODES_PREAMBLE_SAMPLES+MODES_LONG_MSG_SAMPLES]; - unsigned char *p = Modes.data; + uint16_t *p = Modes.data; uint32_t j; memcpy(Modes.magnitude,&Modes.magnitude[MODES_ASYNC_BUF_SAMPLES], MODES_PREAMBLE_SIZE+MODES_LONG_MSG_SIZE); @@ -1244,12 +1246,7 @@ void computeMagnitudeVector(void) { /* Compute the magnitudo vector. It's just SQRT(I^2 + Q^2), but * we rescale to the 0-255 range to exploit the full resolution. */ for (j = 0; j < MODES_ASYNC_BUF_SAMPLES; j ++) { - int i = (*p++)-127; - int q = (*p++)-127; - - if (i < 0) i = -i; - if (q < 0) q = -q; - *m++ = Modes.maglut[i*129+q]; + *m++ = Modes.maglut[*p++]; } } @@ -2543,10 +2540,10 @@ int main(int argc, char **argv) { showHelp(); exit(0); } else if (!strcmp(argv[j],"--ppm") && more) { - Modes.ppm_error = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--quiet")) { - Modes.quiet = 1; - } else { + Modes.ppm_error = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--quiet")) { + Modes.quiet = 1; + } else { fprintf(stderr, "Unknown or not enough arguments for option '%s'.\n\n", argv[j]);