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 General Public License version 2, as 00014 * 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 General Public License for more details. 00020 * 00021 * You should have received a copy of the GNU General Public License 00022 * 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.14 2007/03/28 13:56:05 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(_LINE_MODEL_H_) 00057 #define _LINE_MODEL_H_ 00058 00059 #define LINE_FILTER_SIZE 129 00060 00061 /*! 00062 One way line model descriptor. This holds the complete state of 00063 a line model with transmission in only one direction. 00064 */ 00065 typedef struct 00066 { 00067 codec_munge_state_t *munge; 00068 00069 /*! The coefficients for the near end analogue section simulation filter */ 00070 float *near_filter; 00071 /*! The number of coefficients for the near end analogue section simulation filter */ 00072 int near_filter_len; 00073 /*! Last transmitted samples (ring buffer, used by the line filter) */ 00074 float near_buf[LINE_FILTER_SIZE]; 00075 /*! Pointer of the last transmitted sample in buf */ 00076 int near_buf_ptr; 00077 /*! The noise source for local analogue section of the line */ 00078 awgn_state_t near_noise; 00079 00080 /*! The bulk delay of the path, in samples */ 00081 int bulk_delay; 00082 /*! A pointer to the current write position in the bulk delay store. */ 00083 int bulk_delay_ptr; 00084 /*! The data store for simulating the bulk delay */ 00085 int16_t bulk_delay_buf[8000]; 00086 00087 /*! The coefficients for the far end analogue section simulation filter */ 00088 float *far_filter; 00089 /*! The number of coefficients for the far end analogue section simulation filter */ 00090 int far_filter_len; 00091 /*! Last transmitted samples (ring buffer, used by the line filter) */ 00092 float far_buf[LINE_FILTER_SIZE]; 00093 /*! Pointer of the last transmitted sample in buf */ 00094 int far_buf_ptr; 00095 /*! The noise source for distant analogue section of the line */ 00096 awgn_state_t far_noise; 00097 00098 /*! The scaling factor for the local CPE hybrid echo */ 00099 float near_cpe_hybrid_echo; 00100 /*! The scaling factor for the local CO hybrid echo */ 00101 float near_co_hybrid_echo; 00102 00103 /*! The scaling factor for the far CPE hybrid echo */ 00104 float far_cpe_hybrid_echo; 00105 /*! The scaling factor for the far CO hybrid echo */ 00106 float far_co_hybrid_echo; 00107 /*! DC offset impairment */ 00108 float dc_offset; 00109 00110 /*! Mains pickup impairment */ 00111 int mains_interference; 00112 tone_gen_state_t mains_tone; 00113 } one_way_line_model_state_t; 00114 00115 /*! 00116 Two way line model descriptor. This holds the complete state of 00117 a line model with transmission in both directions. 00118 */ 00119 typedef struct 00120 { 00121 one_way_line_model_state_t line1; 00122 one_way_line_model_state_t line2; 00123 float fout1; 00124 float fout2; 00125 } both_ways_line_model_state_t; 00126 00127 #ifdef __cplusplus 00128 extern "C" { 00129 #endif 00130 00131 void both_ways_line_model(both_ways_line_model_state_t *s, 00132 int16_t output1[], 00133 const int16_t input1[], 00134 int16_t output2[], 00135 const int16_t input2[], 00136 int samples); 00137 00138 void both_ways_line_model_set_dc(both_ways_line_model_state_t *s, float dc1, float dc2); 00139 00140 void both_ways_line_model_set_mains_pickup(both_ways_line_model_state_t *s, int f, float level1, float level2); 00141 00142 both_ways_line_model_state_t *both_ways_line_model_init(int model1, 00143 float noise1, 00144 int model2, 00145 float noise2, 00146 int codec, 00147 int rbs_pattern); 00148 00149 int both_ways_line_model_release(both_ways_line_model_state_t *s); 00150 00151 void one_way_line_model(one_way_line_model_state_t *s, 00152 int16_t output[], 00153 const int16_t input[], 00154 int samples); 00155 00156 void one_way_line_model_set_dc(one_way_line_model_state_t *s, float dc); 00157 00158 void one_way_line_model_set_mains_pickup(one_way_line_model_state_t *s, int f, float level); 00159 00160 one_way_line_model_state_t *one_way_line_model_init(int model, float noise, int codec, int rbs_pattern); 00161 00162 int one_way_line_model_release(one_way_line_model_state_t *s); 00163 00164 #ifdef __cplusplus 00165 } 00166 #endif 00167 00168 #endif 00169 /*- End of file ------------------------------------------------------------*/