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 ------------------------------------------------------------*/ |
