minor: Refactor cfg parameters to demod

This commit is contained in:
Christian W. Zuckschwerdt
2026-06-28 22:26:53 +02:00
parent 893d3d40ed
commit 5a6f0fdcf3
3 changed files with 51 additions and 32 deletions

View File

@@ -41,8 +41,6 @@ struct dm_state {
filter_state_t lowpass_filter_state;
demodfm_state_t demod_FM_state;
int enable_FM_demod;
unsigned fsk_pulse_detect_mode;
unsigned frequency;
samp_grab_t *samp_grab;
am_analyze_t *am_analyze;
int analyze_pulses;
@@ -62,6 +60,16 @@ struct dm_state {
struct timeval now;
float sample_file_pos;
/* parameters copied in for each frame */
uint32_t center_frequency;
uint32_t samp_rate;
int fsk_pulse_detect_mode;
int grab_mode; ///< Signal grabber mode: 0=off, 1=all, 2=unknown, 3=known
int raw_mode; ///< Raw pulses printing mode: 0=off, 1=all, 2=unknown, 3=known
int verbosity; ///< 0=normal, 1=verbose, 2=verbose decoders, 3=debug decoders, 4=trace decoding.
int report_noise;
list_t *raw_handler;
/* global stats */
time_t running_since; ///< program start time statistic
unsigned total_frames_count; ///< total frames recieved statistic

View File

@@ -85,7 +85,7 @@ int push_sdr_flow(r_cfg_t *cfg, unsigned char *iq_buf, uint32_t len)
}
// do this here and not in sdr_handler so realtime replay can use rtl_tcp output
for (void **iter = cfg->raw_handler.elems; iter && *iter; ++iter) {
for (void **iter = demod->raw_handler->elems; iter && *iter; ++iter) {
raw_output_t *output = *iter;
raw_output_frame(output, iq_buf, len);
}
@@ -156,7 +156,7 @@ int push_sdr_flow(r_cfg_t *cfg, unsigned char *iq_buf, uint32_t len)
demod->noise_level = (demod->noise_level * 31 + avg_db) / 32; // slow rise over 32 frames
}
// Report noise every report_noise seconds, but only for the first frame that second
if (cfg->report_noise && last_frame_sec != demod->now.tv_sec && demod->now.tv_sec % cfg->report_noise == 0) {
if (demod->report_noise && last_frame_sec != demod->now.tv_sec && demod->now.tv_sec % demod->report_noise == 0) {
print_logf(LOG_WARNING, "Auto Level", "Current %s level %.1f dB, estimated noise %.1f dB",
noise_only ? "noise" : "signal", avg_db, demod->noise_level);
}
@@ -166,23 +166,12 @@ int push_sdr_flow(r_cfg_t *cfg, unsigned char *iq_buf, uint32_t len)
}
// FM demodulation
// Select the correct fsk pulse detector
unsigned fpdm = cfg->fsk_pulse_detect_mode;
if (cfg->fsk_pulse_detect_mode == FSK_PULSE_DETECT_AUTO) {
if (cfg->frequency[cfg->frequency_index] > FSK_PULSE_DETECTOR_LIMIT) {
fpdm = FSK_PULSE_DETECT_NEW;
}
else {
fpdm = FSK_PULSE_DETECT_OLD;
}
}
if (demod->enable_FM_demod && process_frame) {
float low_pass = demod->low_pass != 0.0f ? demod->low_pass : fpdm ? 0.2f : 0.1f;
float low_pass = demod->low_pass != 0.0f ? demod->low_pass : demod->fsk_pulse_detect_mode ? 0.2f : 0.1f;
if (demod->sample_size == 2) { // CU8
baseband_demod_FM(&demod->demod_FM_state, iq_buf, demod->buf.fm, n_samples, cfg->samp_rate, low_pass);
baseband_demod_FM(&demod->demod_FM_state, iq_buf, demod->buf.fm, n_samples, demod->samp_rate, low_pass);
} else { // CS16
baseband_demod_FM_cs16(&demod->demod_FM_state, (int16_t *)iq_buf, demod->buf.fm, n_samples, cfg->samp_rate, low_pass);
baseband_demod_FM_cs16(&demod->demod_FM_state, (int16_t *)iq_buf, demod->buf.fm, n_samples, demod->samp_rate, low_pass);
}
}
@@ -213,7 +202,7 @@ int push_sdr_flow(r_cfg_t *cfg, unsigned char *iq_buf, uint32_t len)
}
while (package_type && process_frame) {
int p_events = 0; // Sensor events successfully detected per package
package_type = pulse_detect_package(demod->pulse_detect, demod->am_buf, demod->buf.fm, n_samples, cfg->samp_rate, demod->input_pos, &demod->pulse_data, &demod->fsk_pulse_data, fpdm);
package_type = pulse_detect_package(demod->pulse_detect, demod->am_buf, demod->buf.fm, n_samples, demod->samp_rate, demod->input_pos, &demod->pulse_data, &demod->fsk_pulse_data, demod->fsk_pulse_detect_mode);
if (package_type) {
// new package: set a first frame start if we are not tracking one already
if (!demod->frame_start_ago) {
@@ -247,18 +236,18 @@ int push_sdr_flow(r_cfg_t *cfg, unsigned char *iq_buf, uint32_t len)
}
}
if (cfg->verbosity >= LOG_TRACE) {
if (demod->verbosity >= LOG_TRACE) {
pulse_data_print(&demod->pulse_data);
}
if (cfg->raw_mode == 1 || (cfg->raw_mode == 2 && p_events == 0) || (cfg->raw_mode == 3 && p_events > 0)) {
if (demod->raw_mode == 1 || (demod->raw_mode == 2 && p_events == 0) || (demod->raw_mode == 3 && p_events > 0)) {
data_t *data = pulse_data_print_data(&demod->pulse_data);
event_occurred_handler(cfg, data);
}
if (demod->analyze_pulses && (cfg->grab_mode <= 1 || (cfg->grab_mode == 2 && p_events == 0) || (cfg->grab_mode == 3 && p_events > 0)) ) {
if (demod->analyze_pulses && (demod->grab_mode <= 1 || (demod->grab_mode == 2 && p_events == 0) || (demod->grab_mode == 3 && p_events > 0)) ) {
r_device device = {.log_fn = log_device_handler, .output_ctx = cfg};
pulse_analyzer(&demod->pulse_data, package_type, &device);
}
if (cfg->grab_mode == 4 && p_events == 0) {
if (demod->grab_mode == 4 && p_events == 0) {
r_device device = {.log_fn = log_device_handler, .output_ctx = cfg};
int p_quality = pulse_analyzer_check(&demod->pulse_data, package_type, &device);
demod->frame_quality = p_quality > demod->frame_quality ? p_quality : demod->frame_quality;
@@ -289,18 +278,18 @@ int push_sdr_flow(r_cfg_t *cfg, unsigned char *iq_buf, uint32_t len)
}
}
if (cfg->verbosity >= LOG_TRACE) {
if (demod->verbosity >= LOG_TRACE) {
pulse_data_print(&demod->fsk_pulse_data);
}
if (cfg->raw_mode == 1 || (cfg->raw_mode == 2 && p_events == 0) || (cfg->raw_mode == 3 && p_events > 0)) {
if (demod->raw_mode == 1 || (demod->raw_mode == 2 && p_events == 0) || (demod->raw_mode == 3 && p_events > 0)) {
data_t *data = pulse_data_print_data(&demod->fsk_pulse_data);
event_occurred_handler(cfg, data);
}
if (demod->analyze_pulses && (cfg->grab_mode <= 1 || (cfg->grab_mode == 2 && p_events == 0) || (cfg->grab_mode == 3 && p_events > 0))) {
if (demod->analyze_pulses && (demod->grab_mode <= 1 || (demod->grab_mode == 2 && p_events == 0) || (demod->grab_mode == 3 && p_events > 0))) {
r_device device = {.log_fn = log_device_handler, .output_ctx = cfg};
pulse_analyzer(&demod->fsk_pulse_data, package_type, &device);
}
if (cfg->grab_mode == 4 && p_events == 0) {
if (demod->grab_mode == 4 && p_events == 0) {
r_device device = {.log_fn = log_device_handler, .output_ctx = cfg};
int p_quality = pulse_analyzer_check(&demod->fsk_pulse_data, package_type, &device);
demod->frame_quality = p_quality > demod->frame_quality ? p_quality : demod->frame_quality;
@@ -315,10 +304,10 @@ int push_sdr_flow(r_cfg_t *cfg, unsigned char *iq_buf, uint32_t len)
// end frame tracking if older than a whole buffer
if (demod->frame_start_ago && demod->frame_end_ago > n_samples) {
if (demod->samp_grab) {
if (cfg->grab_mode == 1
|| (cfg->grab_mode == 2 && demod->frame_event_count == 0)
|| (cfg->grab_mode == 3 && demod->frame_event_count > 0)
|| (cfg->grab_mode == 4 && demod->frame_event_count == 0 && demod->frame_quality > 0)) {
if (demod->grab_mode == 1
|| (demod->grab_mode == 2 && demod->frame_event_count == 0)
|| (demod->grab_mode == 3 && demod->frame_event_count > 0)
|| (demod->grab_mode == 4 && demod->frame_event_count == 0 && demod->frame_quality > 0)) {
unsigned frame_pad = n_samples / 8; // this could also be a fixed value, e.g. 10000 samples
unsigned start_padded = demod->frame_start_ago + frame_pad;
unsigned end_padded = demod->frame_end_ago - frame_pad;
@@ -343,7 +332,7 @@ int push_sdr_flow(r_cfg_t *cfg, unsigned char *iq_buf, uint32_t len)
}
if (demod->am_analyze) {
am_analyze(demod->am_analyze, demod->am_buf, n_samples, cfg->verbosity >= LOG_INFO, NULL);
am_analyze(demod->am_analyze, demod->am_buf, n_samples, demod->verbosity >= LOG_INFO, NULL);
}
for (void **iter = demod->dumper.elems; iter && *iter; ++iter) {

View File

@@ -1080,6 +1080,28 @@ static void process_sdr_frame(r_cfg_t *cfg, unsigned char *iq_buf, uint32_t len)
cfg->exit_async = 1;
}
// Select needed discriminator based on current frequency or manual setting
unsigned fpdm = cfg->fsk_pulse_detect_mode;
if (cfg->fsk_pulse_detect_mode == FSK_PULSE_DETECT_AUTO) {
// FIXME: this is wrong to be compatible with tests and won't work for file inputs
if (cfg->frequency[cfg->frequency_index] > FSK_PULSE_DETECTOR_LIMIT) {
fpdm = FSK_PULSE_DETECT_NEW;
}
else {
fpdm = FSK_PULSE_DETECT_OLD;
}
}
// Setup variable demod parameters
cfg->demod->raw_handler = &cfg->raw_handler;
cfg->demod->fsk_pulse_detect_mode = fpdm; // cfg->fsk_pulse_detect_mode;
cfg->demod->center_frequency = cfg->center_frequency;
cfg->demod->samp_rate = cfg->samp_rate;
cfg->demod->report_noise = cfg->report_noise;
cfg->demod->verbosity = cfg->verbosity;
cfg->demod->raw_mode = cfg->raw_mode;
cfg->demod->grab_mode = cfg->grab_mode;
// Send frame data to processing
int events = push_sdr_flow(cfg, iq_buf, len);