static void qam_report(void *user_data, const complexf_t *constel, const complexf_t *target, int symbol) { int i; int len; complexf_t *coeffs; float fpower; v17_rx_state_t *rx; static float smooth_power = 0.0f; static int update_interval = 100; rx = (v17_rx_state_t *) user_data; if (constel) { #if defined(ENABLE_GUI) if (use_gui) { qam_monitor_update_constel(qam_monitor, constel); qam_monitor_update_carrier_tracking(qam_monitor, v17_rx_carrier_frequency(rx)); qam_monitor_update_symbol_tracking(qam_monitor, v17_rx_symbol_timing_correction(rx)); } #endif fpower = (constel->re - target->re)*(constel->re - target->re) + (constel->im - target->im)*(constel->im - target->im); smooth_power = 0.95f*smooth_power + 0.05f*fpower; printf("%8d [%8.4f, %8.4f] [%8.4f, %8.4f] %2x %8.4f %8.4f %9.4f %7.3f %7.4f\n", symbol_no, constel->re, constel->im, target->re, target->im, symbol, fpower, smooth_power, v17_rx_carrier_frequency(rx), v17_rx_signal_power(rx), v17_rx_symbol_timing_correction(rx)); printf("Carrier %d %f %f\n", symbol_no, v17_rx_carrier_frequency(rx), v17_rx_symbol_timing_correction(rx)); symbol_no++; if (--update_interval <= 0) { len = v17_rx_equalizer_state(rx, &coeffs); printf("Equalizer A:\n"); for (i = 0; i < len; i++) printf("%3d (%15.5f, %15.5f) -> %15.5f\n", i, coeffs[i].re, coeffs[i].im, powerf(&coeffs[i])); #if defined(ENABLE_GUI) if (use_gui) qam_monitor_update_equalizer(qam_monitor, coeffs, len); #endif update_interval = 100; } } }
static void v17_rx_status_handler(void *user_data, int status) { fax_modems_state_t *s; s = (fax_modems_state_t *) user_data; switch (status) { case SIG_STATUS_TRAINING_SUCCEEDED: span_log(&s->logging, SPAN_LOG_FLOW, "Switching to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&s->v17_rx)); s->rx_handler = (span_rx_handler_t *) &v17_rx; s->rx_user_data = &s->v17_rx; break; } }
static void qam_report(void *user_data, const complexf_t *constel, const complexf_t *target, int symbol) #endif { int i; int len; #if defined(SPANDSP_USE_FIXED_POINT) complexi16_t *coeffs; complexf_t constel_point; #else complexf_t *coeffs; #endif float fpower; v17_rx_state_t *rx; static float smooth_power = 0.0f; static int update_interval = 100; rx = (v17_rx_state_t *) user_data; if (constel) { fpower = (constel->re - target->re)*(constel->re - target->re) + (constel->im - target->im)*(constel->im - target->im); #if defined(SPANDSP_USE_FIXED_POINT) fpower /= 4096.0*4096.0; #endif smooth_power = 0.95f*smooth_power + 0.05f*fpower; #if defined(ENABLE_GUI) if (use_gui) { #if defined(SPANDSP_USE_FIXED_POINT) constel_point.re = constel->re/4096.0; constel_point.im = constel->im/4096.0; qam_monitor_update_constel(qam_monitor, &constel_point); #else qam_monitor_update_constel(qam_monitor, constel); #endif qam_monitor_update_carrier_tracking(qam_monitor, v17_rx_carrier_frequency(rx)); qam_monitor_update_symbol_tracking(qam_monitor, v17_rx_symbol_timing_correction(rx)); } #endif printf("%8d [%8.4f, %8.4f] [%8.4f, %8.4f] %2x %8.4f %8.4f %9.4f %7.3f %7.4f\n", symbol_no, #if defined(SPANDSP_USE_FIXED_POINT) constel->re/4096.0, constel->im/4096.0, target->re/4096.0, target->im/4096.0, #else constel->re, constel->im, target->re, target->im, #endif symbol, fpower, smooth_power, v17_rx_carrier_frequency(rx), v17_rx_signal_power(rx), v17_rx_symbol_timing_correction(rx)); //printf("Carrier %d %f %f\n", symbol_no, v17_rx_carrier_frequency(rx), v17_rx_symbol_timing_correction(rx)); symbol_no++; if (--update_interval <= 0) { len = v17_rx_equalizer_state(rx, &coeffs); printf("Equalizer A:\n"); for (i = 0; i < len; i++) #if defined(SPANDSP_USE_FIXED_POINT) printf("%3d (%15.5f, %15.5f)\n", i, coeffs[i].re/4096.0f, coeffs[i].im/4096.0f); #else printf("%3d (%15.5f, %15.5f) -> %15.5f\n", i, coeffs[i].re, coeffs[i].im, powerf(&coeffs[i])); #endif #if defined(ENABLE_GUI) if (use_gui) { #if defined(SPANDSP_USE_FIXED_POINT) qam_monitor_update_int_equalizer(qam_monitor, coeffs, len); #else qam_monitor_update_equalizer(qam_monitor, coeffs, len); #endif } #endif update_interval = 100; } } }
static void v17_rx_status_handler(void *user_data, int status) { fax_modems_state_t *s; s = (fax_modems_state_t *) user_data; switch (status) { case SIG_STATUS_TRAINING_SUCCEEDED: span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&s->fast_modems.v17_rx)); fax_modems_set_rx_handler(s, (span_rx_handler_t) &v17_rx, &s->fast_modems.v17_rx, (span_rx_fillin_handler_t) &v17_rx_fillin, &s->fast_modems.v17_rx); v17_rx_set_modem_status_handler(&s->fast_modems.v17_rx, NULL, s); break; } /*endswitch*/ s->fast_modems.v17_rx.put_bit(s->fast_modems.v17_rx.put_bit_user_data, status); }
static int v17_v21_rx(void *user_data, const int16_t amp[], int len) { fax_state_t *t; fax_modems_state_t *s; t = (fax_state_t *) user_data; s = &t->modems; v17_rx(&s->v17_rx, amp, len); if (t->t30.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&s->v17_rx)); set_rx_handler(t, (span_rx_handler_t *) &v17_rx, (span_rx_fillin_handler_t *) &v17_rx_fillin, &s->v17_rx); } else { fsk_rx(&s->v21_rx, amp, len); if (t->t30.rx_frame_received) { /* We have received something, and the fast modem has not trained. We must be receiving valid V.21 */ span_log(&t->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.21 (%.2fdBm0)\n", fsk_rx_signal_power(&s->v21_rx)); set_rx_handler(t, (span_rx_handler_t *) &fsk_rx, (span_rx_fillin_handler_t *) &fsk_rx_fillin, &s->v21_rx); } } return 0; }
static int early_v17_rx(void *user_data, const int16_t amp[], int len) { fax_state_t *s; s = (fax_state_t *) user_data; v17_rx(&(s->v17rx), amp, len); fsk_rx(&(s->v21rx), amp, len); if (s->t30_state.rx_trained) { /* The fast modem has trained, so we no longer need to run the slow one in parallel. */ span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&(s->v17rx))); s->rx_handler = (span_rx_handler_t *) &v17_rx; s->rx_user_data = &(s->v17rx); } return len; }