spandsp 0.0.6
|
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.7.4.1 2009/12/19 10:16:44 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 const 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 const 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_DATA extern const float *line_models[]; 00136 00137 SPAN_DECLARE(void) both_ways_line_model(both_ways_line_model_state_t *s, 00138 int16_t output1[], 00139 const int16_t input1[], 00140 int16_t output2[], 00141 const int16_t input2[], 00142 int samples); 00143 00144 SPAN_DECLARE(void) both_ways_line_model_set_dc(both_ways_line_model_state_t *s, float dc1, float dc2); 00145 00146 SPAN_DECLARE(void) both_ways_line_model_set_mains_pickup(both_ways_line_model_state_t *s, int f, float level1, float level2); 00147 00148 SPAN_DECLARE(both_ways_line_model_state_t *) both_ways_line_model_init(int model1, 00149 float noise1, 00150 int model2, 00151 float noise2, 00152 int codec, 00153 int rbs_pattern); 00154 00155 SPAN_DECLARE(int) both_ways_line_model_release(both_ways_line_model_state_t *s); 00156 00157 SPAN_DECLARE(void) one_way_line_model(one_way_line_model_state_t *s, 00158 int16_t output[], 00159 const int16_t input[], 00160 int samples); 00161 00162 SPAN_DECLARE(void) one_way_line_model_set_dc(one_way_line_model_state_t *s, float dc); 00163 00164 SPAN_DECLARE(void) one_way_line_model_set_mains_pickup(one_way_line_model_state_t *s, int f, float level); 00165 00166 SPAN_DECLARE(one_way_line_model_state_t *) one_way_line_model_init(int model, float noise, int codec, int rbs_pattern); 00167 00168 SPAN_DECLARE(int) one_way_line_model_release(one_way_line_model_state_t *s); 00169 00170 #ifdef __cplusplus 00171 } 00172 #endif 00173 00174 #endif 00175 /*- End of file ------------------------------------------------------------*/