line_model.h

Go to the documentation of this file.
00001 /*
00002  * SpanDSP - a series of DSP components for telephony
00003  *
00004  * line_model.h - Model a telephone line.
00005  *
00006  * Written by Steve Underwood <steveu@coppice.org>
00007  *
00008  * Copyright (C) 2004 Steve Underwood
00009  *
00010  * All rights reserved.
00011  *
00012  * This program is free software; you can redistribute it and/or modify
00013  * it under the terms of the GNU Lesser General Public License version 2.1,
00014  * as published by the Free Software Foundation.
00015  *
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU Lesser General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU Lesser General Public
00022  * License along with this program; if not, write to the Free Software
00023  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00024  *
00025  * $Id: line_model.h,v 1.5 2009/01/31 08:48:10 steveu Exp $
00026  */
00027 
00028 /*! \file */
00029 
00030 /*! \page line_model_page Telephone line model
00031 \section line_model_page_sec_1 What does it do?
00032 The telephone line modelling module provides simple modelling of one way and two
00033 way telephone lines.
00034 
00035 The path being modelled is:
00036 
00037     -    terminal
00038     -      | < hybrid echo (2-way models)
00039     -      |
00040     -      | < noise and filtering
00041     -      |
00042     -      | < hybrid echo (2-way models)
00043     -     CO
00044     -      |
00045     -      | < A-law distortion + bulk delay
00046     -      |
00047     -     CO
00048     -      | < hybrid echo (2-way models)
00049     -      |
00050     -      | < noise and filtering
00051     -      |
00052     -      | < hybrid echo (2-way models)
00053     -    terminal
00054 */
00055 
00056 #if !defined(_SPANDSP_LINE_MODEL_H_)
00057 #define _SPANDSP_LINE_MODEL_H_
00058 
00059 #define SPANDSP_EXPOSE_INTERNAL_STRUCTURES
00060 #include <spandsp.h>
00061 
00062 #define LINE_FILTER_SIZE 129
00063 
00064 /*!
00065     One way line model descriptor. This holds the complete state of
00066     a line model with transmission in only one direction.
00067 */
00068 typedef struct
00069 {
00070     codec_munge_state_t *munge;
00071 
00072     /*! The coefficients for the near end analogue section simulation filter */
00073     float *near_filter;
00074     /*! The number of coefficients for the near end analogue section simulation filter */
00075     int near_filter_len;
00076     /*! Last transmitted samples (ring buffer, used by the line filter) */
00077     float near_buf[LINE_FILTER_SIZE];
00078     /*! Pointer of the last transmitted sample in buf */
00079     int near_buf_ptr;
00080     /*! The noise source for local analogue section of the line */
00081     awgn_state_t near_noise;
00082 
00083     /*! The bulk delay of the path, in samples */
00084     int bulk_delay;
00085     /*! A pointer to the current write position in the bulk delay store. */
00086     int bulk_delay_ptr;
00087     /*! The data store for simulating the bulk delay */
00088     int16_t bulk_delay_buf[8000];
00089 
00090     /*! The coefficients for the far end analogue section simulation filter */
00091     float *far_filter;
00092     /*! The number of coefficients for the far end analogue section simulation filter */
00093     int far_filter_len;
00094     /*! Last transmitted samples (ring buffer, used by the line filter) */
00095     float far_buf[LINE_FILTER_SIZE];
00096     /*! Pointer of the last transmitted sample in buf */
00097     int far_buf_ptr;
00098     /*! The noise source for distant analogue section of the line */
00099     awgn_state_t far_noise;
00100 
00101     /*! The scaling factor for the local CPE hybrid echo */
00102     float near_cpe_hybrid_echo;
00103     /*! The scaling factor for the local CO hybrid echo */
00104     float near_co_hybrid_echo;
00105 
00106     /*! The scaling factor for the far CPE hybrid echo */
00107     float far_cpe_hybrid_echo;
00108     /*! The scaling factor for the far CO hybrid echo */
00109     float far_co_hybrid_echo;
00110     /*! DC offset impairment */
00111     float dc_offset;
00112     
00113     /*! Mains pickup impairment */
00114     int mains_interference;
00115     tone_gen_state_t mains_tone;
00116 } one_way_line_model_state_t;
00117 
00118 /*!
00119     Two way line model descriptor. This holds the complete state of
00120     a line model with transmission in both directions.
00121 */
00122 typedef struct
00123 {
00124     one_way_line_model_state_t line1;
00125     one_way_line_model_state_t line2;
00126     float fout1;
00127     float fout2; 
00128 } both_ways_line_model_state_t;
00129 
00130 #ifdef __cplusplus
00131 extern "C"
00132 {
00133 #endif
00134 
00135 SPAN_DECLARE(void) both_ways_line_model(both_ways_line_model_state_t *s, 
00136                                         int16_t output1[],
00137                                         const int16_t input1[],
00138                                         int16_t output2[],
00139                                         const int16_t input2[],
00140                                         int samples);
00141 
00142 SPAN_DECLARE(void) both_ways_line_model_set_dc(both_ways_line_model_state_t *s, float dc1, float dc2);
00143 
00144 SPAN_DECLARE(void) both_ways_line_model_set_mains_pickup(both_ways_line_model_state_t *s, int f, float level1, float level2);
00145     
00146 SPAN_DECLARE(both_ways_line_model_state_t) *both_ways_line_model_init(int model1,
00147                                                                       float noise1,
00148                                                                       int model2,
00149                                                                       float noise2,
00150                                                                       int codec,
00151                                                                       int rbs_pattern);
00152 
00153 SPAN_DECLARE(int) both_ways_line_model_release(both_ways_line_model_state_t *s);
00154 
00155 SPAN_DECLARE(void) one_way_line_model(one_way_line_model_state_t *s, 
00156                                       int16_t output[],
00157                                       const int16_t input[],
00158                                       int samples);
00159 
00160 SPAN_DECLARE(void) one_way_line_model_set_dc(one_way_line_model_state_t *s, float dc);
00161 
00162 SPAN_DECLARE(void) one_way_line_model_set_mains_pickup(one_way_line_model_state_t *s, int f, float level);
00163 
00164 SPAN_DECLARE(one_way_line_model_state_t) *one_way_line_model_init(int model, float noise, int codec, int rbs_pattern);
00165 
00166 SPAN_DECLARE(int) one_way_line_model_release(one_way_line_model_state_t *s);
00167 
00168 #ifdef __cplusplus
00169 }
00170 #endif
00171 
00172 #endif
00173 /*- End of file ------------------------------------------------------------*/

Generated by  doxygen 1.6.2