From a77387456d9a4fe7334ab9c7ff4c9f5f66686d3b Mon Sep 17 00:00:00 2001 From: Piotr Gregor Date: Mon, 4 Jul 2016 16:26:08 +0100 Subject: [PATCH] FS-9009 [mod_avmd] Amplitude estimation Add DESA-2 estimation of signal amplitude --- .../applications/mod_avmd/avmd_amplitude.c | 11 +-- .../applications/mod_avmd/avmd_amplitude.h | 9 +- src/mod/applications/mod_avmd/avmd_desa2.c | 20 +++-- src/mod/applications/mod_avmd/avmd_desa2.h | 11 ++- .../mod_avmd/avmd_desa2_tweaked.c | 21 +++-- .../mod_avmd/avmd_desa2_tweaked.h | 5 +- src/mod/applications/mod_avmd/avmd_psi.h | 4 +- src/mod/applications/mod_avmd/mod_avmd.c | 90 +++++++++++++------ 8 files changed, 114 insertions(+), 57 deletions(-) diff --git a/src/mod/applications/mod_avmd/avmd_amplitude.c b/src/mod/applications/mod_avmd/avmd_amplitude.c index a54caef4fa..16f1312d04 100644 --- a/src/mod/applications/mod_avmd/avmd_amplitude.c +++ b/src/mod/applications/mod_avmd/avmd_amplitude.c @@ -5,15 +5,8 @@ #include "avmd_amplitude.h" #include "avmd_psi.h" -/*! \brief - * @author Eric des Courtis - * @param b A circular audio sample buffer - * @param i Position in the buffer - * @param f Frequency estimate - * @return The amplitude at position i - */ -extern double avmd_amplitude(circ_buffer_t *b, size_t i, double f) -{ + +double avmd_amplitude(circ_buffer_t *b, size_t i, double f) { double result; result = sqrt(PSI(b, i) / sin(f * f)); return result; diff --git a/src/mod/applications/mod_avmd/avmd_amplitude.h b/src/mod/applications/mod_avmd/avmd_amplitude.h index b059dfffba..13e5edadeb 100644 --- a/src/mod/applications/mod_avmd/avmd_amplitude.h +++ b/src/mod/applications/mod_avmd/avmd_amplitude.h @@ -1,7 +1,10 @@ /* * @brief Estimation of amplitude using DESA-2 algorithm. - * @author Eric des Courtis - * @par Modifications: Piotr Gregor < piotrek.gregor gmail.com > + * + * Contributor(s): + * + * Eric des Courtis + * Piotr Gregor : */ @@ -12,7 +15,7 @@ #include "avmd_buffer.h" -extern double avmd_amplitude(circ_buffer_t *, size_t i, double f); +double avmd_amplitude(circ_buffer_t *, size_t i, double f) __attribute__ ((nonnull(1))); #endif /* __AVMD_AMPLITUDE_H__ */ diff --git a/src/mod/applications/mod_avmd/avmd_desa2.c b/src/mod/applications/mod_avmd/avmd_desa2.c index b1d19eb8ae..2f35d3beb5 100644 --- a/src/mod/applications/mod_avmd/avmd_desa2.c +++ b/src/mod/applications/mod_avmd/avmd_desa2.c @@ -19,8 +19,8 @@ int __isnan(double); #include "avmd_fast_acosf.h" #endif -extern double avmd_desa2(circ_buffer_t *b, size_t i) -{ + +double avmd_desa2(circ_buffer_t *b, size_t i, double *amplitude) { double d; double n; double x0; @@ -30,6 +30,7 @@ extern double avmd_desa2(circ_buffer_t *b, size_t i) double x4; double x2sq; double result; + double PSI_Xn, PSI_Yn, NEEDED; x0 = GET_SAMPLE((b), (i)); x1 = GET_SAMPLE((b), ((i) + 1)); @@ -39,8 +40,14 @@ extern double avmd_desa2(circ_buffer_t *b, size_t i) x2sq = x2 * x2; d = 2.0 * ((x2sq) - (x1 * x3)); - if (d == 0.0) return 0.0; - n = ((x2sq) - (x0 * x4)) - ((x1 * x1) - (x0 * x2)) - ((x3 * x3) - (x2 * x4)); + if (d == 0.0) { + *amplitude = 0.0; + return 0.0; + } + PSI_Xn = ((x2sq) - (x0 * x4)); + NEEDED = ((x1 * x1) - (x0 * x2)) + ((x3 * x3) - (x2 * x4)); + n = ((x2sq) - (x0 * x4)) - NEEDED; + PSI_Yn = NEEDED + PSI_Xn; #ifdef AVMD_FAST_MATH result = 0.5 * (double)fast_acosf((float)n/d); @@ -48,7 +55,10 @@ extern double avmd_desa2(circ_buffer_t *b, size_t i) result = 0.5 * acos(n/d); #endif - if (ISNAN(result)) result = 0.0; + if (ISNAN(result)) { + result = 0.0; + } + *amplitude = 2.0 * PSI_Xn / sqrt(PSI_Yn); return result; diff --git a/src/mod/applications/mod_avmd/avmd_desa2.h b/src/mod/applications/mod_avmd/avmd_desa2.h index f6488e2ad8..1da9ef346e 100644 --- a/src/mod/applications/mod_avmd/avmd_desa2.h +++ b/src/mod/applications/mod_avmd/avmd_desa2.h @@ -1,7 +1,10 @@ /* * @brief DESA-2 algorithm implementation. - * @author Eric des Courtis - * @par Modifications: Piotr Gregor < piotrek.gregor gmail.com > + * + * Contributor(s): + * + * Eric des Courtis + * Piotr Gregor : */ @@ -12,8 +15,8 @@ #include #include "avmd_buffer.h" -/* Returns digital frequency estimation. */ -extern double avmd_desa2(circ_buffer_t *b, size_t i); +/* Returns digital frequency estimation and amplitude estimation. */ +extern double avmd_desa2(circ_buffer_t *b, size_t i, double *amplitude) __attribute__ ((nonnull(1,3))); #endif /* __AVMD_DESA2_H__ */ diff --git a/src/mod/applications/mod_avmd/avmd_desa2_tweaked.c b/src/mod/applications/mod_avmd/avmd_desa2_tweaked.c index 8eae1753f3..f1ad5243d6 100644 --- a/src/mod/applications/mod_avmd/avmd_desa2_tweaked.c +++ b/src/mod/applications/mod_avmd/avmd_desa2_tweaked.c @@ -19,11 +19,10 @@ int __isnan(double); #include "avmd_fast_acosf.h" #endif + double -avmd_desa2_tweaked(circ_buffer_t *b, size_t i) -{ - double d; - double n; +avmd_desa2_tweaked(circ_buffer_t *b, size_t i, double *amplitude) { + double n, d; double x0; double x1; double x2; @@ -31,6 +30,7 @@ avmd_desa2_tweaked(circ_buffer_t *b, size_t i) double x4; double x2sq; double result; + double PSI_Xn, PSI_Yn, NEEDED; x0 = GET_SAMPLE((b), (i)); x1 = GET_SAMPLE((b), ((i) + 1)); @@ -39,8 +39,10 @@ avmd_desa2_tweaked(circ_buffer_t *b, size_t i) x4 = GET_SAMPLE((b), ((i) + 4)); x2sq = x2 * x2; d = 2.0 * ((x2sq) - (x1 * x3)); - n = ((x2sq) - (x0 * x4)) - ((x1 * x1) - - (x0 * x2)) - ((x3 * x3) - (x2 * x4)); + PSI_Xn = ((x2sq) - (x0 * x4)); + NEEDED = ((x1 * x1) - (x0 * x2)) + ((x3 * x3) - (x2 * x4)); + n = ((x2sq) - (x0 * x4)) - NEEDED; + PSI_Yn = NEEDED + PSI_Xn; /* instead of #ifdef FASTMATH @@ -52,11 +54,14 @@ avmd_desa2_tweaked(circ_buffer_t *b, size_t i) result = n/d; if (ISINF(result)) { - if (n < 0.0) + *amplitude = 0.0; + if (n < 0.0) { return -10.0; - else + } else { return 10.0; + } } + *amplitude = 2.0 * PSI_Xn / sqrt(PSI_Yn); return result; } diff --git a/src/mod/applications/mod_avmd/avmd_desa2_tweaked.h b/src/mod/applications/mod_avmd/avmd_desa2_tweaked.h index 167e241c9d..997abbb84d 100644 --- a/src/mod/applications/mod_avmd/avmd_desa2_tweaked.h +++ b/src/mod/applications/mod_avmd/avmd_desa2_tweaked.h @@ -33,9 +33,10 @@ * to corresponding frequencies is nonlinear. * The actual frequency estimation can be retrieved later * from this partial result using - * 0.5 * acos(n/d) + * 0.5 * acos(returned_value) + * Amplitude estimation is returned by address. */ -double avmd_desa2_tweaked(circ_buffer_t *b, size_t i); +double avmd_desa2_tweaked(circ_buffer_t *b, size_t i, double *amplitude) __attribute__ ((nonnull(1,3))); #endif /* __AVMD_DESA2_TWEAKED_H__ */ diff --git a/src/mod/applications/mod_avmd/avmd_psi.h b/src/mod/applications/mod_avmd/avmd_psi.h index 1764897d65..db6d83a60e 100644 --- a/src/mod/applications/mod_avmd/avmd_psi.h +++ b/src/mod/applications/mod_avmd/avmd_psi.h @@ -4,6 +4,8 @@ #include "avmd_buffer.h" -#define PSI(b, i) (GET_SAMPLE((b), ((i) + 1))*GET_SAMPLE((b), ((i) + 1))-GET_SAMPLE((b), ((i) + 2))*GET_SAMPLE((b), ((i) + 0))) + +#define PSI(b, i) (GET_SAMPLE((b), ((i) + 1)) * GET_SAMPLE((b), ((i) + 1)) - GET_SAMPLE((b), ((i) + 2)) * GET_SAMPLE((b), ((i) + 0))) + #endif /* __AVMD_PSI_H__ */ diff --git a/src/mod/applications/mod_avmd/mod_avmd.c b/src/mod/applications/mod_avmd/mod_avmd.c index 19f0ed71b0..5fa0bb474f 100644 --- a/src/mod/applications/mod_avmd/mod_avmd.c +++ b/src/mod/applications/mod_avmd/mod_avmd.c @@ -175,6 +175,8 @@ typedef struct { circ_buffer_t b; sma_buffer_t sma_b; sma_buffer_t sqa_b; + sma_buffer_t sma_amp_b; + sma_buffer_t sqa_amp_b; size_t pos; double f; /* freq_table_t ft; */ @@ -199,7 +201,7 @@ static switch_status_t avmd_register_all_events(void); static void avmd_unregister_all_events(void); static void -avmd_fire_event(enum avmd_event type, switch_core_session_t *fs_s, double freq, double v, avmd_beep_state_t beep_status, uint8_t info); +avmd_fire_event(enum avmd_event type, switch_core_session_t *fs_s, double freq, double v_freq, double amp, double v_amp, avmd_beep_state_t beep_status, uint8_t info); /* API [set default], reset to factory settings */ static void avmd_set_xml_default_configuration(switch_mutex_t *mutex); @@ -276,6 +278,20 @@ init_avmd_session_data(avmd_session_t *avmd_session, switch_core_session_t *fs_s goto end; } memset(avmd_session->sqa_b.data, 0, sizeof(BUFF_TYPE) * buf_sz); + + INIT_SMA_BUFFER(&avmd_session->sma_amp_b, buf_sz, fs_session); + if (avmd_session->sma_amp_b.data == NULL) { + status = SWITCH_STATUS_FALSE; + goto end; + } + memset(avmd_session->sma_amp_b.data, 0, sizeof(BUFF_TYPE) * buf_sz); + + INIT_SMA_BUFFER(&avmd_session->sqa_amp_b, buf_sz, fs_session); + if (avmd_session->sqa_amp_b.data == NULL) { + status = SWITCH_STATUS_FALSE; + goto end; + } + memset(avmd_session->sqa_amp_b.data, 0, sizeof(BUFF_TYPE) * buf_sz); end: if (mutex != NULL) { @@ -407,8 +423,7 @@ avmd_unregister_all_events(void) } static void -avmd_fire_event(enum avmd_event type, switch_core_session_t *fs_s, double freq, double v, avmd_beep_state_t beep_status, uint8_t info) -{ +avmd_fire_event(enum avmd_event type, switch_core_session_t *fs_s, double freq, double v_freq, double amp, double v_amp, avmd_beep_state_t beep_status, uint8_t info) { int res; switch_event_t *event; switch_status_t status; @@ -421,23 +436,36 @@ avmd_fire_event(enum avmd_event type, switch_core_session_t *fs_s, double freq, } switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Unique-ID", switch_core_session_get_uuid(fs_s)); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-command", "avmd"); - switch (type) - { + switch (type) { case AVMD_EVENT_BEEP: switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Beep-Status", "DETECTED"); res = snprintf(buf, AVMD_CHAR_BUF_LEN, "%f", freq); if (res < 0 || res > AVMD_CHAR_BUF_LEN - 1) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(fs_s), SWITCH_LOG_ERROR, "Frequency truncated [%s], [%d] attempted!\n", buf, res); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "frequency", "ERROR (TRUNCATED)"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Frequency", "ERROR (TRUNCATED)"); } - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "frequency", buf); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Frequency", buf); - res = snprintf(buf, AVMD_CHAR_BUF_LEN, "%f", v); + res = snprintf(buf, AVMD_CHAR_BUF_LEN, "%f", v_freq); if (res < 0 || res > AVMD_CHAR_BUF_LEN - 1) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(fs_s), SWITCH_LOG_ERROR, "Error, truncated [%s], [%d] attempeted!\n", buf, res); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variance", "ERROR (TRUNCATED)"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Frequency-variance", "ERROR (TRUNCATED)"); } - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "variance", buf); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Frequency-variance", buf); + + res = snprintf(buf, AVMD_CHAR_BUF_LEN, "%f", amp); + if (res < 0 || res > AVMD_CHAR_BUF_LEN - 1) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(fs_s), SWITCH_LOG_ERROR, "Amplitude truncated [%s], [%d] attempted!\n", buf, res); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Amplitude", "ERROR (TRUNCATED)"); + } + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Amplitude", buf); + + res = snprintf(buf, AVMD_CHAR_BUF_LEN, "%f", v_amp); + if (res < 0 || res > AVMD_CHAR_BUF_LEN - 1) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(fs_s), SWITCH_LOG_ERROR, "Error, truncated [%s], [%d] attempeted!\n", buf, res); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Amplitude-variance", "ERROR (TRUNCATED)"); + } + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Amplitude-variance", buf); break; case AVMD_EVENT_SESSION_START: @@ -1055,7 +1083,7 @@ SWITCH_STANDARD_APP(avmd_start_app) goto end; } switch_channel_set_private(channel, "_avmd_", bug); /* Set the avmd tag to detect an existing avmd media bug */ - avmd_fire_event(AVMD_EVENT_SESSION_START, session, 0, 0, 0, 0); + avmd_fire_event(AVMD_EVENT_SESSION_START, session, 0, 0, 0, 0, 0, 0); if (avmd_session->settings.report_status == 1) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "Avmd on channel [%s] started!\n", switch_channel_get_name(channel)); } @@ -1113,9 +1141,9 @@ SWITCH_STANDARD_APP(avmd_stop_app) switch_channel_set_private(channel, "_avmd_", NULL); switch_core_media_bug_remove(session, &bug); if (avmd_found == 1) { - avmd_fire_event(AVMD_EVENT_SESSION_STOP, session, 0, 0, beep_status, 1); + avmd_fire_event(AVMD_EVENT_SESSION_STOP, session, 0, 0, 0, 0, beep_status, 1); } else { - avmd_fire_event(AVMD_EVENT_SESSION_STOP, session, 0, 0, beep_status, 0); + avmd_fire_event(AVMD_EVENT_SESSION_STOP, session, 0, 0, 0, 0, beep_status, 0); } if (report_status == 1) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "Avmd on channel [%s] stopped, beep status: [%s]\n", @@ -1379,7 +1407,7 @@ SWITCH_STANDARD_API(avmd_api_main) uuid_dup = switch_core_strdup(switch_core_session_get_pool(fs_session), uuid); switch_channel_set_private(channel, "_avmd_", NULL); switch_core_media_bug_remove(fs_session, &bug); - avmd_fire_event(AVMD_EVENT_SESSION_STOP, fs_session, 0, 0, 0, 0); + avmd_fire_event(AVMD_EVENT_SESSION_STOP, fs_session, 0, 0, 0, 0, 0, 0); if (avmd_globals.settings.report_status == 1) { stream->write_function(stream, "+OK\n [%s] [%s] stopped\n\n", uuid_dup, switch_channel_get_name(channel)); @@ -1500,7 +1528,7 @@ SWITCH_STANDARD_API(avmd_api_main) switch_channel_set_private(channel, "_avmd_", bug); /* Set the vmd tag to detect an existing vmd media bug */ - avmd_fire_event(AVMD_EVENT_SESSION_START, fs_session, 0, 0, 0, 0); + avmd_fire_event(AVMD_EVENT_SESSION_START, fs_session, 0, 0, 0, 0, 0, 0); if (avmd_globals.settings.report_status == 1) { stream->write_function(stream, "+OK\n [%s] [%s] started!\n\n", uuid, switch_channel_get_name(channel)); @@ -1529,9 +1557,9 @@ static void avmd_process(avmd_session_t *s, switch_frame_t *frame) { switch_channel_t *channel; circ_buffer_t *b; size_t pos; - double omega; + double omega, amplitude; double f; - double v; + double v, v_amp; double sma_digital_freq; uint32_t sine_len_i; int sample_to_skip_n = s->settings.sample_n_to_skip; @@ -1559,7 +1587,7 @@ static void avmd_process(avmd_session_t *s, switch_frame_t *frame) { /*for (pos = session->pos; pos < (GET_CURRENT_POS(b) - P); pos++) { */ if ((sample_n % sine_len_i) == 0) { /* Get a desa2 frequency estimate every sine len */ - omega = avmd_desa2_tweaked(b, pos + sample_n); + omega = avmd_desa2_tweaked(b, pos + sample_n, &litude); if (omega < -0.999999 || omega > 0.999999) { if (s->settings.debug == 1) { @@ -1569,6 +1597,8 @@ static void avmd_process(avmd_session_t *s, switch_frame_t *frame) { if (s->settings.require_continuous_streak == 1) { RESET_SMA_BUFFER(&s->sma_b); RESET_SMA_BUFFER(&s->sqa_b); + RESET_SMA_BUFFER(&s->sma_amp_b); + RESET_SMA_BUFFER(&s->sqa_amp_b); s->samples_streak = s->settings.sample_n_continuous_streak; sample_to_skip_n = s->settings.sample_n_to_skip; } @@ -1603,12 +1633,15 @@ static void avmd_process(avmd_session_t *s, switch_frame_t *frame) { APPEND_SMA_VAL(&s->sma_b, omega); /* append */ APPEND_SMA_VAL(&s->sqa_b, omega * omega); + APPEND_SMA_VAL(&s->sma_amp_b, amplitude); /* append */ + APPEND_SMA_VAL(&s->sqa_amp_b, amplitude * amplitude); if (s->settings.require_continuous_streak == 1) { if (s->samples_streak > 0) { --s->samples_streak; } } - v = s->sqa_b.sma - (s->sma_b.sma * s->sma_b.sma); /* calculate variance (biased estimator) */ + v = s->sqa_b.sma - (s->sma_b.sma * s->sma_b.sma); /* calculate variance of omega(biased estimator) */ + v_amp = s->sqa_amp_b.sma - (s->sma_amp_b.sma * s->sma_amp_b.sma); /* calculate variance of amplitude (biased estimator) */ if (s->settings.debug == 1) { #if !defined(WIN32) && defined(AVMD_FAST_MATH) f = 0.5 * (double) fast_acosf((float)omega); @@ -1619,11 +1652,16 @@ static void avmd_process(avmd_session_t *s, switch_frame_t *frame) { #endif /* !WIN32 && AVMD_FAST_MATH */ if (s->settings.require_continuous_streak == 1) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(s->session), SWITCH_LOG_DEBUG, "<<< AVMD v[%.10f]\tomega[%f]\tf[%f] [%f]Hz\t\tsma[%f][%f]Hz\t\tsqa[%f]\t" - "streak[%zu] pos[%zu] sample_n[%zu] lpos[%zu] s[%zu]>>>\n", v, omega, f, TO_HZ(s->rate, f), s->sma_b.sma, TO_HZ(s->rate, sma_digital_freq), s->sqa_b.sma, s->samples_streak, - s->sma_b.pos, sample_n, s->sma_b.lpos, pos); + "amplitude[%f]\tv_amp[%f]\t" + "streak[%zu] pos[%zu] sample_n[%zu] lpos[%zu] s[%zu]>>>\n", v, omega, f, TO_HZ(s->rate, f), s->sma_b.sma, TO_HZ(s->rate, sma_digital_freq), s->sqa_b.sma, + amplitude, v_amp, + s->samples_streak, s->sma_b.pos, sample_n, s->sma_b.lpos, pos); } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(s->session), SWITCH_LOG_DEBUG, "<<< AVMD v[%.10f]\tomega[%f]\tf[%f] [%f]Hz\t\tsma[%f][%f]Hz\t\tsqa[%f]\tpos[%zu]" - " sample_n[%zu] lpos[%zu] s[%zu]>>>\n", v, omega, f, TO_HZ(s->rate, f), s->sma_b.sma, TO_HZ(s->rate, sma_digital_freq), s->sqa_b.sma, s->sma_b.pos, sample_n, s->sma_b.lpos, pos); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(s->session), SWITCH_LOG_DEBUG, "<<< AVMD v[%.10f]\tomega[%f]\tf[%f] [%f]Hz\t\tsma[%f][%f]Hz\t\tsqa[%f]\t" + "amplitude[%f]\tv_amp[%f]\t" + "pos[%zu] sample_n[%zu] lpos[%zu] s[%zu]>>>\n", v, omega, f, TO_HZ(s->rate, f), s->sma_b.sma, TO_HZ(s->rate, sma_digital_freq), s->sqa_b.sma, + amplitude, v_amp, + s->sma_b.pos, sample_n, s->sma_b.lpos, pos); } } } @@ -1641,13 +1679,15 @@ static void avmd_process(avmd_session_t *s, switch_frame_t *frame) { switch_channel_set_variable_printf(channel, "avmd_total_time", "[%d]", (int)(switch_micro_time_now() - s->start_time) / 1000); switch_channel_execute_on(channel, "execute_on_avmd_beep"); - avmd_fire_event(AVMD_EVENT_BEEP, s->session, TO_HZ(s->rate, sma_digital_freq), v, 0, 0); + avmd_fire_event(AVMD_EVENT_BEEP, s->session, TO_HZ(s->rate, sma_digital_freq), v, s->sma_amp_b.sma, v_amp, 0, 0); if (s->settings.report_status == 1) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(s->session), SWITCH_LOG_INFO, "<<< AVMD - Beep Detected: f = [%f], variance = [%f] >>>\n", TO_HZ(s->rate, sma_digital_freq), v); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(s->session), SWITCH_LOG_INFO, "<<< AVMD - Beep Detected: f = [%f] variance = [%f], amplitude = [%f] variance = [%f] >>>\n", TO_HZ(s->rate, sma_digital_freq), v, s->sma_amp_b.sma, v_amp); } switch_channel_set_variable(channel, "avmd_detect", "TRUE"); RESET_SMA_BUFFER(&s->sma_b); RESET_SMA_BUFFER(&s->sqa_b); + RESET_SMA_BUFFER(&s->sma_amp_b); + RESET_SMA_BUFFER(&s->sqa_amp_b); s->state.beep_state = BEEP_DETECTED; goto done; }