From d8395fff5964a330c0208474c5d1b42a9b63c036 Mon Sep 17 00:00:00 2001 From: lwvmobile Date: Mon, 7 Aug 2023 03:43:39 -0400 Subject: [PATCH] Fix RTL RMS so it does't return Jank Values; --- include/dsd.h | 4 ++-- src/dsd_ncurses.c | 2 +- src/rtl_sdr_fm.cpp | 15 ++++++++------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/include/dsd.h b/include/dsd.h index 76a79b3..72db1f3 100644 --- a/include/dsd.h +++ b/include/dsd.h @@ -280,7 +280,7 @@ typedef struct int rtl_udp_port; int rtl_bandwidth; int rtl_started; - int rtl_rms; + long int rtl_rms; int monitor_input_audio; int pulse_raw_rate_in; int pulse_raw_rate_out; @@ -1229,7 +1229,7 @@ void cleanup_rtlsdr_stream(); int get_rtlsdr_sample(int16_t *sample, dsd_opts * opts, dsd_state * state); void rtlsdr_sighandler(); void rtl_dev_tune(dsd_opts * opts, long int frequency); -int rtl_return_rms(); +long int rtl_return_rms(); void rtl_clean_queue(); #endif //DMR TRELLIS diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index 05424a7..8b66f5f 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -2290,7 +2290,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) printw (" Gain: %idB;", opts->rtl_gain_value); printw (" PPM: %i;", opts->rtlsdr_ppm_error); printw (" SQ: %i;", opts->rtl_squelch_level); - printw (" RMS: %04i;", opts->rtl_rms); + printw (" RMS: %04li;", opts->rtl_rms); printw (" BW: %i kHz;", opts->rtl_bandwidth); printw (" FRQ: %i;", opts->rtlsdr_center_freq); if (opts->rtl_udp_port != 0) printw ("\n| External RTL Tuning on UDP Port: %i", opts->rtl_udp_port); diff --git a/src/rtl_sdr_fm.cpp b/src/rtl_sdr_fm.cpp index 91bf6b4..62f860f 100644 --- a/src/rtl_sdr_fm.cpp +++ b/src/rtl_sdr_fm.cpp @@ -464,10 +464,11 @@ void dc_block_filter(struct demod_state *fm) fm->dc_avg = avg; } -int rms(int16_t *samples, int len, int step) +long int rms(int16_t *samples, int len, int step) /* largely lifted from rtl_power */ { int i; + long int rms; long p, t, s; double dc, err; @@ -481,7 +482,10 @@ int rms(int16_t *samples, int len, int step) dc = (double)(t*step) / (double)len; err = t * 2 * dc - dc * dc * len; - return (int)sqrt((p-err) / len); + rms = (long int)sqrt((p-err) / len); + //going with a value that's easy to figure out when its done the thing + if (rms < 0){ rms = 999; } + return rms; } void full_demod(struct demod_state *d) @@ -1123,13 +1127,10 @@ void rtl_dev_tune(dsd_opts * opts, long int frequency) } //return RMS value (root means square) power level -- used as soft squelch inside of framesync -int rtl_return_rms() +long int rtl_return_rms() { - int sr = 0; + long int sr = 0; sr = rms(demod.lowpassed, demod.lp_len, 1); - // 'Fix' potential negative value overflow from the rms function -- Observed in Windows builds - sr = abs(sr); - if (sr > 9999) sr = 9999; return (sr); }