diff --git a/adaptive.c b/adaptive.c index 146fb2b..2b08d65 100644 --- a/adaptive.c +++ b/adaptive.c @@ -107,7 +107,7 @@ static void adaptive_burst_end_of_block(); static unsigned *adaptive_range_radix; // radix-sort buckets for current block static unsigned adaptive_range_radix_counter; // sum of all radix-sort buckets (= number of samples sorted) static double adaptive_range_smoothed; // smoothed noise floor estimate, dBFS -static enum { RANGE_SCAN_IDLE, RANGE_SCAN_UP, RANGE_SCAN_DOWN } adaptive_range_state = RANGE_SCAN_UP; +static enum { RANGE_SCAN_IDLE, RANGE_SCAN_UP, RANGE_SCAN_DOWN, RANGE_RESCAN_UP, RANGE_RESCAN_DOWN } adaptive_range_state = RANGE_SCAN_UP; static unsigned adaptive_range_change_timer; // countdown inhibiting control after changing gain static unsigned adaptive_range_rescan_timer; // countdown to next upwards gain reprobe static int adaptive_range_gain_limit; // probed maximum gain step with acceptable dynamic range @@ -196,7 +196,7 @@ void adaptive_init() adaptive_burst_window_counter = 0; adaptive_range_radix = calloc(sizeof(unsigned), 65536); - adaptive_range_state = RANGE_SCAN_UP; + adaptive_range_state = RANGE_RESCAN_UP; // select and enforce gain limits for (adaptive_gain_min = 0; adaptive_gain_min < maxgain; ++adaptive_gain_min) { @@ -514,7 +514,7 @@ static void adaptive_control_update() // if we're currently doing a downward scan, reducing gain further may confuse it; // stop that scan and restart it once we are no longer in a reduced-gain state - if (adaptive_range_state == RANGE_SCAN_DOWN) { + if (adaptive_range_state == RANGE_SCAN_DOWN || adaptive_range_state == RANGE_RESCAN_DOWN) { adaptive_range_state = RANGE_SCAN_IDLE; adaptive_range_rescan_timer = 0; } @@ -539,12 +539,13 @@ static void adaptive_control_update() } switch (adaptive_range_state) { case RANGE_SCAN_UP: + case RANGE_RESCAN_UP: if (available_range < Modes.adaptive_range_target) { // Current gain fails to meet our target. Switch to downward scanning. fprintf(stderr, "adaptive: available dynamic range (%.1fdB) < required dynamic range (%.1fdB), switching to downward scan\n", available_range, Modes.adaptive_range_target); gain_down = gain_not_up = true; gain_down_reason = "probing dynamic range gain lower bound"; - adaptive_range_state = RANGE_SCAN_DOWN; + adaptive_range_state = (adaptive_range_state == RANGE_RESCAN_UP ? RANGE_RESCAN_DOWN : RANGE_SCAN_DOWN); if (adaptive_range_gain_limit >= current_gain) { adaptive_range_gain_limit = current_gain - 1; } @@ -569,11 +570,12 @@ static void adaptive_control_update() break; case RANGE_SCAN_DOWN: + case RANGE_RESCAN_DOWN: if (available_range >= Modes.adaptive_range_target) { // Current gain meets our target; we are done with the scan. fprintf(stderr, "adaptive: available dynamic range (%.1fdB) >= required dynamic range (%.1fdB), stopping downwards scan here\n", available_range, Modes.adaptive_range_target); adaptive_range_state = RANGE_SCAN_IDLE; - adaptive_range_rescan_timer = Modes.adaptive_range_rescan_delay; + adaptive_range_rescan_timer = (adaptive_range_state == RANGE_SCAN_DOWN ? Modes.adaptive_range_scan_delay : Modes.adaptive_range_rescan_delay); break; } @@ -616,7 +618,7 @@ static void adaptive_control_update() fprintf(stderr, "adaptive: start periodic scan for acceptable dynamic range at increased gain\n"); gain_up = true; gain_up_reason = "periodic re-probing of dynamic range gain upper bound"; - adaptive_range_state = RANGE_SCAN_UP; + adaptive_range_state = RANGE_RESCAN_UP; break; } diff --git a/dump1090.c b/dump1090.c index b7a6ce9..2b6ab09 100644 --- a/dump1090.c +++ b/dump1090.c @@ -143,6 +143,7 @@ static void modesInitConfig(void) { Modes.adaptive_range_alpha = 2.0 / (5 + 1); Modes.adaptive_range_percentile = 40; Modes.adaptive_range_change_delay = 10; + Modes.adaptive_range_scan_delay = 300; Modes.adaptive_range_rescan_delay = 3600; sdrInitConfig(); @@ -373,8 +374,11 @@ static void showHelp(void) "--adaptive-range-percentile
Set dynamic range noise percentile\n"
"--adaptive-range-change-delay Set adaptive gain duty cycle %% (1..100)\n"
@@ -796,6 +800,8 @@ int main(int argc, char **argv) {
Modes.adaptive_range_target = atof(argv[++j]);
} else if (!strcmp(argv[j], "--adaptive-range-change-delay") && more) {
Modes.adaptive_range_change_delay = atoi(argv[++j]);
+ } else if (!strcmp(argv[j], "--adaptive-range-scan-delay") && more) {
+ Modes.adaptive_range_scan_delay = atoi(argv[++j]);
} else if (!strcmp(argv[j], "--adaptive-range-rescan-delay") && more) {
Modes.adaptive_range_rescan_delay = atoi(argv[++j]);
} else if (sdrHandleOption(argc, argv, &j)) {
diff --git a/dump1090.h b/dump1090.h
index 0ec6def..6cd9a2e 100644
--- a/dump1090.h
+++ b/dump1090.h
@@ -431,6 +431,7 @@ struct _Modes { // Internal state
unsigned adaptive_range_percentile;
float adaptive_range_target;
unsigned adaptive_range_change_delay;
+ unsigned adaptive_range_scan_delay;
unsigned adaptive_range_rescan_delay;
};
Set delay after changing gain before\n"
" resuming dynamic range control (seconds)\n"
-"--adaptive-range-rescan-delay Set rescan interval for dynamic range\n"
-" gain scanning (seconds)\n"
+"--adaptive-range-scan-delay Set scan interval for dynamic range\n"
+" gain scanning following a gain decrease\n"
+" due to an increase in noise (seconds)\n"
+"--adaptive-range-rescan-delay Set periodic rescan interval for dynamic\n"
+" range gain scanning (seconds)\n"
"--adaptive-min-gain