spandsp 3.1.1
private/v22bis.h
1/*
2 * SpanDSP - a series of DSP components for telephony
3 *
4 * private/v22bis.h - ITU V.22bis modem
5 *
6 * Written by Steve Underwood <steveu@coppice.org>
7 *
8 * Copyright (C) 2004 Steve Underwood
9 *
10 * All rights reserved.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License version 2.1,
14 * as published by the Free Software Foundation.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 */
25
26#if !defined(_SPANDSP_PRIVATE_V22BIS_H_)
27#define _SPANDSP_PRIVATE_V22BIS_H_
28
29/*! The length of the equalizer buffer */
30#define V22BIS_EQUALIZER_LEN 17
31/*! Samples before the target position in the equalizer buffer */
32#define V22BIS_EQUALIZER_PRE_LEN 8
33
34/*! The number of taps in the transmit pulse shaping filter */
35#define V22BIS_TX_FILTER_STEPS 9
36
37/*! The number of taps in the receive pulse shaping/bandpass filter */
38#define V22BIS_RX_FILTER_STEPS 27
39
40/*! Segments of the training sequence on the receive side */
41enum
42{
43 V22BIS_RX_TRAINING_STAGE_NORMAL_OPERATION,
44 V22BIS_RX_TRAINING_STAGE_SYMBOL_ACQUISITION,
45 V22BIS_RX_TRAINING_STAGE_LOG_PHASE,
46 V22BIS_RX_TRAINING_STAGE_UNSCRAMBLED_ONES,
47 V22BIS_RX_TRAINING_STAGE_UNSCRAMBLED_ONES_SUSTAINING,
48 V22BIS_RX_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200,
49 V22BIS_RX_TRAINING_STAGE_SCRAMBLED_ONES_AT_1200_SUSTAINING,
50 V22BIS_RX_TRAINING_STAGE_WAIT_FOR_SCRAMBLED_ONES_AT_2400,
51 V22BIS_RX_TRAINING_STAGE_PARKED
52};
53
54/*! Segments of the training sequence on the transmit side */
55enum
56{
57 V22BIS_TX_TRAINING_STAGE_NORMAL_OPERATION = 0,
58 V22BIS_TX_TRAINING_STAGE_INITIAL_SILENCE, /* Initial calling side state */
59 V22BIS_TX_TRAINING_STAGE_INITIAL_TIMED_SILENCE, /* Initial V,22bis answering side state */
60 V22BIS_TX_TRAINING_STAGE_U11,
61 V22BIS_TX_TRAINING_STAGE_U00, /* A special feature for testing purposes. */
62 V22BIS_TX_TRAINING_STAGE_U0011,
63 V22BIS_TX_TRAINING_STAGE_S11,
64 V22BIS_TX_TRAINING_STAGE_TIMED_S11,
65 V22BIS_TX_TRAINING_STAGE_S1111,
66 V22BIS_TX_TRAINING_STAGE_PARKED
67};
68
69#if defined(SPANDSP_USE_FIXED_POINT)
70extern const complexi16_t v22bis_constellation[16];
71#else
72extern const complexf_t v22bis_constellation[16];
73#endif
74
75/*!
76 V.22bis modem descriptor. This defines the working state for a single instance
77 of a V.22bis modem.
78*/
80{
81 /*! \brief The maximum permitted bit rate of the modem. Valid values are 1200 and 2400. */
83 /*! \brief Guard tone and sundry flags */
85 /*! \brief True if this is the calling side modem. */
87 /*! \brief The callback function used to get the next bit to be transmitted. */
89 /*! \brief A user specified opaque pointer passed to the get_bit callback routine. */
91 /*! \brief The callback function used to put each bit received. */
93 /*! \brief A user specified opaque pointer passed to the put_bit callback routine. */
95 /*! \brief The callback function used to report modem status changes. */
97 /*! \brief A user specified opaque pointer passed to the status function. */
99
100 int negotiated_bit_rate;
101
102 /* Receive section */
103 struct
104 {
105 /*! \brief Current offset into the RRC pulse shaping filter buffer. */
106 int rrc_filter_step;
107
108 /*! \brief The register for the data scrambler. */
109 uint32_t scramble_reg;
110 /*! \brief A counter for the number of consecutive bits of repeating pattern through
111 the scrambler. */
113
114 /*! \brief 0 if receiving user data. A training stage value during training */
115 int training;
116 /*! \brief A count of how far through the current training step we are. */
117 int training_count;
118
119 /*! \brief >0 if a signal above the minimum is present. It may or may not be a V.22bis signal. */
120 int signal_present;
121
122 /*! \brief The current phase of the carrier (i.e. the DDS parameter). */
123 uint32_t carrier_phase;
124 /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */
125 int32_t carrier_phase_rate;
126
127 /*! \brief A callback function which may be enabled to report every symbol's
128 constellation position. */
129 qam_report_handler_t qam_report;
130 /*! \brief A user specified opaque pointer passed to the qam_report callback
131 routine. */
132 void *qam_user_data;
133
134 /*! \brief A power meter, to measure the HPF'ed signal power in the channel. */
135 power_meter_t rx_power;
136 /*! \brief The power meter level at which carrier on is declared. */
137 int32_t carrier_on_power;
138 /*! \brief The power meter level at which carrier off is declared. */
139 int32_t carrier_off_power;
140
141 int constellation_state;
142
143#if defined(SPANDSP_USE_FIXED_POINT)
144 /*! \brief The scaling factor assessed by the AGC algorithm. */
145 int16_t agc_scaling;
146 /*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
147 int16_t rrc_filter[V22BIS_RX_FILTER_STEPS];
148
149 /*! \brief The current delta factor for updating the equalizer coefficients. */
150 int16_t eq_delta;
151 /*! \brief The adaptive equalizer coefficients. */
152 complexi16_t eq_coeff[V22BIS_EQUALIZER_LEN];
153 /*! \brief The equalizer signal buffer. */
154 complexi16_t eq_buf[V22BIS_EQUALIZER_LEN];
155
156 /*! \brief A measure of how much mismatch there is between the real constellation,
157 and the decoded symbol positions. */
158 int32_t training_error;
159 /*! \brief The proportional part of the carrier tracking filter. */
160 int32_t carrier_track_p;
161 /*! \brief The integral part of the carrier tracking filter. */
162 int32_t carrier_track_i;
163#else
164 /*! \brief The scaling factor assessed by the AGC algorithm. */
165 float agc_scaling;
166 /*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
167 float rrc_filter[V22BIS_RX_FILTER_STEPS];
168
169 /*! \brief The current delta factor for updating the equalizer coefficients. */
170 float eq_delta;
171 /*! \brief The adaptive equalizer coefficients. */
172 complexf_t eq_coeff[V22BIS_EQUALIZER_LEN];
173 /*! \brief The equalizer signal buffer. */
174 complexf_t eq_buf[V22BIS_EQUALIZER_LEN];
175
176 /*! \brief A measure of how much mismatch there is between the real constellation,
177 and the decoded symbol positions. */
178 float training_error;
179 /*! \brief The proportional part of the carrier tracking filter. */
180 float carrier_track_p;
181 /*! \brief The integral part of the carrier tracking filter. */
182 float carrier_track_i;
183#endif
184 /*! \brief Current offset into the equalizer buffer. */
185 int eq_step;
186 /*! \brief Current write offset into the equalizer buffer. */
187 int eq_put_step;
188
189 /*! \brief Integration variable for damping the Gardner algorithm tests. */
191 /*! \brief Current step size of Gardner algorithm integration. */
192 int gardner_step;
193 /*! \brief The total symbol timing correction since the carrier came up.
194 This is only for performance analysis purposes. */
196 /*! \brief The current fractional phase of the baud timing. */
197 int baud_phase;
198
199 int sixteen_way_decisions;
200
201 int pattern_repeats;
202 int last_raw_bits;
203 } rx;
204
205 /* Transmit section */
206 struct
207 {
208#if defined(SPANDSP_USE_FIXED_POINT)
209 /*! \brief The guard tone level. */
210 int16_t guard_tone_gain;
211 /*! \brief The gain factor needed to achieve the specified output power. */
212 int16_t gain;
213 /*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
214 int16_t rrc_filter_re[V22BIS_TX_FILTER_STEPS];
215 int16_t rrc_filter_im[V22BIS_TX_FILTER_STEPS];
216#else
217 /*! \brief The guard tone level. */
218 float guard_tone_gain;
219 /*! \brief The gain factor needed to achieve the specified output power. */
220 float gain;
221 /*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
222 float rrc_filter_re[V22BIS_TX_FILTER_STEPS];
223 float rrc_filter_im[V22BIS_TX_FILTER_STEPS];
224#endif
225
226 /*! \brief Current offset into the RRC pulse shaping filter buffer. */
227 int rrc_filter_step;
228
229 /*! \brief The register for the data scrambler. */
230 uint32_t scramble_reg;
231 /*! \brief A counter for the number of consecutive bits of repeating pattern through
232 the scrambler. */
234
235 /*! \brief 0 if transmitting user data. A training stage value during training */
236 int training;
237 /*! \brief A counter used to track progress through sending the training sequence. */
238 int training_count;
239 /*! \brief The current phase of the carrier (i.e. the DDS parameter). */
240 uint32_t carrier_phase;
241 /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */
242 int32_t carrier_phase_rate;
243 /*! \brief The current phase of the guard tone (i.e. the DDS parameter). */
244 uint32_t guard_tone_phase;
245 /*! \brief The update rate for the phase of the guard tone (i.e. the DDS increment). */
246 int32_t guard_tone_phase_rate;
247 /*! \brief The current fractional phase of the baud timing. */
248 int baud_phase;
249 /*! \brief The code number for the current position in the constellation. */
251 /*! \brief An indicator to mark that we are tidying up to stop transmission. */
252 int shutdown;
253 /*! \brief The get_bit function in use at any instant. */
255 } tx;
256
257 /*! \brief Error and flow logging control */
259};
260
261#if defined(__cplusplus)
262extern "C"
263{
264#endif
265
266/*! Reinitialise an existing V.22bis modem receive context.
267 \brief Reinitialise an existing V.22bis modem receive context.
268 \param s The modem context.
269 \return 0 for OK, -1 for bad parameter */
270int v22bis_rx_restart(v22bis_state_t *s);
271
272void v22bis_report_status_change(v22bis_state_t *s, int status);
273
274void v22bis_equalizer_coefficient_reset(v22bis_state_t *s);
275
276#if defined(__cplusplus)
277}
278#endif
279
280#endif
281/*- End of file ------------------------------------------------------------*/
void(*) span_put_bit_func_t(void *user_data, int bit)
Definition async.h:123
void(*) span_modem_status_func_t(void *user_data, int status)
Definition async.h:131
int(*) span_get_bit_func_t(void *user_data)
Definition async.h:127
struct logging_state_s logging_state_t
Definition logging.h:72
Definition complex.h:43
Definition complex.h:89
complexf_t eq_coeff[17]
The adaptive equalizer coefficients.
int eq_step
Current offset into the equalizer buffer.
float carrier_track_i
The integral part of the carrier tracking filter.
complexf_t eq_buf[17]
The equalizer signal buffer.
float training_error
A measure of how much mismatch there is between the real constellation, and the decoded symbol positi...
int eq_put_step
Current write offset into the equalizer buffer.
int signal_present
>0 if a signal above the minimum is present. It may or may not be a V.22bis signal.
float rrc_filter[27]
The root raised cosine (RRC) pulse shaping filter buffer.
int32_t carrier_phase_rate
The update rate for the phase of the carrier (i.e. the DDS increment).
int scrambler_pattern_count
A counter for the number of consecutive bits of repeating pattern through the scrambler.
int gardner_step
Current step size of Gardner algorithm integration.
int training_count
A count of how far through the current training step we are.
void * qam_user_data
A user specified opaque pointer passed to the qam_report callback routine.
float agc_scaling
The scaling factor assessed by the AGC algorithm.
int total_baud_timing_correction
The total symbol timing correction since the carrier came up. This is only for performance analysis p...
float carrier_track_p
The proportional part of the carrier tracking filter.
uint32_t scramble_reg
The register for the data scrambler.
int gardner_integrate
Integration variable for damping the Gardner algorithm tests.
int rrc_filter_step
Current offset into the RRC pulse shaping filter buffer.
float eq_delta
The current delta factor for updating the equalizer coefficients.
power_meter_t rx_power
A power meter, to measure the HPF'ed signal power in the channel.
int baud_phase
The current fractional phase of the baud timing.
int32_t carrier_off_power
The power meter level at which carrier off is declared.
int training
0 if receiving user data. A training stage value during training
int32_t carrier_on_power
The power meter level at which carrier on is declared.
qam_report_handler_t qam_report
A callback function which may be enabled to report every symbol's constellation position.
uint32_t carrier_phase
The current phase of the carrier (i.e. the DDS parameter).
uint32_t scramble_reg
The register for the data scrambler.
uint32_t guard_tone_phase
The current phase of the guard tone (i.e. the DDS parameter).
int constellation_state
The code number for the current position in the constellation.
int rrc_filter_step
Current offset into the RRC pulse shaping filter buffer.
int scrambler_pattern_count
A counter for the number of consecutive bits of repeating pattern through the scrambler.
int training
0 if transmitting user data. A training stage value during training
span_get_bit_func_t current_get_bit
The get_bit function in use at any instant.
float guard_tone_gain
The guard tone level.
int training_count
A counter used to track progress through sending the training sequence.
int32_t carrier_phase_rate
The update rate for the phase of the carrier (i.e. the DDS increment).
int baud_phase
The current fractional phase of the baud timing.
int shutdown
An indicator to mark that we are tidying up to stop transmission.
float gain
The gain factor needed to achieve the specified output power.
int32_t guard_tone_phase_rate
The update rate for the phase of the guard tone (i.e. the DDS increment).
float rrc_filter_re[9]
The root raised cosine (RRC) pulse shaping filter buffer.
uint32_t carrier_phase
The current phase of the carrier (i.e. the DDS parameter).
Definition private/v22bis.h:80
logging_state_t logging
Error and flow logging control.
Definition private/v22bis.h:258
int bit_rate
The maximum permitted bit rate of the modem. Valid values are 1200 and 2400.
Definition private/v22bis.h:82
void * status_user_data
A user specified opaque pointer passed to the status function.
Definition private/v22bis.h:98
bool calling_party
True if this is the calling side modem.
Definition private/v22bis.h:86
void * put_bit_user_data
A user specified opaque pointer passed to the put_bit callback routine.
Definition private/v22bis.h:94
span_get_bit_func_t get_bit
The callback function used to get the next bit to be transmitted.
Definition private/v22bis.h:88
span_modem_status_func_t status_handler
The callback function used to report modem status changes.
Definition private/v22bis.h:96
int options
Guard tone and sundry flags.
Definition private/v22bis.h:84
void * get_bit_user_data
A user specified opaque pointer passed to the get_bit callback routine.
Definition private/v22bis.h:90
span_put_bit_func_t put_bit
The callback function used to put each bit received.
Definition private/v22bis.h:92
struct v22bis_state_s v22bis_state_t
Definition v22bis.h:83