void desa2_freeswitch_double(double *input, double *mean1, double *mean2, double *var1, double *var2) { int i; circ_buffer_t b; sma_buffer_t sma_b; sma_buffer_t sqa_b; double freq[BLOCK]; // frequency estimates INIT_CIRC_BUFFER(&b, BLOCK); INIT_SMA_BUFFER(&sma_b, 10); INIT_SMA_BUFFER(&sqa_b, 10); INSERT_DOUBLE_FRAME(&b, input, BLOCK); // calculate the frequency estimate for each sample as in FS for (i = 0; i < (BLOCK - P); i++) { freq[i] = desa2_fs(&b, i); APPEND_SMA_VAL(&sma_b, freq[i]); APPEND_SMA_VAL(&sqa_b, freq[i] * freq[i]); *var1 = sqa_b.sma - (sma_b.sma * sma_b.sma); printf("<<< AVMD v[%f] f[%f][%f]Hz sma[%f][%f]Hz sqa[%f]\tsample[%d]\t[%f][%f]>>>\n", *var1, freq[i], TO_HZ(8000, freq[i]), sma_b.sma, TO_HZ(8000, sma_b.sma), sqa_b.sma, i, input[i], GET_SAMPLE((&b), i)); } /* set mean */ *mean1 = sma_b.sma; /* calculate the variance */ *var1 = sqa_b.sma - (sma_b.sma * sma_b.sma); /* for comparison calculate mean2 frequency & var2 */ double mean = 0.0; for (i = 0; i < (BLOCK - P); i++) { mean += freq[i]; } mean /= (double) (BLOCK - P); *mean2 = mean; *var2 = 0.0; for (i = 0; i < (BLOCK - P); i++ ) { *var2 += freq[i] * freq[i]; } *var2 /= (double)(BLOCK - P); *var2 -= (mean * mean); free(b.buf); free(sma_b.data); free(sqa_b.data); return; }
/*! \brief The avmd session data initialization function * @author Eric des Courtis * @param avmd_session A reference to a avmd session * @param fs_session A reference to a FreeSWITCH session */ static void init_avmd_session_data(avmd_session_t *avmd_session, switch_core_session_t *fs_session) { /*! This is a worst case sample rate estimate */ avmd_session->rate = 48000; INIT_CIRC_BUFFER(&avmd_session->b, BEEP_LEN(avmd_session->rate), FRAME_LEN(avmd_session->rate), fs_session); avmd_session->session = fs_session; avmd_session->pos = 0; avmd_session->state.last_beep = 0; avmd_session->state.beep_state = BEEP_NOTDETECTED; INIT_SMA_BUFFER( &avmd_session->sma_b, BEEP_LEN(avmd_session->rate) / SINE_LEN(avmd_session->rate), fs_session ); }