spandsp 3.0.0
v17rx.c File Reference
#include <stdlib.h>
#include <inttypes.h>
#include <string.h>
#include <stdio.h>
#include "spandsp/stdbool.h"
#include "floating_fudge.h"
#include "spandsp/telephony.h"
#include "spandsp/alloc.h"
#include "spandsp/logging.h"
#include "spandsp/fast_convert.h"
#include "spandsp/math_fixed.h"
#include "spandsp/saturated.h"
#include "spandsp/complex.h"
#include "spandsp/vector_float.h"
#include "spandsp/complex_vector_float.h"
#include "spandsp/vector_int.h"
#include "spandsp/complex_vector_int.h"
#include "spandsp/async.h"
#include "spandsp/power_meter.h"
#include "spandsp/arctan2.h"
#include "spandsp/dds.h"
#include "spandsp/complex_filters.h"
#include "spandsp/v29rx.h"
#include "spandsp/v17tx.h"
#include "spandsp/v17rx.h"
#include "spandsp/private/logging.h"
#include "spandsp/private/power_meter.h"
#include "spandsp/private/v17rx.h"
#include "v17_v32bis_rx_rrc.h"
#include "v17_v32bis_tx_constellation_maps.h"
#include "v17_v32bis_rx_constellation_maps.h"

Macros

#define IAXMODEM_STUFF
 
#define FP_SCALE(x)   (x)
 
#define FP_SYNC_SCALE(x)   (x)
 
#define FP_SYNC_SCALE_32(x)   (x)
 
#define FP_CONSTELLATION_SCALE(x)   FP_SCALE(x)
 
#define CARRIER_NOMINAL_FREQ   1800.0f
 
#define BAUD_RATE   2400
 
#define EQUALIZER_FAST_ADAPTION_DELTA   (0.21f/V17_EQUALIZER_LEN)
 
#define EQUALIZER_SLOW_ADAPTION_DELTA   (0.1f*EQUALIZER_FAST_ADAPTION_DELTA)
 
#define V17_TRAINING_SEG_1_LEN   256
 
#define V17_TRAINING_SEG_2_LEN   2976
 
#define V17_TRAINING_SHORT_SEG_2_LEN   38
 
#define V17_TRAINING_SEG_3_LEN   64
 
#define V17_TRAINING_SEG_4A_LEN   15
 
#define V17_TRAINING_SEG_4_LEN   48
 
#define V17_BRIDGE_WORD   0x8880
 
#define SIN_LOW_BAND_EDGE   0.453990499f
 
#define COS_LOW_BAND_EDGE   0.891006542f
 
#define SIN_HIGH_BAND_EDGE   0.707106781f
 
#define COS_HIGH_BAND_EDGE   -0.707106781f
 
#define ALPHA   0.99f
 
#define SYNC_LOW_BAND_EDGE_COEFF_0   FP_SYNC_SCALE(2.0f*ALPHA*COS_LOW_BAND_EDGE)
 
#define SYNC_LOW_BAND_EDGE_COEFF_1   FP_SYNC_SCALE(-ALPHA*ALPHA)
 
#define SYNC_LOW_BAND_EDGE_COEFF_2   FP_SYNC_SCALE(-ALPHA*SIN_LOW_BAND_EDGE)
 
#define SYNC_HIGH_BAND_EDGE_COEFF_0   FP_SYNC_SCALE(2.0f*ALPHA*COS_HIGH_BAND_EDGE)
 
#define SYNC_HIGH_BAND_EDGE_COEFF_1   FP_SYNC_SCALE(-ALPHA*ALPHA)
 
#define SYNC_HIGH_BAND_EDGE_COEFF_2   FP_SYNC_SCALE(-ALPHA*SIN_HIGH_BAND_EDGE)
 
#define SYNC_MIXED_EDGES_COEFF_3   FP_SYNC_SCALE(-ALPHA*ALPHA*(SIN_HIGH_BAND_EDGE*COS_LOW_BAND_EDGE - SIN_LOW_BAND_EDGE*COS_HIGH_BAND_EDGE))
 

Enumerations

enum  {
  TRAINING_STAGE_NORMAL_OPERATION = 0 , TRAINING_STAGE_SYMBOL_ACQUISITION , TRAINING_STAGE_LOG_PHASE , TRAINING_STAGE_SHORT_WAIT_FOR_CDBA ,
  TRAINING_STAGE_WAIT_FOR_CDBA , TRAINING_STAGE_COARSE_TRAIN_ON_CDBA , TRAINING_STAGE_FINE_TRAIN_ON_CDBA , TRAINING_STAGE_SHORT_TRAIN_ON_CDBA_AND_TEST ,
  TRAINING_STAGE_TRAIN_ON_CDBA_AND_TEST , TRAINING_STAGE_BRIDGE , TRAINING_STAGE_TCM_WINDUP , TRAINING_STAGE_TEST_ONES ,
  TRAINING_STAGE_PARKED
}
 

Functions

float v17_rx_carrier_frequency (v17_rx_state_t *s)
 
float v17_rx_symbol_timing_correction (v17_rx_state_t *s)
 
float v17_rx_signal_power (v17_rx_state_t *s)
 
void v17_rx_signal_cutoff (v17_rx_state_t *s, float cutoff)
 
int v17_rx_equalizer_state (v17_rx_state_t *s, complexf_t **coeffs)
 Get a snapshot of the current equalizer coefficients.
 
int v17_rx (v17_rx_state_t *s, const int16_t amp[], int len)
 Process a block of received V.17 modem audio samples.
 
int v17_rx_fillin (v17_rx_state_t *s, int len)
 Fake processing of a missing block of received V.17 modem audio samples.
 
void v17_rx_set_put_bit (v17_rx_state_t *s, put_bit_func_t put_bit, void *user_data)
 Change the put_bit function associated with a V.17 modem receive context.
 
void v17_rx_set_modem_status_handler (v17_rx_state_t *s, modem_status_func_t handler, void *user_data)
 Change the modem status report function associated with a V.17 modem receive context.
 
logging_state_tv17_rx_get_logging_state (v17_rx_state_t *s)
 Get the logging context associated with a V.17 modem receive context.
 
int v17_rx_restart (v17_rx_state_t *s, int bit_rate, int short_train)
 Reinitialise an existing V.17 modem receive context.
 
v17_rx_state_tv17_rx_init (v17_rx_state_t *s, int bit_rate, put_bit_func_t put_bit, void *user_data)
 Initialise a V.17 modem receive context.
 
int v17_rx_release (v17_rx_state_t *s)
 Release a V.17 modem receive context.
 
int v17_rx_free (v17_rx_state_t *s)
 Free a V.17 modem receive context.
 
void v17_rx_set_qam_report_handler (v17_rx_state_t *s, qam_report_handler_t handler, void *user_data)
 

Macro Definition Documentation

◆ BAUD_RATE

#define BAUD_RATE   2400

The nominal baud or symbol rate

◆ CARRIER_NOMINAL_FREQ

#define CARRIER_NOMINAL_FREQ   1800.0f

The nominal frequency of the carrier, in Hertz

◆ EQUALIZER_FAST_ADAPTION_DELTA

#define EQUALIZER_FAST_ADAPTION_DELTA   (0.21f/V17_EQUALIZER_LEN)

The adaption rate coefficient for the equalizer during initial training

◆ EQUALIZER_SLOW_ADAPTION_DELTA

#define EQUALIZER_SLOW_ADAPTION_DELTA   (0.1f*EQUALIZER_FAST_ADAPTION_DELTA)

The adaption rate coefficient for the equalizer during fine tuning

◆ V17_BRIDGE_WORD

#define V17_BRIDGE_WORD   0x8880

The 16 bit pattern used in the bridge section of the training sequence

◆ V17_TRAINING_SEG_1_LEN

#define V17_TRAINING_SEG_1_LEN   256

The length of training segment 1, in symbols

◆ V17_TRAINING_SEG_2_LEN

#define V17_TRAINING_SEG_2_LEN   2976

The length of training segment 2 in long training mode, in symbols

◆ V17_TRAINING_SEG_3_LEN

#define V17_TRAINING_SEG_3_LEN   64

The length of training segment 3, in symbols

◆ V17_TRAINING_SEG_4_LEN

#define V17_TRAINING_SEG_4_LEN   48

The length of training segment 4, in symbols

◆ V17_TRAINING_SEG_4A_LEN

#define V17_TRAINING_SEG_4A_LEN   15

The length of training segment 4A, in symbols

◆ V17_TRAINING_SHORT_SEG_2_LEN

#define V17_TRAINING_SHORT_SEG_2_LEN   38

The length of training segment 2 in short training mode, in symbols

Function Documentation

◆ v17_rx()

int v17_rx ( v17_rx_state_t s,
const int16_t  amp[],
int  len 
)

Process a block of received V.17 modem audio samples.

Process a block of received V.17 modem audio samples.

Parameters
sThe modem context.
ampThe audio sample buffer.
lenThe number of samples in the buffer.
Returns
The number of samples unprocessed.

References v17_rx_state_s::agc_scaling, v17_rx_state_s::agc_scaling_save, v17_rx_state_s::carrier_phase, v17_rx_state_s::carrier_phase_rate, dds_advance(), dds_advancef(), dds_lookup_complexf(), dds_lookup_complexi16(), v17_rx_state_s::eq_put_step, complexi16_t::im, complexi16_t::re, v17_rx_state_s::rrc_filter, v17_rx_state_s::rrc_filter_step, v17_rx_state_s::symbol_sync_high, v17_rx_state_s::symbol_sync_low, and v17_rx_state_s::training_stage.

◆ v17_rx_carrier_frequency()

float v17_rx_carrier_frequency ( v17_rx_state_t s)

Get the current received carrier frequency.

Parameters
sThe modem context.
Returns
The frequency, in Hertz.

References v17_rx_state_s::carrier_phase_rate, and dds_frequencyf().

◆ v17_rx_equalizer_state()

int v17_rx_equalizer_state ( v17_rx_state_t s,
complexf_t **  coeffs 
)

Get a snapshot of the current equalizer coefficients.

Get a snapshot of the current equalizer coefficients.

Parameters
sThe modem context.
coeffsThe vector of complex coefficients.
Returns
The number of coefficients in the vector.

References v17_rx_state_s::eq_coeff.

◆ v17_rx_fillin()

int v17_rx_fillin ( v17_rx_state_t s,
int  len 
)

Fake processing of a missing block of received V.17 modem audio samples.

Fake processing of a missing block of received V.17 modem audio samples. (e.g due to packet loss).

Parameters
sThe modem context.
lenThe number of samples to fake.
Returns
The number of samples unprocessed.

References v17_rx_state_s::carrier_phase, v17_rx_state_s::carrier_phase_rate, dds_advance(), dds_advancef(), v17_rx_state_s::eq_put_step, v17_rx_state_s::logging, v17_rx_state_s::signal_present, span_log(), and v17_rx_state_s::training_stage.

◆ v17_rx_free()

int v17_rx_free ( v17_rx_state_t s)

Free a V.17 modem receive context.

Free a V.17 modem receive context.

Parameters
sThe modem context.
Returns
0 for OK

◆ v17_rx_get_logging_state()

logging_state_t * v17_rx_get_logging_state ( v17_rx_state_t s)

Get the logging context associated with a V.17 modem receive context.

Get the logging context associated with a V.17 modem receive context.

Parameters
sThe modem context.
Returns
A pointer to the logging context

References v17_rx_state_s::logging.

◆ v17_rx_init()

v17_rx_state_t * v17_rx_init ( v17_rx_state_t s,
int  bit_rate,
put_bit_func_t  put_bit,
void *  user_data 
)

Initialise a V.17 modem receive context.

Initialise a V.17 modem receive context.

Parameters
sThe modem context.
bit_rateThe bit rate of the modem. Valid values are 7200, 9600, 12000 and 14400.
put_bitThe callback routine used to put the received data.
user_dataAn opaque pointer passed to the put_bit routine.
Returns
A pointer to the modem context, or NULL if there was a problem.

References CARRIER_NOMINAL_FREQ, v17_rx_state_s::carrier_phase_rate_save, v17_rx_state_s::logging, v17_rx_state_s::put_bit, v17_rx_state_s::put_bit_user_data, v17_rx_state_s::scrambler_tap, v17_rx_state_s::short_train, v17_rx_restart(), and v17_rx_signal_cutoff().

◆ v17_rx_release()

int v17_rx_release ( v17_rx_state_t s)

Release a V.17 modem receive context.

Release a V.17 modem receive context.

Parameters
sThe modem context.
Returns
0 for OK

◆ v17_rx_restart()

int v17_rx_restart ( v17_rx_state_t s,
int  bit_rate,
int  short_train 
)

Reinitialise an existing V.17 modem receive context.

Reinitialise an existing V.17 modem receive context.

Parameters
sThe modem context.
bit_rateThe bit rate of the modem. Valid values are 7200, 9600, 12000 and 14400.
short_train0 if a long training sequence is expected. 1 if a short training sequence is expected. 2 if the expected training sequence is automatically selected.
Returns
0 for OK, -1 for bad parameter

References v17_rx_state_s::agc_scaling, v17_rx_state_s::agc_scaling_save, v17_rx_state_s::baud_half, v17_rx_state_s::baud_phase, v17_rx_state_s::bit_rate, v17_rx_state_s::bits_per_symbol, v17_rx_state_s::carrier_drop_pending, CARRIER_NOMINAL_FREQ, v17_rx_state_s::carrier_phase, v17_rx_state_s::carrier_phase_rate, v17_rx_state_s::carrier_phase_rate_save, v17_rx_state_s::carrier_track_i, v17_rx_state_s::carrier_track_p, v17_rx_state_s::constellation, dds_frequencyf(), v17_rx_state_s::diff, v17_rx_state_s::diff_angles, v17_rx_state_s::distances, v17_rx_state_s::full_path_to_past_state_locations, v17_rx_state_s::high_sample, v17_rx_state_s::last_angles, v17_rx_state_s::last_sample, v17_rx_state_s::logging, v17_rx_state_s::low_samples, v17_rx_state_s::past_state_locations, v17_rx_state_s::power, power_meter_init(), v17_rx_state_s::rrc_filter, v17_rx_state_s::rrc_filter_step, v17_rx_state_s::scramble_reg, v17_rx_state_s::short_train, v17_rx_state_s::signal_present, v17_rx_state_s::space_map, span_log(), v17_rx_state_s::symbol_sync_dc_filter, v17_rx_state_s::symbol_sync_high, v17_rx_state_s::symbol_sync_low, v17_rx_state_s::total_baud_timing_correction, v17_rx_state_s::training_count, v17_rx_state_s::training_error, v17_rx_state_s::training_stage, and v17_rx_state_s::trellis_ptr.

Referenced by v17_rx_init().

◆ v17_rx_set_modem_status_handler()

void v17_rx_set_modem_status_handler ( v17_rx_state_t s,
modem_status_func_t  handler,
void *  user_data 
)

Change the modem status report function associated with a V.17 modem receive context.

Change the modem status report function associated with a V.17 modem receive context.

Parameters
sThe modem context.
handlerThe callback routine used to report modem status changes.
user_dataAn opaque pointer.

References v17_rx_state_s::status_handler, and v17_rx_state_s::status_user_data.

◆ v17_rx_set_put_bit()

void v17_rx_set_put_bit ( v17_rx_state_t s,
put_bit_func_t  put_bit,
void *  user_data 
)

Change the put_bit function associated with a V.17 modem receive context.

Change the put_bit function associated with a V.17 modem receive context.

Parameters
sThe modem context.
put_bitThe callback routine used to handle received bits.
user_dataAn opaque pointer.

References v17_rx_state_s::put_bit, and v17_rx_state_s::put_bit_user_data.

◆ v17_rx_set_qam_report_handler()

void v17_rx_set_qam_report_handler ( v17_rx_state_t s,
qam_report_handler_t  handler,
void *  user_data 
)

Set a handler routine to process QAM status reports

Parameters
sThe modem context.
handlerThe handler routine.
user_dataAn opaque pointer passed to the handler routine.

References v17_rx_state_s::qam_report, and v17_rx_state_s::qam_user_data.

◆ v17_rx_signal_cutoff()

void v17_rx_signal_cutoff ( v17_rx_state_t s,
float  cutoff 
)

Set the power level at which the carrier detection will cut in

Parameters
sThe modem context.
cutoffThe signal cutoff power, in dBm0.

References v17_rx_state_s::carrier_off_power, v17_rx_state_s::carrier_on_power, and power_meter_level_dbm0().

Referenced by v17_rx_init().

◆ v17_rx_signal_power()

float v17_rx_signal_power ( v17_rx_state_t s)

Get a current received signal power.

Parameters
sThe modem context.
Returns
The signal power, in dBm0.

References v17_rx_state_s::power, and power_meter_current_dbm0().

◆ v17_rx_symbol_timing_correction()

float v17_rx_symbol_timing_correction ( v17_rx_state_t s)

Get the current symbol timing correction since startup.

Parameters
sThe modem context.
Returns
The correction.

References v17_rx_state_s::total_baud_timing_correction.