comparison spandsp-0.0.6pre17/tests/g168_tests.c @ 4:26cd8f1ef0b1

import spandsp-0.0.6pre17
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 15:50:58 +0200
parents
children
comparison
equal deleted inserted replaced
3:c6c5a16ce2f2 4:26cd8f1ef0b1
1 /*
2 * SpanDSP - a series of DSP components for telephony
3 *
4 * g168tests.c - Tests of the "test equipment" (filters, etc.) specified
5 * in G.168. This code is only for checking out the tools,
6 * not for testing an echo cancellor.
7 *
8 * Written by Steve Underwood <steveu@coppice.org>
9 *
10 * Copyright (C) 2001 Steve Underwood
11 *
12 * All rights reserved.
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License version 2, as
16 * published by the Free Software Foundation.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 *
27 * $Id: g168_tests.c,v 1.20 2009/05/30 15:23:13 steveu Exp $
28 */
29
30 #if defined(HAVE_CONFIG_H)
31 #include "config.h"
32 #endif
33
34 #include <stdlib.h>
35 #include <stdio.h>
36 #include <string.h>
37 #include <sndfile.h>
38
39 //#if defined(WITH_SPANDSP_INTERNALS)
40 #define SPANDSP_EXPOSE_INTERNAL_STRUCTURES
41 //#endif
42
43 #include "spandsp.h"
44 #include "spandsp/g168models.h"
45 #include "spandsp-sim.h"
46
47 #define FALSE 0
48 #define TRUE (!FALSE)
49
50 typedef struct
51 {
52 const char *name;
53 int max;
54 int cur;
55 float gain;
56 SNDFILE *handle;
57 int16_t signal[SAMPLE_RATE];
58 } signal_source_t;
59
60 signal_source_t local_css;
61 signal_source_t far_css;
62
63 static void signal_load(signal_source_t *sig, const char *name)
64 {
65 sig->handle = sf_open_telephony_read(name, 1);
66 sig->name = name;
67 sig->max = sf_readf_short(sig->handle, sig->signal, SAMPLE_RATE);
68 if (sig->max < 0)
69 {
70 fprintf(stderr, " Error reading sound file '%s'\n", sig->name);
71 exit(2);
72 }
73 }
74 /*- End of function --------------------------------------------------------*/
75
76 static void signal_free(signal_source_t *sig)
77 {
78 if (sf_close(sig->handle) != 0)
79 {
80 fprintf(stderr, " Cannot close sound file '%s'\n", sig->name);
81 exit(2);
82 }
83 }
84 /*- End of function --------------------------------------------------------*/
85
86 static void signal_restart(signal_source_t *sig, float gain)
87 {
88 sig->cur = 0;
89 sig->gain = powf(10.0f, gain/20.0f);
90 }
91 /*- End of function --------------------------------------------------------*/
92
93 static int16_t signal_amp(signal_source_t *sig)
94 {
95 int16_t tx;
96
97 tx = sig->signal[sig->cur++]*sig->gain;
98 if (sig->cur >= sig->max)
99 sig->cur = 0;
100 return tx;
101 }
102 /*- End of function --------------------------------------------------------*/
103
104 int main(int argc, char *argv[])
105 {
106 int f;
107 int i;
108 int16_t amp[8000];
109 int16_t value;
110 int signal;
111 float power[10];
112 tone_gen_descriptor_t tone_desc;
113 tone_gen_state_t tone_state;
114 awgn_state_t noise_source;
115 fir32_state_t line_model_d2;
116 fir32_state_t line_model_d3;
117 fir32_state_t line_model_d4;
118 fir32_state_t line_model_d5;
119 fir32_state_t line_model_d6;
120 fir32_state_t line_model_d7;
121 fir32_state_t line_model_d8;
122 fir32_state_t line_model_d9;
123 fir_float_state_t level_measurement_bp;
124
125 signal_load(&local_css, "sound_c1_8k.wav");
126 signal_load(&far_css, "sound_c3_8k.wav");
127
128 fir32_create(&line_model_d2,
129 line_model_d2_coeffs,
130 sizeof(line_model_d2_coeffs)/sizeof(int32_t));
131 fir32_create(&line_model_d3,
132 line_model_d3_coeffs,
133 sizeof(line_model_d3_coeffs)/sizeof(int32_t));
134 fir32_create(&line_model_d4,
135 line_model_d4_coeffs,
136 sizeof(line_model_d4_coeffs)/sizeof(int32_t));
137 fir32_create(&line_model_d5,
138 line_model_d5_coeffs,
139 sizeof(line_model_d5_coeffs)/sizeof(int32_t));
140 fir32_create(&line_model_d6,
141 line_model_d6_coeffs,
142 sizeof(line_model_d6_coeffs)/sizeof(int32_t));
143 fir32_create(&line_model_d7,
144 line_model_d7_coeffs,
145 sizeof(line_model_d7_coeffs)/sizeof(int32_t));
146 fir32_create(&line_model_d8,
147 line_model_d8_coeffs,
148 sizeof(line_model_d8_coeffs)/sizeof(int32_t));
149 fir32_create(&line_model_d9,
150 line_model_d9_coeffs,
151 sizeof(line_model_d9_coeffs)/sizeof(int32_t));
152 fir_float_create(&level_measurement_bp,
153 level_measurement_bp_coeffs,
154 sizeof(level_measurement_bp_coeffs)/sizeof(float));
155
156 for (f = 10; f < 4000; f++)
157 {
158 make_tone_gen_descriptor(&tone_desc,
159 f,
160 -10,
161 0,
162 0,
163 1,
164 0,
165 0,
166 0,
167 TRUE);
168 tone_gen_init(&tone_state, &tone_desc);
169 tone_gen(&tone_state, amp, 8000);
170 for (i = 0; i < 10; i++)
171 power[i] = 0.0f;
172 for (i = 0; i < 800; i++)
173 {
174 signal = fir32(&line_model_d2, amp[i]);
175 power[0] += ((signal*signal - power[0])/32.0f);
176 signal = fir32(&line_model_d3, amp[i]);
177 power[1] += ((signal*signal - power[1])/32.0f);
178 signal = fir32(&line_model_d4, amp[i]);
179 power[2] += ((signal*signal - power[2])/32.0f);
180 signal = fir32(&line_model_d5, amp[i]);
181 power[3] += ((signal*signal - power[3])/32.0f);
182 signal = fir32(&line_model_d6, amp[i]);
183 power[4] += ((signal*signal - power[4])/32.0f);
184 signal = fir32(&line_model_d7, amp[i]);
185 power[5] += ((signal*signal - power[5])/32.0f);
186 signal = fir32(&line_model_d8, amp[i]);
187 power[6] += ((signal*signal - power[6])/32.0f);
188 signal = fir32(&line_model_d9, amp[i]);
189 power[7] += ((signal*signal - power[7])/32.0f);
190 signal = fir_float(&level_measurement_bp, amp[i]);
191 power[8] += ((signal*signal - power[8])/32.0f);
192 signal = amp[i];
193 power[9] += ((signal*signal - power[9])/32.0f);
194 }
195 printf("%d %f %f %f %f %f %f %f %f %f %f\n",
196 f,
197 sqrt(power[0])*LINE_MODEL_D2_GAIN,
198 sqrt(power[1])*LINE_MODEL_D3_GAIN,
199 sqrt(power[2])*LINE_MODEL_D4_GAIN,
200 sqrt(power[3])*LINE_MODEL_D5_GAIN,
201 sqrt(power[4])*LINE_MODEL_D6_GAIN,
202 sqrt(power[5])*LINE_MODEL_D7_GAIN,
203 sqrt(power[6])*LINE_MODEL_D8_GAIN,
204 sqrt(power[7])*LINE_MODEL_D9_GAIN,
205 sqrt(power[8]),
206 sqrt(power[9]));
207 }
208 awgn_init_dbm0(&noise_source, 1234567, -20.0f);
209 for (i = 0; i < 10; i++)
210 power[i] = 0.0f;
211 signal_restart(&local_css, 0.0f);
212 signal_restart(&far_css, 0.0f);
213 for (i = 0; i < SAMPLE_RATE; i++)
214 {
215 value = signal_amp(&local_css);
216 //value = awgn(&noise_source);
217 signal = fir32(&line_model_d2, value);
218 power[0] += ((signal*signal - power[0])/32.0f);
219 signal = fir32(&line_model_d3, value);
220 power[1] += ((signal*signal - power[1])/32.0f);
221 signal = fir32(&line_model_d4, value);
222 power[2] += ((signal*signal - power[2])/32.0f);
223 signal = fir32(&line_model_d5, value);
224 power[3] += ((signal*signal - power[3])/32.0f);
225 signal = fir32(&line_model_d6, value);
226 power[4] += ((signal*signal - power[4])/32.0f);
227 signal = fir32(&line_model_d7, value);
228 power[5] += ((signal*signal - power[5])/32.0f);
229 signal = fir32(&line_model_d8, value);
230 power[6] += ((signal*signal - power[6])/32.0f);
231 signal = fir32(&line_model_d9, value);
232 power[7] += ((signal*signal - power[7])/32.0f);
233 signal = fir_float(&level_measurement_bp, value);
234 power[8] += ((signal*signal - power[8])/32.0f);
235 signal = value;
236 power[9] += ((signal*signal - power[9])/32.0f);
237 }
238 for (i = 0; i < 10; i++)
239 power[i] = 0.0f;
240 for (i = 0; i < SAMPLE_RATE; i++)
241 {
242 value = signal_amp(&local_css);
243 //value = awgn(&noise_source);
244 signal = fir32(&line_model_d2, value);
245 power[0] += ((signal*signal - power[0])/32.0f);
246 signal = fir32(&line_model_d3, value);
247 power[1] += ((signal*signal - power[1])/32.0f);
248 signal = fir32(&line_model_d4, value);
249 power[2] += ((signal*signal - power[2])/32.0f);
250 signal = fir32(&line_model_d5, value);
251 power[3] += ((signal*signal - power[3])/32.0f);
252 signal = fir32(&line_model_d6, value);
253 power[4] += ((signal*signal - power[4])/32.0f);
254 signal = fir32(&line_model_d7, value);
255 power[5] += ((signal*signal - power[5])/32.0f);
256 signal = fir32(&line_model_d8, value);
257 power[6] += ((signal*signal - power[6])/32.0f);
258 signal = fir32(&line_model_d9, value);
259 power[7] += ((signal*signal - power[7])/32.0f);
260 signal = fir_float(&level_measurement_bp, value);
261 power[8] += ((signal*signal - power[8])/32.0f);
262 signal = value;
263 power[9] += ((signal*signal - power[9])/32.0f);
264 }
265 printf("%d %f %f %f %f %f %f %f %f %f %f\n",
266 0,
267 sqrt(power[0])*LINE_MODEL_D2_GAIN,
268 sqrt(power[1])*LINE_MODEL_D3_GAIN,
269 sqrt(power[2])*LINE_MODEL_D4_GAIN,
270 sqrt(power[3])*LINE_MODEL_D5_GAIN,
271 sqrt(power[4])*LINE_MODEL_D6_GAIN,
272 sqrt(power[5])*LINE_MODEL_D7_GAIN,
273 sqrt(power[6])*LINE_MODEL_D8_GAIN,
274 sqrt(power[7])*LINE_MODEL_D9_GAIN,
275 sqrt(power[8]),
276 sqrt(power[9]));
277 printf("%d %f %f %f %f %f %f %f %f %f %f\n",
278 0,
279 sqrt(power[0]),
280 sqrt(power[1]),
281 sqrt(power[2]),
282 sqrt(power[3]),
283 sqrt(power[4]),
284 sqrt(power[5]),
285 sqrt(power[6]),
286 sqrt(power[7]),
287 sqrt(power[8]),
288 sqrt(power[9]));
289 printf("%d %f %f %f %f %f %f %f %f %f %f\n",
290 0,
291 sqrt(power[0])/sqrt(power[9]),
292 sqrt(power[1])/sqrt(power[9]),
293 sqrt(power[2])/sqrt(power[9]),
294 sqrt(power[3])/sqrt(power[9]),
295 sqrt(power[4])/sqrt(power[9]),
296 sqrt(power[5])/sqrt(power[9]),
297 sqrt(power[6])/sqrt(power[9]),
298 sqrt(power[7])/sqrt(power[9]),
299 sqrt(power[8]),
300 sqrt(power[9]));
301 printf("%d %f %f %f %f %f %f %f %f %f %f\n",
302 0,
303 sqrt(power[0])*LINE_MODEL_D2_GAIN/sqrt(power[9]),
304 sqrt(power[1])*LINE_MODEL_D3_GAIN/sqrt(power[9]),
305 sqrt(power[2])*LINE_MODEL_D4_GAIN/sqrt(power[9]),
306 sqrt(power[3])*LINE_MODEL_D5_GAIN/sqrt(power[9]),
307 sqrt(power[4])*LINE_MODEL_D6_GAIN/sqrt(power[9]),
308 sqrt(power[5])*LINE_MODEL_D7_GAIN/sqrt(power[9]),
309 sqrt(power[6])*LINE_MODEL_D8_GAIN/sqrt(power[9]),
310 sqrt(power[7])*LINE_MODEL_D9_GAIN/sqrt(power[9]),
311 sqrt(power[8]),
312 sqrt(power[9]));
313
314 for (i = 0; i < (int) (sizeof(css_c1)/sizeof(css_c1[0])); i++)
315 printf("%d\n", css_c1[i]);
316 printf("\n");
317 for (i = 0; i < (int) (sizeof(css_c1)/sizeof(css_c3[0])); i++)
318 printf("%d\n", css_c3[i]);
319 signal_free(&local_css);
320 signal_free(&far_css);
321 return 0;
322 }
323 /*- End of function --------------------------------------------------------*/
324 /*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.