This commit is contained in:
awe
2026-04-27 20:15:51 +03:00
parent b9559cbe8c
commit 1eb2505e37

View File

@ -1236,6 +1236,7 @@ struct Do1NoiseSubtractState {
std::array<uint32_t, 2> step_count {}; std::array<uint32_t, 2> step_count {};
std::array<double, 2> last_high_avg {}; std::array<double, 2> last_high_avg {};
std::array<bool, 2> last_high_valid {}; std::array<bool, 2> last_high_valid {};
bool high_baseline_pending = false;
bool step_level_initialized = false; bool step_level_initialized = false;
bool step_di1_high = false; bool step_di1_high = false;
uint16_t next_index = 1; uint16_t next_index = 1;
@ -1254,6 +1255,7 @@ struct Do1NoiseSubtractState {
clear_step(); clear_step();
last_high_avg = {}; last_high_avg = {};
last_high_valid = {}; last_high_valid = {};
high_baseline_pending = false;
step_level_initialized = false; step_level_initialized = false;
step_di1_high = false; step_di1_high = false;
next_index = 1; next_index = 1;
@ -1292,13 +1294,23 @@ struct Do1NoiseSubtractState {
last_high_valid[lch] = true; last_high_valid[lch] = true;
} }
bool has_last_high(uint32_t lch) const { bool has_pending_high(uint32_t channel_count) const {
if (lch >= last_high_valid.size()) { if (!high_baseline_pending) {
return false; return false;
} }
return last_high_valid[lch]; if (!last_high_valid[0]) {
return false;
}
if ((channel_count > 1U) && !last_high_valid[1]) {
return false;
}
return true;
} }
void mark_high_pending() { high_baseline_pending = true; }
void consume_pending_high() { high_baseline_pending = false; }
double last_high(uint32_t lch) const { double last_high(uint32_t lch) const {
if (lch >= last_high_avg.size()) { if (lch >= last_high_avg.size()) {
return 0.0; return 0.0;
@ -1870,13 +1882,13 @@ int run(const Config& cfg) {
if (cfg.channel_count > 1U) { if (cfg.channel_count > 1U) {
tty_do1_noise_state.update_last_high(1U, ch2_avg); tty_do1_noise_state.update_last_high(1U, ch2_avg);
} }
tty_do1_noise_state.mark_high_pending();
tty_do1_noise_state.finish_step(); tty_do1_noise_state.finish_step();
return; return;
} }
if (!tty_do1_noise_state.has_last_high(0U) || if (!tty_do1_noise_state.has_pending_high(cfg.channel_count)) {
((cfg.channel_count > 1U) && !tty_do1_noise_state.has_last_high(1U))) { // Skip LOW output unless a preceding HIGH step baseline is pending.
// Skip LOW output until the previous HIGH step baseline is available.
tty_do1_noise_state.finish_step(); tty_do1_noise_state.finish_step();
return; return;
} }
@ -1895,6 +1907,7 @@ int run(const Config& cfg) {
static_cast<uint16_t>(pack_raw_code_to_int16(ch2_corrected))); static_cast<uint16_t>(pack_raw_code_to_int16(ch2_corrected)));
++tty_do1_noise_state.next_index; ++tty_do1_noise_state.next_index;
++packet_avg_steps; ++packet_avg_steps;
tty_do1_noise_state.consume_pending_high();
tty_do1_noise_state.finish_step(); tty_do1_noise_state.finish_step();
}; };