Mercurial > hg > audiostuff
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 ------------------------------------------------------------*/ |