From 08af407e2426ceaa9bd33d6ffc9cb29256b7a32e Mon Sep 17 00:00:00 2001 From: Zilog80 Date: Thu, 22 Jun 2023 23:13:17 +0200 Subject: [PATCH] dft_detect: option -d2, detect twice --- scan/README.md | 101 ++++++++++++++++++++++++++++++++++++++++++++++ scan/dft_detect.c | 53 +++++++++++++++++++----- 2 files changed, 144 insertions(+), 10 deletions(-) create mode 100644 scan/README.md diff --git a/scan/README.md b/scan/README.md new file mode 100644 index 0000000..1498bd7 --- /dev/null +++ b/scan/README.md @@ -0,0 +1,101 @@ + +## detect radiosonde type + +#### Files + + * `dft_detect.c` + +#### Compile + `gcc dft_detect.c -lm -o dft_detect` + +#### Usage + `./dft_detect [options] `
+ options:
+      `--IQ `  :  IQ data input, where `` is the relative frequency in `-0.5..0.5`
+      `-v`  :  sample count
+      `-c`  :  continuous output
+      `-t `  :  time limit
+ + (input `` can be `stdin`) +
+ + FM data:
+ `./dft_detect `
+ + IQ data:
+ `./dft_detect --IQ `
+ For IQ data (i.e. 2 channels) it is possible to read raw data (without wav header):
+ `./dft_detect --IQ - `
+ where
+      ``  :  sample rate
+      `=8,16,32`  :  bits per (real) sample (u8, s16 or f32) + + `dft_detect` stops, if a (potential) radiosonde signal is detected, or if a time limit is set with option `-t`.
+ With option `-c` detection is continued, but a time limit can be set with `-t`. + + Output is of the form `: ` where the correlation score is a normalized value in `-1..+1`. + +#### Examples + +Ex.1 +``` +$ ./dft_detect fm_audio.wav +sample_rate: 48000 +bits : 8 +channels : 1 +RS41: 0.9885 +``` +Ex.2 +``` +$ ./dft_detect -c fm_audio.wav 2>/dev/null +RS41: 0.9885 +RS41: 0.9851 +RS41: 0.9784 +RS41: 0.9869 +RS41: 0.9845 +RS41: 0.9828 +RS41: 0.9814 +RS41: 0.9821 +RS41: 0.9823 +RS41: 0.9882 +[...] +``` + +Ex.3 +``` +$ ./dft_detect -c -t 4 fm_audio.wav 2>/dev/null +RS41: 0.9885 +RS41: 0.9851 +RS41: 0.9784 +RS41: 0.9869 +RS41: 0.9845 +``` + +Ex.4 +``` +$ ./dft_detect -v -c -t 2 fm_audio.wav 2>/dev/null +sample: 39801 +RS41: 0.9885 +sample: 87824 +RS41: 0.9851 +sample: 135831 +RS41: 0.9784 +``` + +Ex.5
+Some radiosonde types have similar signals, false detection is possible. +``` +$ ./dft_detect -c -t 4 fm_meisei.wav 2>/dev/null +MEISEI: 0.9802 +MRZ: -0.9720 +MEISEI: 0.9829 +``` +Here a Meisei radiosonde seems to be more likely. + +Ex.6
+Confirmed detection (two hits): +``` +$ ./dft_detect -d2 -t 4 fm_meisei.wav 2>/dev/null +MEISEI: 0.9829 +``` + diff --git a/scan/dft_detect.c b/scan/dft_detect.c index 3198971..01aeeac 100644 --- a/scan/dft_detect.c +++ b/scan/dft_detect.c @@ -32,6 +32,7 @@ static int option_verbose = 0, // ausfuehrliche Anzeige option_dc = 0, option_silent = 0, option_cont = 0, + option_d2 = 0, option_pcmraw = 0, option_singleLpIQ = 0, wavloaded = 0; @@ -178,6 +179,23 @@ static int idx_MTS01 = -1, idx_IMET1AB = -1; +static int rs_detect2[Nrs]; + +static int rs_d2() { + int tn = 0; + for (tn = 0; tn < Nrs; tn++) { + if ( rs_detect2[tn] > 1 ) break; + } + return tn; +} + +static int reset_d2() { + int n = 0; + for (n = 0; n < Nrs; n++) rs_detect2[n] = 0; + return 0; +} + + /* // m10-false-positive: // m10-preamble similar to rs41-preamble, parts of rs92/imet1ab, imet1ab; diffs: @@ -1302,6 +1320,8 @@ int main(int argc, char **argv) { int j_max; float mv_max; + int d2_tn = Nrs; + #ifdef CYGWIN _setmode(fileno(stdin), _O_BINARY); // _setmode(_fileno(stdin), _O_BINARY); @@ -1364,6 +1384,9 @@ int main(int argc, char **argv) { if (*argv) tl = atof(*argv); else return -50; } + else if ( (strcmp(*argv, "-d2") == 0) ) { + option_d2 = 1; + } else if ( (strcmp(*argv, "--ch2") == 0) ) { wav_channel = 1; } // right channel (default: 0=left) else if ( (strcmp(*argv, "--ths") == 0) ) { ++argv; @@ -1397,6 +1420,9 @@ int main(int argc, char **argv) { } if (!wavloaded) fp = stdin; + if (option_d2) { + option_cont = 0; + } if (option_pcmraw == 0) { j = read_wav_header(fp, wav_channel); @@ -1547,16 +1573,23 @@ int main(int argc, char **argv) { if (header_found) { if (!option_silent && (mv[j] > rs_hdr[j].thres || mv[j] < -rs_hdr[j].thres)) { - if (option_verbose) fprintf(stdout, "sample: %d\n", mv_pos[j]); - fprintf(stdout, "%s: %.4f", rs_hdr[j].type, mv[j]); - if (option_dc && option_iq) { - fprintf(stdout, " , %+.1fHz", rs_hdr[j].df*sr_base); - if (option_verbose) { - fprintf(stdout, " [ fq-ofs: %+.6f", rs_hdr[j].df); - fprintf(stdout, " = %+.1fHz ]", rs_hdr[j].df*sr_base); - } + if (option_d2) { + rs_detect2[j] += 1; + d2_tn = rs_d2(); + if ( d2_tn == Nrs ) header_found = 0; + } + if ( !option_d2 || j == d2_tn ) { + if (option_verbose) fprintf(stdout, "sample: %d\n", mv_pos[j]); + fprintf(stdout, "%s: %.4f", rs_hdr[j].type, mv[j]); + if (option_dc && option_iq) { + fprintf(stdout, " , %+.1fHz", rs_hdr[j].df*sr_base); + if (option_verbose) { + fprintf(stdout, " [ fq-ofs: %+.6f", rs_hdr[j].df); + fprintf(stdout, " = %+.1fHz ]", rs_hdr[j].df*sr_base); + } + } + fprintf(stdout, "\n"); } - fprintf(stdout, "\n"); } // if ((j < 3) && mv[j] < 0) header_found = -1; @@ -1570,7 +1603,7 @@ int main(int argc, char **argv) { } } - if (header_found && !option_cont) break; + if (header_found && !option_cont || d2_tn < Nrs) break; header_found = 0; for (j = 0; j < Nrs; j++) mv[j] = 0.0; }