Addition of logging capability to the DTMF detector in spandsp, to aid debugging

poor detection.
Fixes to how timezones are handled for FAX page headers.
Various cleanups of the spandsp headers.
This commit is contained in:
Steve Underwood 2011-12-06 22:45:24 +08:00
parent 32f70174f5
commit 70c1c03c93
38 changed files with 455 additions and 298 deletions

View File

@ -47,8 +47,8 @@ AC_DEFUN([AX_C99_FUNC_LRINT],
[AC_CACHE_CHECK(for lrint, [AC_CACHE_CHECK(for lrint,
ac_cv_c99_lrint, ac_cv_c99_lrint,
[ [
lrint_save_CFLAGS=$CFLAGS lrint_save_LIBS=$LIBS
CFLAGS="-lm" LIBS="-lm"
AC_TRY_LINK([ AC_TRY_LINK([
#define _ISOC9X_SOURCE 1 #define _ISOC9X_SOURCE 1
#define _ISOC99_SOURCE 1 #define _ISOC99_SOURCE 1
@ -58,7 +58,7 @@ AC_TRY_LINK([
#include <math.h> #include <math.h>
], if (!lrint(3.14159)) lrint(2.7183);, ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no) ], if (!lrint(3.14159)) lrint(2.7183);, ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no)
CFLAGS=$lrint_save_CFLAGS LIBS=$lrint_save_LIBS
]) ])
@ -84,8 +84,8 @@ AC_DEFUN([AX_C99_FUNC_LRINTF],
[AC_CACHE_CHECK(for lrintf, [AC_CACHE_CHECK(for lrintf,
ac_cv_c99_lrintf, ac_cv_c99_lrintf,
[ [
lrintf_save_CFLAGS=$CFLAGS lrintf_save_LIBS=$LIBS
CFLAGS="-lm" LIBS="-lm"
AC_TRY_LINK([ AC_TRY_LINK([
#define _ISOC9X_SOURCE 1 #define _ISOC9X_SOURCE 1
#define _ISOC99_SOURCE 1 #define _ISOC99_SOURCE 1
@ -95,7 +95,7 @@ AC_TRY_LINK([
#include <math.h> #include <math.h>
], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no) ], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no)
CFLAGS=$lrintf_save_CFLAGS LIBS=$lrintf_save_LIBS
]) ])
@ -121,8 +121,8 @@ AC_DEFUN([AX_C99_FUNC_LLRINT],
[AC_CACHE_CHECK(for llrint, [AC_CACHE_CHECK(for llrint,
ac_cv_c99_llrint, ac_cv_c99_llrint,
[ [
llrint_save_CFLAGS=$CFLAGS llrint_save_LIBS=$LIBS
CFLAGS="-lm" LIBS="-lm"
AC_TRY_LINK([ AC_TRY_LINK([
#define ISOC9X_SOURCE 1 #define ISOC9X_SOURCE 1
#define _ISOC99_SOURCE 1 #define _ISOC99_SOURCE 1
@ -132,7 +132,7 @@ AC_TRY_LINK([
#include <math.h> #include <math.h>
], long long int x ; x = llrint(3.14159) ;, ac_cv_c99_llrint=yes, ac_cv_c99_llrint=no) ], long long int x ; x = llrint(3.14159) ;, ac_cv_c99_llrint=yes, ac_cv_c99_llrint=no)
CFLAGS=$llrint_save_CFLAGS LIBS=$llrint_save_LIBS
]) ])
@ -159,8 +159,8 @@ AC_DEFUN([AX_C99_FUNC_LLRINTF],
[AC_CACHE_CHECK(for llrintf, [AC_CACHE_CHECK(for llrintf,
ac_cv_c99_llrintf, ac_cv_c99_llrintf,
[ [
llrintf_save_CFLAGS=$CFLAGS llrintf_save_LIBS=$LIBS
CFLAGS="-lm" LIBS="-lm"
AC_TRY_LINK([ AC_TRY_LINK([
#define _ISOC9X_SOURCE 1 #define _ISOC9X_SOURCE 1
#define _ISOC99_SOURCE 1 #define _ISOC99_SOURCE 1
@ -170,7 +170,7 @@ AC_TRY_LINK([
#include <math.h> #include <math.h>
], long long int x ; x = llrintf(3.14159) ;, ac_cv_c99_llrintf=yes, ac_cv_c99_llrintf=no) ], long long int x ; x = llrintf(3.14159) ;, ac_cv_c99_llrintf=yes, ac_cv_c99_llrintf=no)
CFLAGS=$llrintf_save_CFLAGS LIBS=$llrintf_save_LIBS
]) ])

View File

@ -28,8 +28,8 @@ gnu)
)], )],
[AC_MSG_RESULT([yes]) [AC_MSG_RESULT([yes])
COMP_VENDOR_CFLAGS="-fvisibility=hidden -DSWITCH_API_VISIBILITY=1 -DHAVE_VISIBILITY=1 $COMP_VENDOR_CFLAGS" COMP_VENDOR_CFLAGS="-fvisibility=hidden -DHAVE_VISIBILITY=1 $COMP_VENDOR_CFLAGS"
COMP_VENDOR_CXXFLAGS="-fvisibility=hidden -DSWITCH_API_VISIBILITY=1 -DHAVE_VISIBILITY=1 $COMP_VENDOR_CXXFLAGS" COMP_VENDOR_CXXFLAGS="-fvisibility=hidden -DHAVE_VISIBILITY=1 $COMP_VENDOR_CXXFLAGS"
ac_cv_symbol_export_capability="yes"], ac_cv_symbol_export_capability="yes"],
[AC_MSG_RESULT([no])] [AC_MSG_RESULT([no])]
@ -47,8 +47,8 @@ sun)
)], )],
[AC_MSG_RESULT([yes]) [AC_MSG_RESULT([yes])
COMP_VENDOR_CFLAGS="-xldscope=hidden -DSWITCH_API_VISIBILITY=1 -DHAVE_VISIBILITY=1 $COMP_VENDOR_CFLAGS" COMP_VENDOR_CFLAGS="-xldscope=hidden -DHAVE_VISIBILITY=1 $COMP_VENDOR_CFLAGS"
COMP_VENDOR_CXXFLAGS="-xldscope=hidden -DSWITCH_API_VISIBILITY=1 -DHAVE_VISIBILITY=1 $COMP_VENDOR_CXXFLAGS" COMP_VENDOR_CXXFLAGS="-xldscope=hidden -DHAVE_VISIBILITY=1 $COMP_VENDOR_CXXFLAGS"
ac_cv_symbol_export_capability="yes"], ac_cv_symbol_export_capability="yes"],
[AC_MSG_RESULT([no])] [AC_MSG_RESULT([no])]

View File

@ -319,16 +319,16 @@ nobase_include_HEADERS = spandsp/adsi.h \
nodist_include_HEADERS = spandsp.h nodist_include_HEADERS = spandsp.h
noinst_HEADERS = faxfont.h \ noinst_HEADERS = faxfont.h \
filter_tools.h \ filter_tools.h \
gsm0610_local.h \ gsm0610_local.h \
lpc10_encdecs.h \ lpc10_encdecs.h \
mmx_sse_decs.h \ mmx_sse_decs.h \
t30_local.h \ t30_local.h \
t4_t6_decode_states.h \ t4_t6_decode_states.h \
v17_v32bis_rx_constellation_maps.h \ v17_v32bis_rx_constellation_maps.h \
v17_v32bis_tx_constellation_maps.h \ v17_v32bis_tx_constellation_maps.h \
v29tx_constellation_maps.h v29tx_constellation_maps.h
make_at_dictionary$(EXEEXT): $(top_srcdir)/src/make_at_dictionary.c make_at_dictionary$(EXEEXT): $(top_srcdir)/src/make_at_dictionary.c
$(CC_FOR_BUILD) -o make_at_dictionary$(EXEEXT) $(top_srcdir)/src/make_at_dictionary.c -DHAVE_CONFIG_H -I$(top_builddir)/src $(CC_FOR_BUILD) -o make_at_dictionary$(EXEEXT) $(top_srcdir)/src/make_at_dictionary.c -DHAVE_CONFIG_H -I$(top_builddir)/src

View File

@ -43,6 +43,7 @@
#include "floating_fudge.h" #include "floating_fudge.h"
#include "spandsp/telephony.h" #include "spandsp/telephony.h"
#include "spandsp/logging.h"
#include "spandsp/fast_convert.h" #include "spandsp/fast_convert.h"
#include "spandsp/queue.h" #include "spandsp/queue.h"
#include "spandsp/dc_restore.h" #include "spandsp/dc_restore.h"
@ -54,6 +55,7 @@
#include "spandsp/dtmf.h" #include "spandsp/dtmf.h"
#include "spandsp/bell_r2_mf.h" #include "spandsp/bell_r2_mf.h"
#include "spandsp/private/logging.h"
#include "spandsp/private/queue.h" #include "spandsp/private/queue.h"
#include "spandsp/private/tone_generate.h" #include "spandsp/private/tone_generate.h"
#include "spandsp/private/bell_r2_mf.h" #include "spandsp/private/bell_r2_mf.h"
@ -786,7 +788,7 @@ SPAN_DECLARE(int) r2_mf_rx(r2_mf_rx_state_t *s, const int16_t amp[], int samples
} }
if (s->current_digit != hit_digit && s->callback) if (s->current_digit != hit_digit && s->callback)
{ {
i = (hit_digit) ? -99 : -10; i = (hit_digit) ? -10 : -99;
s->callback(s->callback_data, hit_digit, i, 0); s->callback(s->callback_data, hit_digit, i, 0);
} }
s->current_digit = hit_digit; s->current_digit = hit_digit;

View File

@ -42,10 +42,6 @@
#include "spandsp/complex.h" #include "spandsp/complex.h"
#include "spandsp/dds.h" #include "spandsp/dds.h"
#if !defined(M_PI)
# define M_PI 3.14159265358979323846 /* pi */
#endif
/* In a A-law or u-law channel, a 128 step sine table is adequate to keep the spectral /* In a A-law or u-law channel, a 128 step sine table is adequate to keep the spectral
mess due to the DDS at a similar level to the spectral mess due to the A-law or u-law mess due to the DDS at a similar level to the spectral mess due to the A-law or u-law
compression. */ compression. */

View File

@ -29,8 +29,8 @@
#include "config.h" #include "config.h"
#endif #endif
#include <inttypes.h>
#include <stdlib.h> #include <stdlib.h>
#include <inttypes.h>
#if defined(HAVE_TGMATH_H) #if defined(HAVE_TGMATH_H)
#include <tgmath.h> #include <tgmath.h>
#endif #endif
@ -38,12 +38,12 @@
#include <math.h> #include <math.h>
#endif #endif
#include "floating_fudge.h" #include "floating_fudge.h"
#include <memory.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <limits.h>
#include <time.h>
#include <fcntl.h>
#include "spandsp/telephony.h" #include "spandsp/telephony.h"
#include "spandsp/logging.h"
#include "spandsp/fast_convert.h" #include "spandsp/fast_convert.h"
#include "spandsp/queue.h" #include "spandsp/queue.h"
#include "spandsp/complex.h" #include "spandsp/complex.h"
@ -53,6 +53,7 @@
#include "spandsp/super_tone_rx.h" #include "spandsp/super_tone_rx.h"
#include "spandsp/dtmf.h" #include "spandsp/dtmf.h"
#include "spandsp/private/logging.h"
#include "spandsp/private/queue.h" #include "spandsp/private/queue.h"
#include "spandsp/private/tone_generate.h" #include "spandsp/private/tone_generate.h"
#include "spandsp/private/dtmf.h" #include "spandsp/private/dtmf.h"
@ -165,6 +166,8 @@ SPAN_DECLARE(int) dtmf_rx(dtmf_rx_state_t *s, const int16_t amp[], int samples)
goertzel_samplex(&s->row_out[3], xamp); goertzel_samplex(&s->row_out[3], xamp);
goertzel_samplex(&s->col_out[3], xamp); goertzel_samplex(&s->col_out[3], xamp);
} }
if (s->duration < INT_MAX - (limit - sample))
s->duration += (limit - sample);
s->current_sample += (limit - sample); s->current_sample += (limit - sample);
if (s->current_sample < DTMF_SAMPLES_PER_BLOCK) if (s->current_sample < DTMF_SAMPLES_PER_BLOCK)
continue; continue;
@ -188,29 +191,45 @@ SPAN_DECLARE(int) dtmf_rx(dtmf_rx_state_t *s, const int16_t amp[], int samples)
/* Basic signal level test and the twist test */ /* Basic signal level test and the twist test */
if (row_energy[best_row] >= s->threshold if (row_energy[best_row] >= s->threshold
&& &&
col_energy[best_col] >= s->threshold col_energy[best_col] >= s->threshold)
&&
col_energy[best_col] < row_energy[best_row]*s->reverse_twist
&&
col_energy[best_col]*s->normal_twist > row_energy[best_row])
{ {
/* Relative peak test ... */ if (col_energy[best_col] < row_energy[best_row]*s->reverse_twist
for (i = 0; i < 4; i++) &&
col_energy[best_col]*s->normal_twist > row_energy[best_row])
{ {
if ((i != best_col && col_energy[i]*DTMF_RELATIVE_PEAK_COL > col_energy[best_col]) /* Relative peak test ... */
|| for (i = 0; i < 4; i++)
(i != best_row && row_energy[i]*DTMF_RELATIVE_PEAK_ROW > row_energy[best_row]))
{ {
break; if ((i != best_col && col_energy[i]*DTMF_RELATIVE_PEAK_COL > col_energy[best_col])
||
(i != best_row && row_energy[i]*DTMF_RELATIVE_PEAK_ROW > row_energy[best_row]))
{
break;
}
}
/* ... and fraction of total energy test */
if (i >= 4
&&
(row_energy[best_row] + col_energy[best_col]) > DTMF_TO_TOTAL_ENERGY*s->energy)
{
/* Got a hit */
hit = dtmf_positions[(best_row << 2) + best_col];
} }
} }
/* ... and fraction of total energy test */ if (span_log_test(&s->logging, SPAN_LOG_FLOW))
if (i >= 4
&&
(row_energy[best_row] + col_energy[best_col]) > DTMF_TO_TOTAL_ENERGY*s->energy)
{ {
/* Got a hit */ /* Log information about the quality of the signal, to aid analysis of detection problems */
hit = dtmf_positions[(best_row << 2) + best_col]; /* Logging at this point filters the total no-hoper frames out of the log, and leaves
anything which might feasibly be a DTMF digit. The log will then contain a list of the
total, row and coloumn power levels for detailed analysis of detection problems. */
span_log(&s->logging,
SPAN_LOG_FLOW,
"Potentially '%c' - total %.2fdB, row %.2fdB, col %.2fdB - %s\n",
dtmf_positions[(best_row << 2) + best_col],
log10f(s->energy)*10.0f - DTMF_POWER_OFFSET + DBM0_MAX_POWER,
log10f(row_energy[best_row]/DTMF_TO_TOTAL_ENERGY)*10.0f - DTMF_POWER_OFFSET + DBM0_MAX_POWER,
log10f(col_energy[best_col]/DTMF_TO_TOTAL_ENERGY)*10.0f - DTMF_POWER_OFFSET + DBM0_MAX_POWER,
(hit) ? "hit" : "miss");
} }
} }
/* The logic in the next test should ensure the following for different successive hit patterns: /* The logic in the next test should ensure the following for different successive hit patterns:
@ -251,7 +270,8 @@ SPAN_DECLARE(int) dtmf_rx(dtmf_rx_state_t *s, const int16_t amp[], int samples)
if (s->in_digit || hit) if (s->in_digit || hit)
{ {
i = (s->in_digit && !hit) ? -99 : lfastrintf(log10f(s->energy)*10.0f - DTMF_POWER_OFFSET + DBM0_MAX_POWER); i = (s->in_digit && !hit) ? -99 : lfastrintf(log10f(s->energy)*10.0f - DTMF_POWER_OFFSET + DBM0_MAX_POWER);
s->realtime_callback(s->realtime_callback_data, hit, i, 0); s->realtime_callback(s->realtime_callback_data, hit, i, s->duration);
s->duration = 0;
} }
} }
else else
@ -357,6 +377,12 @@ SPAN_DECLARE(void) dtmf_rx_parms(dtmf_rx_state_t *s,
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
SPAN_DECLARE(logging_state_t *) dtmf_rx_get_logging_state(dtmf_rx_state_t *s)
{
return &s->logging;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(dtmf_rx_state_t *) dtmf_rx_init(dtmf_rx_state_t *s, SPAN_DECLARE(dtmf_rx_state_t *) dtmf_rx_init(dtmf_rx_state_t *s,
digits_rx_callback_t callback, digits_rx_callback_t callback,
void *user_data) void *user_data)
@ -369,6 +395,8 @@ SPAN_DECLARE(dtmf_rx_state_t *) dtmf_rx_init(dtmf_rx_state_t *s,
if ((s = (dtmf_rx_state_t *) malloc(sizeof (*s))) == NULL) if ((s = (dtmf_rx_state_t *) malloc(sizeof (*s))) == NULL)
return NULL; return NULL;
} }
span_log_init(&s->logging, SPAN_LOG_NONE, NULL);
span_log_set_protocol(&s->logging, "DTMF");
s->digits_callback = callback; s->digits_callback = callback;
s->digits_callback_data = user_data; s->digits_callback_data = user_data;
s->realtime_callback = NULL; s->realtime_callback = NULL;

View File

@ -71,12 +71,21 @@
#include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_rx.h"
#include "spandsp/v17tx.h" #include "spandsp/v17tx.h"
#include "spandsp/v17rx.h" #include "spandsp/v17rx.h"
#include "spandsp/timezone.h"
#include "spandsp/t4_rx.h" #include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h" #include "spandsp/t4_tx.h"
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t81_t82_arith_coding.h" #include "spandsp/t81_t82_arith_coding.h"
#endif
#if defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t85.h" #include "spandsp/t85.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T42)
#include "spandsp/t42.h"
#endif
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h" #include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h" #include "spandsp/t4_t6_encode.h"
@ -102,10 +111,19 @@
#include "spandsp/private/v29rx.h" #include "spandsp/private/v29rx.h"
#include "spandsp/private/hdlc.h" #include "spandsp/private/hdlc.h"
#include "spandsp/private/fax_modems.h" #include "spandsp/private/fax_modems.h"
#if defined(SPANDSP_SUPPORT_T85) #include "spandsp/private/timezone.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t81_t82_arith_coding.h" #include "spandsp/private/t81_t82_arith_coding.h"
#endif
#if defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t85.h" #include "spandsp/private/t85.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T42)
#include "spandsp/private/t42.h"
#endif
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h" #include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h" #include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/t4_rx.h" #include "spandsp/private/t4_rx.h"

View File

@ -54,21 +54,38 @@
#include "spandsp/fast_convert.h" #include "spandsp/fast_convert.h"
#include "spandsp/logging.h" #include "spandsp/logging.h"
#include "spandsp/saturated.h" #include "spandsp/saturated.h"
#include "spandsp/timezone.h"
#include "spandsp/t4_rx.h" #include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h" #include "spandsp/t4_tx.h"
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t81_t82_arith_coding.h" #include "spandsp/t81_t82_arith_coding.h"
#endif
#if defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t85.h" #include "spandsp/t85.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T42)
#include "spandsp/t42.h"
#endif
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/t43.h"
#endif
#include "spandsp/t4_t6_decode.h" #include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h" #include "spandsp/t4_t6_encode.h"
#include "spandsp/image_translate.h" #include "spandsp/image_translate.h"
#include "spandsp/private/logging.h" #include "spandsp/private/logging.h"
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t81_t82_arith_coding.h" #include "spandsp/private/t81_t82_arith_coding.h"
#endif
#if defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t85.h" #include "spandsp/private/t85.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T42)
#include "spandsp/private/t42.h"
#endif
#if defined(SPANDSP_SUPPORT_T43)
#include "spandsp/private/t43.h"
#endif
#include "spandsp/private/t4_t6_decode.h" #include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h" #include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/t4_rx.h" #include "spandsp/private/t4_rx.h"

View File

@ -165,8 +165,10 @@ SPAN_DECLARE(int) plc_fillin(plc_state_t *s, int16_t amp[], int len)
float old_weight; float old_weight;
float new_weight; float new_weight;
float gain; float gain;
int16_t *orig_amp;
int orig_len; int orig_len;
orig_amp = amp;
orig_len = len; orig_len = len;
if (s->missing_samples == 0) if (s->missing_samples == 0)
{ {

View File

@ -52,6 +52,7 @@
#include <spandsp/schedule.h> #include <spandsp/schedule.h>
#include <spandsp/g711.h> #include <spandsp/g711.h>
#include <spandsp/timing.h> #include <spandsp/timing.h>
#include <spandsp/math_fixed.h>
#include <spandsp/vector_float.h> #include <spandsp/vector_float.h>
#include <spandsp/complex_vector_float.h> #include <spandsp/complex_vector_float.h>
#include <spandsp/vector_int.h> #include <spandsp/vector_int.h>
@ -97,6 +98,7 @@
#include <spandsp/v27ter_tx.h> #include <spandsp/v27ter_tx.h>
/*#include <spandsp/v34.h>*/ /*#include <spandsp/v34.h>*/
#include <spandsp/v18.h> #include <spandsp/v18.h>
#include <spandsp/timezone.h>
#include <spandsp/t4_rx.h> #include <spandsp/t4_rx.h>
#include <spandsp/t4_tx.h> #include <spandsp/t4_tx.h>
#include <spandsp/image_translate.h> #include <spandsp/image_translate.h>
@ -126,7 +128,6 @@
#include <spandsp/gsm0610.h> #include <spandsp/gsm0610.h>
#include <spandsp/plc.h> #include <spandsp/plc.h>
#include <spandsp/playout.h> #include <spandsp/playout.h>
#include <spandsp/timezone.h>
#endif #endif

View File

@ -186,6 +186,11 @@ SPAN_DECLARE(int) dtmf_rx_status(dtmf_rx_state_t *s);
\return The number of digits actually returned. */ \return The number of digits actually returned. */
SPAN_DECLARE(size_t) dtmf_rx_get(dtmf_rx_state_t *s, char *digits, int max); SPAN_DECLARE(size_t) dtmf_rx_get(dtmf_rx_state_t *s, char *digits, int max);
/*! \brief Get the logging context associated with a DTMF receiver context.
\param s The DTMF receiver context.
\return A pointer to the logging context */
SPAN_DECLARE(logging_state_t *) dtmf_rx_get_logging_state(dtmf_rx_state_t *s);
/*! \brief Initialise a DTMF receiver context. /*! \brief Initialise a DTMF receiver context.
\param s The DTMF receiver context. \param s The DTMF receiver context.
\param callback An optional callback routine, used to report received digits. If \param callback An optional callback routine, used to report received digits. If

View File

@ -72,6 +72,7 @@
/*#include <spandsp/private/v34.h>*/ /*#include <spandsp/private/v34.h>*/
#include <spandsp/private/at_interpreter.h> #include <spandsp/private/at_interpreter.h>
#include <spandsp/private/fax_modems.h> #include <spandsp/private/fax_modems.h>
#include <spandsp/private/timezone.h>
#include <spandsp/private/image_translate.h> #include <spandsp/private/image_translate.h>
#include <spandsp/private/t4_t6_decode.h> #include <spandsp/private/t4_t6_decode.h>
#include <spandsp/private/t4_t6_encode.h> #include <spandsp/private/t4_t6_encode.h>
@ -88,7 +89,6 @@
#include <spandsp/private/t38_gateway.h> #include <spandsp/private/t38_gateway.h>
#include <spandsp/private/t38_terminal.h> #include <spandsp/private/t38_terminal.h>
#include <spandsp/private/t31.h> #include <spandsp/private/t31.h>
#include <spandsp/private/timezone.h>
#include <spandsp/private/v18.h> #include <spandsp/private/v18.h>
#include <spandsp/private/v42.h> #include <spandsp/private/v42.h>
#include <spandsp/private/v42bis.h> #include <spandsp/private/v42bis.h>

View File

@ -96,6 +96,9 @@ struct dtmf_rx_state_s
uint8_t in_digit; uint8_t in_digit;
/*! The current sample number within a processing block. */ /*! The current sample number within a processing block. */
int current_sample; int current_sample;
/*! Tone state duration */
int duration;
/*! The number of digits which have been lost due to buffer overflows. */ /*! The number of digits which have been lost due to buffer overflows. */
int lost_digits; int lost_digits;
@ -103,6 +106,9 @@ struct dtmf_rx_state_s
int current_digits; int current_digits;
/*! The received digits buffer. This is a NULL terminated string. */ /*! The received digits buffer. This is a NULL terminated string. */
char digits[MAX_DTMF_DIGITS + 1]; char digits[MAX_DTMF_DIGITS + 1];
/*! \brief Error and flow logging control */
logging_state_t logging;
}; };
#endif #endif

View File

@ -40,7 +40,7 @@ struct fax_state_s
/*! \brief The analogue modem front-end */ /*! \brief The analogue modem front-end */
fax_modems_state_t modems; fax_modems_state_t modems;
/*! \brief V.8 */ /*! \brief V.8 */
//v8_state_t v8; v8_state_t v8;
/*! \brief Error and flow logging control */ /*! \brief Error and flow logging control */
logging_state_t logging; logging_state_t logging;

View File

@ -73,6 +73,11 @@ struct t30_state_s
page image. FALSE for FAX page headers to add to the overall length of page image. FALSE for FAX page headers to add to the overall length of
the page. */ the page. */
int header_overlays_image; int header_overlays_image;
/*! \brief Use private timezone if TRUE */
int use_own_tz;
/*! \brief Optional per instance time zone for the FAX page header timestamp. */
tz_t tz;
/*! \brief TRUE if remote T.30 procedural interrupts are allowed. */ /*! \brief TRUE if remote T.30 procedural interrupts are allowed. */
int remote_interrupts_allowed; int remote_interrupts_allowed;

View File

@ -33,7 +33,7 @@
typedef struct typedef struct
{ {
fax_modems_state_t modems; fax_modems_state_t modems;
//v8_state_t v8; v8_state_t v8;
/*! The transmit signal handler to be used when the current one has finished sending. */ /*! The transmit signal handler to be used when the current one has finished sending. */
span_tx_handler_t *next_tx_handler; span_tx_handler_t *next_tx_handler;

View File

@ -96,7 +96,7 @@ typedef struct
/*! \brief The value for samples at the next transmission point. */ /*! \brief The value for samples at the next transmission point. */
int32_t next_tx_samples; int32_t next_tx_samples;
/*! \brief The current transmit timeout. */ /*! \brief The current transmit timeout. */
//int32_t timeout_tx_samples; int32_t timeout_tx_samples;
/*! \brief The current receive timeout. */ /*! \brief The current receive timeout. */
int32_t timeout_rx_samples; int32_t timeout_rx_samples;
} t38_terminal_front_end_state_t; } t38_terminal_front_end_state_t;

View File

@ -49,8 +49,8 @@ struct t4_state_s
/*! \brief The text which will be used in FAX page header. No text results /*! \brief The text which will be used in FAX page header. No text results
in no header line. */ in no header line. */
const char *header_info; const char *header_info;
/*! \brief Optional per instance time zone for the FAX pager header timestamp. */ /*! \brief Optional per instance time zone for the FAX page header timestamp. */
struct tz_s *tz; tz_t *tz;
/*! \brief The size of the compressed image on the line side, in bits. */ /*! \brief The size of the compressed image on the line side, in bits. */
int line_image_size; int line_image_size;

View File

@ -72,77 +72,6 @@ struct v17_rx_state_s
routine. */ routine. */
void *qam_user_data; void *qam_user_data;
/*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */
#if defined(SPANDSP_USE_FIXED_POINT)
int16_t rrc_filter[V17_RX_FILTER_STEPS];
#else
float rrc_filter[V17_RX_FILTER_STEPS];
#endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */
int rrc_filter_step;
/*! \brief The state of the differential decoder */
int diff;
/*! \brief The register for the data scrambler. */
uint32_t scramble_reg;
/*! \brief Scrambler tap */
int scrambler_tap;
/*! \brief TRUE if the short training sequence is to be used. */
int short_train;
/*! \brief The section of the training data we are currently in. */
int training_stage;
/*! \brief A count of how far through the current training step we are. */
int training_count;
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The value of the last signal sample, using the a simple HPF for signal power estimation. */
int16_t last_sample;
/*! \brief >0 if a signal above the minimum is present. It may or may not be a V.17 signal. */
int signal_present;
/*! \brief Whether or not a carrier drop was detected and the signal delivery is pending. */
int carrier_drop_pending;
/*! \brief A count of the current consecutive samples below the carrier off threshold. */
int low_samples;
/*! \brief A highest magnitude sample seen. */
int16_t high_sample;
/*! \brief The current phase of the carrier (i.e. the DDS parameter). */
uint32_t carrier_phase;
/*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */
int32_t carrier_phase_rate;
/*! \brief The carrier update rate saved for reuse when using short training. */
int32_t carrier_phase_rate_save;
#if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
#else
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
#endif
/*! \brief A power meter, to measure the HPF'ed signal power in the channel. */
power_meter_t power;
/*! \brief The power meter level at which carrier on is declared. */
int32_t carrier_on_power;
/*! \brief The power meter level at which carrier off is declared. */
int32_t carrier_off_power;
/*! \brief Current read offset into the equalizer buffer. */
int eq_step;
/*! \brief Current write offset into the equalizer buffer. */
int eq_put_step;
/*! \brief Symbol count to the next equalizer update. */
int eq_skip;
/*! \brief The current half of the baud. */
int baud_half;
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief The scaling factor accessed by the AGC algorithm. */ /*! \brief The scaling factor accessed by the AGC algorithm. */
float agc_scaling; float agc_scaling;
@ -166,6 +95,20 @@ struct v17_rx_state_s
int32_t symbol_sync_dc_filter[2]; int32_t symbol_sync_dc_filter[2];
/*! Baud phase for symbol sync. */ /*! Baud phase for symbol sync. */
int32_t baud_phase; int32_t baud_phase;
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
int16_t rrc_filter[V17_RX_FILTER_STEPS];
/*! \brief A pointer to the current constellation. */
const complexi16_t *constellation;
#else #else
/*! \brief The scaling factor accessed by the AGC algorithm. */ /*! \brief The scaling factor accessed by the AGC algorithm. */
float agc_scaling; float agc_scaling;
@ -189,7 +132,71 @@ struct v17_rx_state_s
float symbol_sync_dc_filter[2]; float symbol_sync_dc_filter[2];
/*! Baud phase for symbol sync. */ /*! Baud phase for symbol sync. */
float baud_phase; float baud_phase;
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
float rrc_filter[V17_RX_FILTER_STEPS];
/*! \brief A pointer to the current constellation. */
const complexf_t *constellation;
#endif #endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */
int rrc_filter_step;
/*! \brief The state of the differential decoder */
int diff;
/*! \brief The register for the data scrambler. */
uint32_t scramble_reg;
/*! \brief Scrambler tap */
int scrambler_tap;
/*! \brief TRUE if the short training sequence is to be used. */
int short_train;
/*! \brief The section of the training data we are currently in. */
int training_stage;
/*! \brief A count of how far through the current training step we are. */
int training_count;
/*! \brief The value of the last signal sample, using the a simple HPF for signal power estimation. */
int16_t last_sample;
/*! \brief >0 if a signal above the minimum is present. It may or may not be a V.17 signal. */
int signal_present;
/*! \brief Whether or not a carrier drop was detected and the signal delivery is pending. */
int carrier_drop_pending;
/*! \brief A count of the current consecutive samples below the carrier off threshold. */
int low_samples;
/*! \brief A highest magnitude sample seen. */
int16_t high_sample;
/*! \brief The current phase of the carrier (i.e. the DDS parameter). */
uint32_t carrier_phase;
/*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */
int32_t carrier_phase_rate;
/*! \brief The carrier update rate saved for reuse when using short training. */
int32_t carrier_phase_rate_save;
/*! \brief A power meter, to measure the HPF'ed signal power in the channel. */
power_meter_t power;
/*! \brief The power meter level at which carrier on is declared. */
int32_t carrier_on_power;
/*! \brief The power meter level at which carrier off is declared. */
int32_t carrier_off_power;
/*! \brief Current read offset into the equalizer buffer. */
int eq_step;
/*! \brief Current write offset into the equalizer buffer. */
int eq_put_step;
/*! \brief Symbol count to the next equalizer update. */
int eq_skip;
/*! \brief The current half of the baud. */
int baud_half;
/*! \brief The total symbol timing correction since the carrier came up. /*! \brief The total symbol timing correction since the carrier came up.
This is only for performance analysis purposes. */ This is only for performance analysis purposes. */
@ -199,12 +206,7 @@ struct v17_rx_state_s
int32_t start_angles[2]; int32_t start_angles[2];
/*! \brief History list of phase angles for the coarse carrier aquisition step. */ /*! \brief History list of phase angles for the coarse carrier aquisition step. */
int32_t angles[16]; int32_t angles[16];
/*! \brief A pointer to the current constellation. */
#if defined(SPANDSP_USE_FIXED_POINTx)
const complexi16_t *constellation;
#else
const complexf_t *constellation;
#endif
/*! \brief A pointer to the current space map. There is a space map for /*! \brief A pointer to the current space map. There is a space map for
each trellis state. */ each trellis state. */
int space_map; int space_map;
@ -217,13 +219,16 @@ struct v17_rx_state_s
int full_path_to_past_state_locations[V17_TRELLIS_STORAGE_DEPTH][8]; int full_path_to_past_state_locations[V17_TRELLIS_STORAGE_DEPTH][8];
/*! \brief The trellis. */ /*! \brief The trellis. */
int past_state_locations[V17_TRELLIS_STORAGE_DEPTH][8]; int past_state_locations[V17_TRELLIS_STORAGE_DEPTH][8];
#if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief Euclidean distances (actually the squares of the distances) /*! \brief Euclidean distances (actually the squares of the distances)
from the last states of the trellis. */ from the last states of the trellis. */
#if defined(SPANDSP_USE_FIXED_POINTx)
uint32_t distances[8]; uint32_t distances[8];
#else #else
/*! \brief Euclidean distances (actually the squares of the distances)
from the last states of the trellis. */
float distances[8]; float distances[8];
#endif #endif
/*! \brief Error and flow logging control */ /*! \brief Error and flow logging control */
logging_state_t logging; logging_state_t logging;
}; };

View File

@ -49,23 +49,24 @@ struct v17_tx_state_s
/*! \brief A user specified opaque pointer passed to the status function. */ /*! \brief A user specified opaque pointer passed to the status function. */
void *status_user_data; void *status_user_data;
#if defined(SPANDSP_USE_FIXED_POINT)
/*! \brief The gain factor needed to achieve the specified output power. */ /*! \brief The gain factor needed to achieve the specified output power. */
#if defined(SPANDSP_USE_FIXED_POINT) int16_t gain;
int32_t gain; /*! \brief A pointer to the constellation currently in use. */
#else const complexi16_t *constellation;
float gain;
#endif
/*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */
#if defined(SPANDSP_USE_FIXED_POINT)
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */ /*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
int16_t rrc_filter_re[V17_TX_FILTER_STEPS]; int16_t rrc_filter_re[V17_TX_FILTER_STEPS];
int16_t rrc_filter_im[V17_TX_FILTER_STEPS]; int16_t rrc_filter_im[V17_TX_FILTER_STEPS];
#else #else
/*! \brief The gain factor needed to achieve the specified output power. */
float gain;
/*! \brief A pointer to the constellation currently in use. */
const complexf_t *constellation;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */ /*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
float rrc_filter_re[V17_TX_FILTER_STEPS]; float rrc_filter_re[V17_TX_FILTER_STEPS];
float rrc_filter_im[V17_TX_FILTER_STEPS]; float rrc_filter_im[V17_TX_FILTER_STEPS];
#endif #endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */ /*! \brief Current offset into the RRC pulse shaping filter buffer. */
int rrc_filter_step; int rrc_filter_step;
@ -94,12 +95,6 @@ struct v17_tx_state_s
/*! \brief The current fractional phase of the baud timing. */ /*! \brief The current fractional phase of the baud timing. */
int baud_phase; int baud_phase;
/*! \brief A pointer to the constellation currently in use. */
#if defined(SPANDSP_USE_FIXED_POINT)
const complexi16_t *constellation;
#else
const complexf_t *constellation;
#endif
/*! \brief The current number of data bits per symbol. This does not include /*! \brief The current number of data bits per symbol. This does not include
the redundant bit. */ the redundant bit. */
int bits_per_symbol; int bits_per_symbol;

View File

@ -27,15 +27,15 @@
#define _SPANDSP_PRIVATE_V22BIS_H_ #define _SPANDSP_PRIVATE_V22BIS_H_
/*! The number of steps to the left and to the right of the target position in the equalizer buffer. */ /*! The number of steps to the left and to the right of the target position in the equalizer buffer. */
#define V22BIS_EQUALIZER_LEN 7 #define V22BIS_EQUALIZER_LEN 7
/*! One less than a power of 2 >= (2*V22BIS_EQUALIZER_LEN + 1) */ /*! One less than a power of 2 >= (2*V22BIS_EQUALIZER_LEN + 1) */
#define V22BIS_EQUALIZER_MASK 15 #define V22BIS_EQUALIZER_MASK 15
/*! The number of taps in the transmit pulse shaping filter */ /*! The number of taps in the transmit pulse shaping filter */
#define V22BIS_TX_FILTER_STEPS 9 #define V22BIS_TX_FILTER_STEPS 9
/*! The number of taps in the receive pulse shaping/bandpass filter */ /*! The number of taps in the receive pulse shaping/bandpass filter */
#define V22BIS_RX_FILTER_STEPS 27 #define V22BIS_RX_FILTER_STEPS 27
/*! Segments of the training sequence on the receive side */ /*! Segments of the training sequence on the receive side */
enum enum
@ -65,6 +65,12 @@ enum
V22BIS_TX_TRAINING_STAGE_PARKED V22BIS_TX_TRAINING_STAGE_PARKED
}; };
#if defined(SPANDSP_USE_FIXED_POINT)
extern const complexi16_t v22bis_constellation[16];
#else
extern const complexf_t v22bis_constellation[16];
#endif
/*! /*!
V.22bis modem descriptor. This defines the working state for a single instance V.22bis modem descriptor. This defines the working state for a single instance
of a V.22bis modem. of a V.22bis modem.
@ -93,10 +99,15 @@ struct v22bis_state_s
/* Receive section */ /* Receive section */
struct struct
{ {
/*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief The scaling factor accessed by the AGC algorithm. */
float agc_scaling;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
int16_t rrc_filter[V22BIS_RX_FILTER_STEPS]; int16_t rrc_filter[V22BIS_RX_FILTER_STEPS];
#else #else
/*! \brief The scaling factor accessed by the AGC algorithm. */
float agc_scaling;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
float rrc_filter[V22BIS_RX_FILTER_STEPS]; float rrc_filter[V22BIS_RX_FILTER_STEPS];
#endif #endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */ /*! \brief Current offset into the RRC pulse shaping filter buffer. */
@ -116,19 +127,29 @@ struct v22bis_state_s
/*! \brief >0 if a signal above the minimum is present. It may or may not be a V.22bis signal. */ /*! \brief >0 if a signal above the minimum is present. It may or may not be a V.22bis signal. */
int signal_present; int signal_present;
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The current phase of the carrier (i.e. the DDS parameter). */ /*! \brief The current phase of the carrier (i.e. the DDS parameter). */
uint32_t carrier_phase; uint32_t carrier_phase;
/*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */ /*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */
int32_t carrier_phase_rate; int32_t carrier_phase_rate;
#if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The proportional part of the carrier tracking filter. */ /*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p; float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */ /*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i; float carrier_track_i;
#else
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
#endif
/*! \brief A callback function which may be enabled to report every symbol's /*! \brief A callback function which may be enabled to report every symbol's
constellation position. */ constellation position. */
qam_report_handler_t qam_report; qam_report_handler_t qam_report;
@ -142,20 +163,22 @@ struct v22bis_state_s
int32_t carrier_on_power; int32_t carrier_on_power;
/*! \brief The power meter level at which carrier off is declared. */ /*! \brief The power meter level at which carrier off is declared. */
int32_t carrier_off_power; int32_t carrier_off_power;
/*! \brief The scaling factor accessed by the AGC algorithm. */
float agc_scaling;
int constellation_state; int constellation_state;
#if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief The current delta factor for updating the equalizer coefficients. */ /*! \brief The current delta factor for updating the equalizer coefficients. */
float eq_delta; float eq_delta;
#if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief The adaptive equalizer coefficients. */ /*! \brief The adaptive equalizer coefficients. */
complexi_t eq_coeff[2*V22BIS_EQUALIZER_LEN + 1]; complexi_t eq_coeff[2*V22BIS_EQUALIZER_LEN + 1];
/*! \brief The equalizer signal buffer. */ /*! \brief The equalizer signal buffer. */
complexi_t eq_buf[V22BIS_EQUALIZER_MASK + 1]; complexi_t eq_buf[V22BIS_EQUALIZER_MASK + 1];
#else #else
/*! \brief The current delta factor for updating the equalizer coefficients. */
float eq_delta;
/*! \brief The adaptive equalizer coefficients. */
complexf_t eq_coeff[2*V22BIS_EQUALIZER_LEN + 1]; complexf_t eq_coeff[2*V22BIS_EQUALIZER_LEN + 1];
/*! \brief The equalizer signal buffer. */
complexf_t eq_buf[V22BIS_EQUALIZER_MASK + 1]; complexf_t eq_buf[V22BIS_EQUALIZER_MASK + 1];
#endif #endif
/*! \brief Current offset into the equalizer buffer. */ /*! \brief Current offset into the equalizer buffer. */
@ -182,16 +205,27 @@ struct v22bis_state_s
/* Transmit section */ /* Transmit section */
struct struct
{ {
#if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief The guard tone level. */
float guard_level;
/*! \brief The gain factor needed to achieve the specified output power. */ /*! \brief The gain factor needed to achieve the specified output power. */
float gain; float gain;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
/*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */
complexf_t rrc_filter[2*V22BIS_TX_FILTER_STEPS]; complexf_t rrc_filter[2*V22BIS_TX_FILTER_STEPS];
#else
/*! \brief The guard tone level. */
float guard_level;
/*! \brief The gain factor needed to achieve the specified output power. */
float gain;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
complexf_t rrc_filter[2*V22BIS_TX_FILTER_STEPS];
#endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */ /*! \brief Current offset into the RRC pulse shaping filter buffer. */
int rrc_filter_step; int rrc_filter_step;
/*! \brief The register for the data scrambler. */ /*! \brief The register for the data scrambler. */
unsigned int scramble_reg; uint32_t scramble_reg;
/*! \brief A counter for the number of consecutive bits of repeating pattern through /*! \brief A counter for the number of consecutive bits of repeating pattern through
the scrambler. */ the scrambler. */
int scrambler_pattern_count; int scrambler_pattern_count;
@ -208,7 +242,6 @@ struct v22bis_state_s
uint32_t guard_phase; uint32_t guard_phase;
/*! \brief The update rate for the phase of the guard tone (i.e. the DDS increment). */ /*! \brief The update rate for the phase of the guard tone (i.e. the DDS increment). */
int32_t guard_phase_rate; int32_t guard_phase_rate;
float guard_level;
/*! \brief The current fractional phase of the baud timing. */ /*! \brief The current fractional phase of the baud timing. */
int baud_phase; int baud_phase;
/*! \brief The code number for the current position in the constellation. */ /*! \brief The code number for the current position in the constellation. */

View File

@ -69,17 +69,62 @@ struct v27ter_rx_state_s
routine. */ routine. */
void *qam_user_data; void *qam_user_data;
/*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
/*! \brief The scaling factor accessed by the AGC algorithm. */
int16_t agc_scaling;
/*! \brief The previous value of agc_scaling, needed to reuse old training. */
int16_t agc_scaling_save;
/*! \brief The current delta factor for updating the equalizer coefficients. */
float eq_delta;
/*! \brief The adaptive equalizer coefficients. */
/*complexi16_t*/ complexf_t eq_coeff[V27TER_EQUALIZER_LEN];
/*! \brief A saved set of adaptive equalizer coefficients for use after restarts. */
/*complexi16_t*/ complexf_t eq_coeff_save[V27TER_EQUALIZER_LEN];
/*! \brief The equalizer signal buffer. */
/*complexi16_t*/ complexf_t eq_buf[V27TER_EQUALIZER_LEN];
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
int16_t rrc_filter[V27TER_RX_FILTER_STEPS]; int16_t rrc_filter[V27TER_RX_FILTER_STEPS];
#else #else
/*! \brief The scaling factor accessed by the AGC algorithm. */
float agc_scaling;
/*! \brief The previous value of agc_scaling, needed to reuse old training. */
float agc_scaling_save;
/*! \brief The current delta factor for updating the equalizer coefficients. */
float eq_delta;
/*! \brief The adaptive equalizer coefficients. */
complexf_t eq_coeff[V27TER_EQUALIZER_LEN];
/*! \brief A saved set of adaptive equalizer coefficients for use after restarts. */
complexf_t eq_coeff_save[V27TER_EQUALIZER_LEN];
/*! \brief The equalizer signal buffer. */
complexf_t eq_buf[V27TER_EQUALIZER_LEN];
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
float rrc_filter[V27TER_RX_FILTER_STEPS]; float rrc_filter[V27TER_RX_FILTER_STEPS];
#endif #endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */ /*! \brief Current offset into the RRC pulse shaping filter buffer. */
int rrc_filter_step; int rrc_filter_step;
/*! \brief The register for the training and data scrambler. */ /*! \brief The register for the training and data scrambler. */
unsigned int scramble_reg; uint32_t scramble_reg;
/*! \brief A counter for the number of consecutive bits of repeating pattern through /*! \brief A counter for the number of consecutive bits of repeating pattern through
the scrambler. */ the scrambler. */
int scrambler_pattern_count; int scrambler_pattern_count;
@ -91,9 +136,6 @@ struct v27ter_rx_state_s
int training_stage; int training_stage;
/*! \brief A count of how far through the current training step we are. */ /*! \brief A count of how far through the current training step we are. */
int training_count; int training_count;
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The value of the last signal sample, using the a simple HPF for signal power estimation. */ /*! \brief The value of the last signal sample, using the a simple HPF for signal power estimation. */
int16_t last_sample; int16_t last_sample;
/*! \brief >0 if a signal above the minimum is present. It may or may not be a V.27ter signal. */ /*! \brief >0 if a signal above the minimum is present. It may or may not be a V.27ter signal. */
@ -115,17 +157,6 @@ struct v27ter_rx_state_s
int32_t carrier_phase_rate; int32_t carrier_phase_rate;
/*! \brief The carrier update rate saved for reuse when using short training. */ /*! \brief The carrier update rate saved for reuse when using short training. */
int32_t carrier_phase_rate_save; int32_t carrier_phase_rate_save;
#if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
#else
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
#endif
/*! \brief A power meter, to measure the HPF'ed signal power in the channel. */ /*! \brief A power meter, to measure the HPF'ed signal power in the channel. */
power_meter_t power; power_meter_t power;
@ -144,36 +175,6 @@ struct v27ter_rx_state_s
/*! \brief The current half of the baud. */ /*! \brief The current half of the baud. */
int baud_half; int baud_half;
#if defined(SPANDSP_USE_FIXED_POINT)
/*! \brief The scaling factor accessed by the AGC algorithm. */
int16_t agc_scaling;
/*! \brief The previous value of agc_scaling, needed to reuse old training. */
int16_t agc_scaling_save;
/*! \brief The current delta factor for updating the equalizer coefficients. */
float eq_delta;
/*! \brief The adaptive equalizer coefficients. */
/*complexi16_t*/ complexf_t eq_coeff[V27TER_EQUALIZER_LEN];
/*! \brief A saved set of adaptive equalizer coefficients for use after restarts. */
/*complexi16_t*/ complexf_t eq_coeff_save[V27TER_EQUALIZER_LEN];
/*! \brief The equalizer signal buffer. */
/*complexi16_t*/ complexf_t eq_buf[V27TER_EQUALIZER_LEN];
#else
/*! \brief The scaling factor accessed by the AGC algorithm. */
float agc_scaling;
/*! \brief The previous value of agc_scaling, needed to reuse old training. */
float agc_scaling_save;
/*! \brief The current delta factor for updating the equalizer coefficients. */
float eq_delta;
/*! \brief The adaptive equalizer coefficients. */
complexf_t eq_coeff[V27TER_EQUALIZER_LEN];
/*! \brief A saved set of adaptive equalizer coefficients for use after restarts. */
complexf_t eq_coeff_save[V27TER_EQUALIZER_LEN];
/*! \brief The equalizer signal buffer. */
complexf_t eq_buf[V27TER_EQUALIZER_LEN];
#endif
/*! \brief Integration variable for damping the Gardner algorithm tests. */ /*! \brief Integration variable for damping the Gardner algorithm tests. */
int gardner_integrate; int gardner_integrate;
/*! \brief Current step size of Gardner algorithm integration. */ /*! \brief Current step size of Gardner algorithm integration. */

View File

@ -49,26 +49,24 @@ struct v27ter_tx_state_s
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
/*! \brief The gain factor needed to achieve the specified output power at 2400bps. */ /*! \brief The gain factor needed to achieve the specified output power at 2400bps. */
int32_t gain_2400; int16_t gain_2400;
/*! \brief The gain factor needed to achieve the specified output power at 4800bps. */ /*! \brief The gain factor needed to achieve the specified output power at 4800bps. */
int32_t gain_4800; int16_t gain_4800;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
complexi16_t rrc_filter[2*V27TER_TX_FILTER_STEPS];
#else #else
/*! \brief The gain factor needed to achieve the specified output power at 2400bps. */ /*! \brief The gain factor needed to achieve the specified output power at 2400bps. */
float gain_2400; float gain_2400;
/*! \brief The gain factor needed to achieve the specified output power at 4800bps. */ /*! \brief The gain factor needed to achieve the specified output power at 4800bps. */
float gain_4800; float gain_4800;
#endif /*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
/*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */
#if defined(SPANDSP_USE_FIXED_POINT)
complexi16_t rrc_filter[2*V27TER_TX_FILTER_STEPS];
#else
complexf_t rrc_filter[2*V27TER_TX_FILTER_STEPS]; complexf_t rrc_filter[2*V27TER_TX_FILTER_STEPS];
#endif #endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */ /*! \brief Current offset into the RRC pulse shaping filter buffer. */
int rrc_filter_step; int rrc_filter_step;
/*! \brief The register for the training and data scrambler. */ /*! \brief The register for the training and data scrambler. */
unsigned int scramble_reg; uint32_t scramble_reg;
/*! \brief A counter for the number of consecutive bits of repeating pattern through /*! \brief A counter for the number of consecutive bits of repeating pattern through
the scrambler. */ the scrambler. */
int scrambler_pattern_count; int scrambler_pattern_count;

View File

@ -141,8 +141,8 @@ SPAN_DECLARE(void) t4_tx_set_header_info(t4_state_t *s, const char *info);
the current time zone of the program's environment is used. the current time zone of the program's environment is used.
\brief Set the header timezone. \brief Set the header timezone.
\param s The T.4 context. \param s The T.4 context.
\param info A POSIX timezone description string. */ \param tz A time zone descriptor. */
SPAN_DECLARE(void) t4_tx_set_header_tz(t4_state_t *s, const char *tzstring); SPAN_DECLARE(void) t4_tx_set_header_tz(t4_state_t *s, tz_t *tz);
/*! Set page header extends or overlays the image mode. /*! Set page header extends or overlays the image mode.
\brief Set page header overlay mode. \brief Set page header overlay mode.

View File

@ -61,8 +61,6 @@ enum
*/ */
typedef struct v22bis_state_s v22bis_state_t; typedef struct v22bis_state_s v22bis_state_t;
extern const complexf_t v22bis_constellation[16];
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" extern "C"
{ {

View File

@ -58,9 +58,10 @@
#include "spandsp/v29tx.h" #include "spandsp/v29tx.h"
#include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_rx.h"
#include "spandsp/v27ter_tx.h" #include "spandsp/v27ter_tx.h"
#include "spandsp/timezone.h"
#include "spandsp/t4_rx.h" #include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h" #include "spandsp/t4_tx.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t81_t82_arith_coding.h" #include "spandsp/t81_t82_arith_coding.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)
@ -81,7 +82,8 @@
#include "spandsp/t30_logging.h" #include "spandsp/t30_logging.h"
#include "spandsp/private/logging.h" #include "spandsp/private/logging.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85) #include "spandsp/private/timezone.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t81_t82_arith_coding.h" #include "spandsp/private/t81_t82_arith_coding.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)
@ -1975,6 +1977,8 @@ static int start_sending_document(t30_state_t *s)
t4_tx_set_tx_encoding(&s->t4.tx, s->line_encoding); t4_tx_set_tx_encoding(&s->t4.tx, s->line_encoding);
t4_tx_set_local_ident(&s->t4.tx, s->tx_info.ident); t4_tx_set_local_ident(&s->t4.tx, s->tx_info.ident);
t4_tx_set_header_info(&s->t4.tx, s->header_info); t4_tx_set_header_info(&s->t4.tx, s->header_info);
if (s->use_own_tz)
t4_tx_set_header_tz(&s->t4.tx, &s->tz);
s->x_resolution = t4_tx_get_x_resolution(&s->t4.tx); s->x_resolution = t4_tx_get_x_resolution(&s->t4.tx);
s->y_resolution = t4_tx_get_y_resolution(&s->t4.tx); s->y_resolution = t4_tx_get_y_resolution(&s->t4.tx);

View File

@ -58,9 +58,10 @@
#include "spandsp/v29tx.h" #include "spandsp/v29tx.h"
#include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_rx.h"
#include "spandsp/v27ter_tx.h" #include "spandsp/v27ter_tx.h"
#include "spandsp/timezone.h"
#include "spandsp/t4_rx.h" #include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h" #include "spandsp/t4_tx.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t81_t82_arith_coding.h" #include "spandsp/t81_t82_arith_coding.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)
@ -81,7 +82,8 @@
#include "spandsp/t30_logging.h" #include "spandsp/t30_logging.h"
#include "spandsp/private/logging.h" #include "spandsp/private/logging.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85) #include "spandsp/private/timezone.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t81_t82_arith_coding.h" #include "spandsp/private/t81_t82_arith_coding.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)
@ -585,13 +587,6 @@ SPAN_DECLARE(int) t30_set_tx_page_header_info(t30_state_t *s, const char *info)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) t30_set_tx_page_header_tz(t30_state_t *s, const char *tzstring)
{
t4_tx_set_header_tz(&s->t4.tx, tzstring);
return 0;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(size_t) t30_get_tx_page_header_info(t30_state_t *s, char *info) SPAN_DECLARE(size_t) t30_get_tx_page_header_info(t30_state_t *s, char *info)
{ {
if (info) if (info)
@ -600,6 +595,18 @@ SPAN_DECLARE(size_t) t30_get_tx_page_header_info(t30_state_t *s, char *info)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) t30_set_tx_page_header_tz(t30_state_t *s, const char *tzstring)
{
if (tz_init(&s->tz, tzstring))
{
s->use_own_tz = TRUE;
t4_tx_set_header_tz(&s->t4.tx, &s->tz);
return 0;
}
return -1;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(const char *) t30_get_rx_country(t30_state_t *s) SPAN_DECLARE(const char *) t30_get_rx_country(t30_state_t *s)
{ {
return s->country; return s->country;

View File

@ -58,9 +58,10 @@
#include "spandsp/v29tx.h" #include "spandsp/v29tx.h"
#include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_rx.h"
#include "spandsp/v27ter_tx.h" #include "spandsp/v27ter_tx.h"
#include "spandsp/timezone.h"
#include "spandsp/t4_rx.h" #include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h" #include "spandsp/t4_tx.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t81_t82_arith_coding.h" #include "spandsp/t81_t82_arith_coding.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)
@ -80,7 +81,8 @@
#include "spandsp/t30_logging.h" #include "spandsp/t30_logging.h"
#include "spandsp/private/logging.h" #include "spandsp/private/logging.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85) #include "spandsp/private/timezone.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t81_t82_arith_coding.h" #include "spandsp/private/t81_t82_arith_coding.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)

View File

@ -77,6 +77,7 @@
#if defined(SPANDSP_SUPPORT_V34) #if defined(SPANDSP_SUPPORT_V34)
#include "spandsp/v34.h" #include "spandsp/v34.h"
#endif #endif
#include "spandsp/timezone.h"
#include "spandsp/t4_rx.h" #include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h" #include "spandsp/t4_tx.h"
#include "spandsp/t30.h" #include "spandsp/t30.h"

View File

@ -71,9 +71,10 @@
#include "spandsp/v17rx.h" #include "spandsp/v17rx.h"
#include "spandsp/super_tone_rx.h" #include "spandsp/super_tone_rx.h"
#include "spandsp/modem_connect_tones.h" #include "spandsp/modem_connect_tones.h"
#include "spandsp/timezone.h"
#include "spandsp/t4_rx.h" #include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h" #include "spandsp/t4_tx.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t81_t82_arith_coding.h" #include "spandsp/t81_t82_arith_coding.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)
@ -108,7 +109,8 @@
#include "spandsp/private/modem_connect_tones.h" #include "spandsp/private/modem_connect_tones.h"
#include "spandsp/private/hdlc.h" #include "spandsp/private/hdlc.h"
#include "spandsp/private/fax_modems.h" #include "spandsp/private/fax_modems.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85) #include "spandsp/private/timezone.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t81_t82_arith_coding.h" #include "spandsp/private/t81_t82_arith_coding.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)

View File

@ -61,9 +61,10 @@
#include "spandsp/v27ter_rx.h" #include "spandsp/v27ter_rx.h"
#include "spandsp/v17tx.h" #include "spandsp/v17tx.h"
#include "spandsp/v17rx.h" #include "spandsp/v17rx.h"
#include "spandsp/timezone.h"
#include "spandsp/t4_rx.h" #include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h" #include "spandsp/t4_tx.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t81_t82_arith_coding.h" #include "spandsp/t81_t82_arith_coding.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)
@ -86,7 +87,8 @@
#include "spandsp/t38_terminal.h" #include "spandsp/t38_terminal.h"
#include "spandsp/private/logging.h" #include "spandsp/private/logging.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85) #include "spandsp/private/timezone.h"
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) || defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t81_t82_arith_coding.h" #include "spandsp/private/t81_t82_arith_coding.h"
#endif #endif
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)

View File

@ -82,6 +82,7 @@
#include "spandsp/logging.h" #include "spandsp/logging.h"
#include "spandsp/bit_operations.h" #include "spandsp/bit_operations.h"
#include "spandsp/async.h" #include "spandsp/async.h"
#include "spandsp/timezone.h"
#include "spandsp/t4_rx.h" #include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h" #include "spandsp/t4_tx.h"
#if defined(SPANDSP_SUPPORT_T85) #if defined(SPANDSP_SUPPORT_T85)

View File

@ -1521,9 +1521,9 @@ SPAN_DECLARE(void) t4_tx_set_header_info(t4_state_t *s, const char *info)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void) t4_tx_set_header_tz(t4_state_t *s, const char *tzstring) SPAN_DECLARE(void) t4_tx_set_header_tz(t4_state_t *s, tz_t *tz)
{ {
s->tz = tz_init(s->tz, tzstring); s->tz = tz;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -126,13 +126,13 @@ enum
#define ALPHA 0.99f #define ALPHA 0.99f
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
#define SYNC_LOW_BAND_EDGE_COEFF_0 ((int)(FP_FACTOR*(2.0f*ALPHA*COS_LOW_BAND_EDGE))) #define SYNC_LOW_BAND_EDGE_COEFF_0 FP_Q_6_10(2.0f*ALPHA*COS_LOW_BAND_EDGE)
#define SYNC_LOW_BAND_EDGE_COEFF_1 ((int)(FP_FACTOR*(-ALPHA*ALPHA))) #define SYNC_LOW_BAND_EDGE_COEFF_1 FP_Q_6_10(-ALPHA*ALPHA)
#define SYNC_LOW_BAND_EDGE_COEFF_2 ((int)(FP_FACTOR*(-ALPHA*SIN_LOW_BAND_EDGE))) #define SYNC_LOW_BAND_EDGE_COEFF_2 FP_Q_6_10(-ALPHA*SIN_LOW_BAND_EDGE)
#define SYNC_HIGH_BAND_EDGE_COEFF_0 ((int)(FP_FACTOR*(2.0f*ALPHA*COS_HIGH_BAND_EDGE))) #define SYNC_HIGH_BAND_EDGE_COEFF_0 FP_Q_6_10(2.0f*ALPHA*COS_HIGH_BAND_EDGE)
#define SYNC_HIGH_BAND_EDGE_COEFF_1 ((int)(FP_FACTOR*(-ALPHA*ALPHA))) #define SYNC_HIGH_BAND_EDGE_COEFF_1 FP_Q_6_10(-ALPHA*ALPHA)
#define SYNC_HIGH_BAND_EDGE_COEFF_2 ((int)(FP_FACTOR*(-ALPHA*SIN_HIGH_BAND_EDGE))) #define SYNC_HIGH_BAND_EDGE_COEFF_2 FP_Q_6_10(-ALPHA*SIN_HIGH_BAND_EDGE)
#define SYNC_MIXED_EDGES_COEFF_3 ((int)(FP_FACTOR*(-ALPHA*ALPHA*(SIN_HIGH_BAND_EDGE*COS_LOW_BAND_EDGE - SIN_LOW_BAND_EDGE*COS_HIGH_BAND_EDGE)))) #define SYNC_MIXED_EDGES_COEFF_3 FP_Q_6_10(-ALPHA*ALPHA*(SIN_HIGH_BAND_EDGE*COS_LOW_BAND_EDGE - SIN_LOW_BAND_EDGE*COS_HIGH_BAND_EDGE))
#else #else
#define SYNC_LOW_BAND_EDGE_COEFF_0 (2.0f*ALPHA*COS_LOW_BAND_EDGE) #define SYNC_LOW_BAND_EDGE_COEFF_0 (2.0f*ALPHA*COS_LOW_BAND_EDGE)
#define SYNC_LOW_BAND_EDGE_COEFF_1 (-ALPHA*ALPHA) #define SYNC_LOW_BAND_EDGE_COEFF_1 (-ALPHA*ALPHA)
@ -146,10 +146,10 @@ enum
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
static const int constellation_spacing[4] = static const int constellation_spacing[4] =
{ {
((int)(FP_FACTOR*1.414f), FP_Q_6_10(1.414f),
((int)(FP_FACTOR*2.0f)}, FP_Q_6_10(2.0f),
((int)(FP_FACTOR*2.828f)}, FP_Q_6_10(2.828f),
((int)(FP_FACTOR*4.0f)}, FP_Q_6_10(4.0f)
}; };
#else #else
static const float constellation_spacing[4] = static const float constellation_spacing[4] =

View File

@ -44,6 +44,9 @@
#include "spandsp/telephony.h" #include "spandsp/telephony.h"
#include "spandsp/logging.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/complex.h"
#include "spandsp/vector_float.h" #include "spandsp/vector_float.h"
#include "spandsp/complex_vector_float.h" #include "spandsp/complex_vector_float.h"
@ -62,9 +65,11 @@
#include "spandsp/private/v27ter_rx.h" #include "spandsp/private/v27ter_rx.h"
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
#define FP_SCALE FP_Q_6_10
#include "v27ter_rx_4800_fixed_rrc.h" #include "v27ter_rx_4800_fixed_rrc.h"
#include "v27ter_rx_2400_fixed_rrc.h" #include "v27ter_rx_2400_fixed_rrc.h"
#else #else
#define FP_SCALE(x) (x)
#include "v27ter_rx_4800_floating_rrc.h" #include "v27ter_rx_4800_floating_rrc.h"
#include "v27ter_rx_2400_floating_rrc.h" #include "v27ter_rx_2400_floating_rrc.h"
#endif #endif
@ -110,29 +115,19 @@ enum
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
static const complexi16_t v27ter_constellation[8] = static const complexi16_t v27ter_constellation[8] =
{
{((int)(FP_FACTOR* 1.414f), ((int)(FP_FACTOR* 0.0f)}, /* 0deg */
{((int)(FP_FACTOR* 1.0f), ((int)(FP_FACTOR* 1.0f)}, /* 45deg */
{((int)(FP_FACTOR* 0.0f), ((int)(FP_FACTOR* 1.414f)}, /* 90deg */
{((int)(FP_FACTOR*-1.0f), ((int)(FP_FACTOR* 1.0f)}, /* 135deg */
{((int)(FP_FACTOR*-1.414f), ((int)(FP_FACTOR* 0.0f)}, /* 180deg */
{((int)(FP_FACTOR*-1.0f), ((int)(FP_FACTOR*-1.0f)}, /* 225deg */
{((int)(FP_FACTOR* 0.0f), ((int)(FP_FACTOR*-1.414f)}, /* 270deg */
{((int)(FP_FACTOR* 1.0f), ((int)(FP_FACTOR*-1.0f)} /* 315deg */
};
#else #else
static const complexf_t v27ter_constellation[8] = static const complexf_t v27ter_constellation[8] =
{
{ 1.414f, 0.0f}, /* 0deg */
{ 1.0f, 1.0f}, /* 45deg */
{ 0.0f, 1.414f}, /* 90deg */
{-1.0f, 1.0f}, /* 135deg */
{-1.414f, 0.0f}, /* 180deg */
{-1.0f, -1.0f}, /* 225deg */
{ 0.0f, -1.414f}, /* 270deg */
{ 1.0f, -1.0f} /* 315deg */
};
#endif #endif
{
{FP_SCALE( 1.414f), FP_SCALE( 0.0f)}, /* 0deg */
{FP_SCALE( 1.0f), FP_SCALE( 1.0f)}, /* 45deg */
{FP_SCALE( 0.0f), FP_SCALE( 1.414f)}, /* 90deg */
{FP_SCALE(-1.0f), FP_SCALE( 1.0f)}, /* 135deg */
{FP_SCALE(-1.414f), FP_SCALE( 0.0f)}, /* 180deg */
{FP_SCALE(-1.0f), FP_SCALE(-1.0f)}, /* 225deg */
{FP_SCALE( 0.0f), FP_SCALE(-1.414f)}, /* 270deg */
{FP_SCALE( 1.0f), FP_SCALE(-1.0f)} /* 315deg */
};
SPAN_DECLARE(float) v27ter_rx_carrier_frequency(v27ter_rx_state_t *s) SPAN_DECLARE(float) v27ter_rx_carrier_frequency(v27ter_rx_state_t *s)
{ {
@ -198,14 +193,14 @@ static void equalizer_restore(v27ter_rx_state_t *s)
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
cvec_copyi16(s->eq_coeff, s->eq_coeff_save, V27TER_EQUALIZER_LEN); cvec_copyi16(s->eq_coeff, s->eq_coeff_save, V27TER_EQUALIZER_LEN);
cvec_zeroi16(s->eq_buf, V27TER_EQUALIZER_LEN); cvec_zeroi16(s->eq_buf, V27TER_EQUALIZER_LEN);
s->eq_delta = 32768.0f*EQUALIZER_DELTA/V27TER_EQUALIZER_LEN); s->eq_delta = 32768.0f*EQUALIZER_DELTA/V27TER_EQUALIZER_LEN;
#else #else
cvec_copyf(s->eq_coeff, s->eq_coeff_save, V27TER_EQUALIZER_LEN); cvec_copyf(s->eq_coeff, s->eq_coeff_save, V27TER_EQUALIZER_LEN);
cvec_zerof(s->eq_buf, V27TER_EQUALIZER_LEN); cvec_zerof(s->eq_buf, V27TER_EQUALIZER_LEN);
s->eq_delta = EQUALIZER_DELTA/V27TER_EQUALIZER_LEN; s->eq_delta = EQUALIZER_DELTA/V27TER_EQUALIZER_LEN;
#endif #endif
s->eq_put_step = (s->bit_rate == 4800) ? RX_PULSESHAPER_4800_COEFF_SETS*5/2 : RX_PULSESHAPER_2400_COEFF_SETS*20/(3*2); s->eq_put_step = (s->bit_rate == 4800) ? (RX_PULSESHAPER_4800_COEFF_SETS*5/2 - 1) : (RX_PULSESHAPER_2400_COEFF_SETS*20/(3*2) - 1);
s->eq_step = 0; s->eq_step = 0;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -214,13 +209,17 @@ static void equalizer_reset(v27ter_rx_state_t *s)
{ {
/* Start with an equalizer based on everything being perfect. */ /* Start with an equalizer based on everything being perfect. */
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
static const complexi16_t x = {FP_SCALE(1.414f), FP_SCALE(0.0f)};
cvec_zeroi16(s->eq_coeff, V27TER_EQUALIZER_LEN); cvec_zeroi16(s->eq_coeff, V27TER_EQUALIZER_LEN);
s->eq_coeff[V27TER_EQUALIZER_PRE_LEN + 1] = complex_seti16(1.414f*FP_FACTOR, 0); s->eq_coeff[V27TER_EQUALIZER_PRE_LEN + 1] = x;
cvec_zeroi16(s->eq_buf, V27TER_EQUALIZER_LEN); cvec_zeroi16(s->eq_buf, V27TER_EQUALIZER_LEN);
s->eq_delta = 32768.0f*EQUALIZER_DELTA/V27TER_EQUALIZER_LEN); s->eq_delta = 32768.0f*EQUALIZER_DELTA/V27TER_EQUALIZER_LEN;
#else #else
static const complexf_t x = {1.414f, 0.0f};
cvec_zerof(s->eq_coeff, V27TER_EQUALIZER_LEN); cvec_zerof(s->eq_coeff, V27TER_EQUALIZER_LEN);
s->eq_coeff[V27TER_EQUALIZER_PRE_LEN + 1] = complex_setf(1.414f, 0.0f); s->eq_coeff[V27TER_EQUALIZER_PRE_LEN + 1] = x;
cvec_zerof(s->eq_buf, V27TER_EQUALIZER_LEN); cvec_zerof(s->eq_buf, V27TER_EQUALIZER_LEN);
s->eq_delta = EQUALIZER_DELTA/V27TER_EQUALIZER_LEN; s->eq_delta = EQUALIZER_DELTA/V27TER_EQUALIZER_LEN;
#endif #endif
@ -324,8 +323,13 @@ static __inline__ int find_octant(complexf_t *z)
if (abs_im > abs_re*0.4142136f && abs_im < abs_re*2.4142136f) if (abs_im > abs_re*0.4142136f && abs_im < abs_re*2.4142136f)
{ {
/* Split the space along the two axes. */ /* Split the space along the two axes. */
#if defined(SPANDSP_USE_FIXED_POINTx)
b1 = (z->re < 0);
b2 = (z->im < 0);
#else
b1 = (z->re < 0.0f); b1 = (z->re < 0.0f);
b2 = (z->im < 0.0f); b2 = (z->im < 0.0f);
#endif
bits = (b2 << 2) | ((b1 ^ b2) << 1) | 1; bits = (b2 << 2) | ((b1 ^ b2) << 1) | 1;
} }
else else

View File

@ -151,14 +151,14 @@ static complexf_t getbaud(v27ter_tx_state_t *s)
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
static const complexi16_t constellation[8] = static const complexi16_t constellation[8] =
{ {
{ 1414, 0000}, /* 0deg */ {FP_Q_6_10( 1.414f), FP_Q_6_10( 0.0f)}, /* 0deg */
{ 1000, 1000}, /* 45deg */ {FP_Q_6_10( 1.0f), FP_Q_6_10( 1.0f)}, /* 45deg */
{ 0000, 1414}, /* 90deg */ {FP_Q_6_10( 0.0f), FP_Q_6_10( 1.414f)}, /* 90deg */
{-1000, 1000}, /* 135deg */ {FP_Q_6_10(-1.0f), FP_Q_6_10( 1.0f)}, /* 135deg */
{-1414, 0000}, /* 180deg */ {FP_Q_6_10(-1.414f), FP_Q_6_10( 0.0f)}, /* 180deg */
{-1000, -1000}, /* 225deg */ {FP_Q_6_10(-1.0f), FP_Q_6_10(-1.0f)}, /* 225deg */
{ 0000, -1414}, /* 270deg */ {FP_Q_6_10( 0.0f), FP_Q_6_10(-1.414f)}, /* 270deg */
{ 1000, -1000} /* 315deg */ {FP_Q_6_10( 1.0f), FP_Q_6_10(-1.0f)} /* 315deg */
}; };
static const complexi16_t zero = {0, 0}; static const complexi16_t zero = {0, 0};
#else #else

View File

@ -1183,7 +1183,7 @@ static void reset_lapm(v42_state_t *ss)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void) v42_stop(v42_state_t *ss) void v42_stop(v42_state_t *ss)
{ {
lapm_state_t *s; lapm_state_t *s;

View File

@ -256,6 +256,7 @@ static void digit_status(void *data, int signal, int level, int delay)
static int last_step = 0; static int last_step = 0;
static int first = TRUE; static int first = TRUE;
//printf("Digit status %d %d %d\n", signal, level, delay);
callback_hit = TRUE; callback_hit = TRUE;
len = step - last_step; len = step - last_step;
if (data == (void *) 0x12345678) if (data == (void *) 0x12345678)
@ -321,10 +322,14 @@ static void mitel_cm7291_side_1_tests(void)
float rcfo; float rcfo;
dtmf_rx_state_t *dtmf_state; dtmf_rx_state_t *dtmf_state;
awgn_state_t noise_source; awgn_state_t noise_source;
logging_state_t *logging;
dtmf_state = dtmf_rx_init(NULL, NULL, NULL); dtmf_state = dtmf_rx_init(NULL, NULL, NULL);
if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0) if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0)
dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99); dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99);
logging = dtmf_rx_get_logging_state(dtmf_state);
span_log_set_level(logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
span_log_set_tag(logging, "DTMF-rx");
/* Test 1: Mitel's test 1 isn't really a test. Its a calibration step, /* Test 1: Mitel's test 1 isn't really a test. Its a calibration step,
which has no meaning here. */ which has no meaning here. */
@ -627,10 +632,14 @@ static void mitel_cm7291_side_2_and_bellcore_tests(void)
SNDFILE *inhandle; SNDFILE *inhandle;
int frames; int frames;
dtmf_rx_state_t *dtmf_state; dtmf_rx_state_t *dtmf_state;
logging_state_t *logging;
dtmf_state = dtmf_rx_init(NULL, NULL, NULL); dtmf_state = dtmf_rx_init(NULL, NULL, NULL);
if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0) if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0)
dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99); dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99);
logging = dtmf_rx_get_logging_state(dtmf_state);
span_log_set_level(logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
span_log_set_tag(logging, "DTMF-rx");
/* The remainder of the Mitel tape is the talk-off test */ /* The remainder of the Mitel tape is the talk-off test */
/* Here we use the Bellcore test tapes (much tougher), in six /* Here we use the Bellcore test tapes (much tougher), in six
@ -694,10 +703,14 @@ static void dial_tone_tolerance_tests(void)
dtmf_rx_state_t *dtmf_state; dtmf_rx_state_t *dtmf_state;
tone_gen_descriptor_t dial_tone_desc; tone_gen_descriptor_t dial_tone_desc;
tone_gen_state_t dial_tone; tone_gen_state_t dial_tone;
logging_state_t *logging;
dtmf_state = dtmf_rx_init(NULL, NULL, NULL); dtmf_state = dtmf_rx_init(NULL, NULL, NULL);
if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0) if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0)
dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99); dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99);
logging = dtmf_rx_get_logging_state(dtmf_state);
span_log_set_level(logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
span_log_set_tag(logging, "DTMF-rx");
/* Test dial tone tolerance */ /* Test dial tone tolerance */
printf("Test: Dial tone tolerance.\n"); printf("Test: Dial tone tolerance.\n");
@ -742,6 +755,7 @@ static void callback_function_tests(void)
int len; int len;
int sample; int sample;
dtmf_rx_state_t *dtmf_state; dtmf_rx_state_t *dtmf_state;
logging_state_t *logging;
/* Test the callback mode for delivering detected digits */ /* Test the callback mode for delivering detected digits */
printf("Test: Callback digit delivery mode.\n"); printf("Test: Callback digit delivery mode.\n");
@ -751,6 +765,9 @@ static void callback_function_tests(void)
dtmf_state = dtmf_rx_init(NULL, digit_delivery, (void *) 0x12345678); dtmf_state = dtmf_rx_init(NULL, digit_delivery, (void *) 0x12345678);
if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0) if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0)
dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99); dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99);
logging = dtmf_rx_get_logging_state(dtmf_state);
span_log_set_level(logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
span_log_set_tag(logging, "DTMF-rx");
my_dtmf_gen_init(0.0f, DEFAULT_DTMF_TX_LEVEL, 0.0f, DEFAULT_DTMF_TX_LEVEL, DEFAULT_DTMF_TX_ON_TIME, DEFAULT_DTMF_TX_OFF_TIME); my_dtmf_gen_init(0.0f, DEFAULT_DTMF_TX_LEVEL, 0.0f, DEFAULT_DTMF_TX_LEVEL, DEFAULT_DTMF_TX_ON_TIME, DEFAULT_DTMF_TX_OFF_TIME);
for (i = 1; i < 10; i++) for (i = 1; i < 10; i++)
@ -778,6 +795,9 @@ static void callback_function_tests(void)
dtmf_rx_set_realtime_callback(dtmf_state, digit_status, (void *) 0x12345678); dtmf_rx_set_realtime_callback(dtmf_state, digit_status, (void *) 0x12345678);
if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0) if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0)
dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99); dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99);
logging = dtmf_rx_get_logging_state(dtmf_state);
span_log_set_level(logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
span_log_set_tag(logging, "DTMF-rx");
my_dtmf_gen_init(0.0f, DEFAULT_DTMF_TX_LEVEL, 0.0f, DEFAULT_DTMF_TX_LEVEL, DEFAULT_DTMF_TX_ON_TIME, DEFAULT_DTMF_TX_OFF_TIME); my_dtmf_gen_init(0.0f, DEFAULT_DTMF_TX_LEVEL, 0.0f, DEFAULT_DTMF_TX_LEVEL, DEFAULT_DTMF_TX_ON_TIME, DEFAULT_DTMF_TX_OFF_TIME);
step = 0; step = 0;
@ -813,19 +833,23 @@ static void decode_test(const char *test_file)
int actual; int actual;
int samples; int samples;
int total; int total;
logging_state_t *logging;
dtmf_state = dtmf_rx_init(NULL, NULL, NULL); dtmf_state = dtmf_rx_init(NULL, NULL, NULL);
if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0) if (use_dialtone_filter || max_forward_twist >= 0 || max_reverse_twist >= 0)
dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99); dtmf_rx_parms(dtmf_state, use_dialtone_filter, max_forward_twist, max_reverse_twist, -99);
logging = dtmf_rx_get_logging_state(dtmf_state);
span_log_set_level(logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
span_log_set_tag(logging, "DTMF-rx");
/* We will decode the audio from a file. */ /* We will decode the audio from a file. */
if ((inhandle = sf_open_telephony_read(decode_test_file, 1)) == NULL) if ((inhandle = sf_open_telephony_read(decode_test_file, 1)) == NULL)
{ {
fprintf(stderr, " Cannot open audio file '%s'\n", decode_test_file); fprintf(stderr, " Cannot open audio file '%s'\n", decode_test_file);
exit(2); exit(2);
} }
total = 0; total = 0;
while ((samples = sf_readf_short(inhandle, amp, SAMPLES_PER_CHUNK)) > 0) while ((samples = sf_readf_short(inhandle, amp, SAMPLES_PER_CHUNK)) > 0)
{ {