comparison spandsp-0.0.3/spandsp-0.0.3/tests/power_meter_tests.c @ 5:f762bf195c4b

import spandsp-0.0.3
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 16:00:21 +0200
parents
children
comparison
equal deleted inserted replaced
4:26cd8f1ef0b1 5:f762bf195c4b
1 /*
2 * SpanDSP - a series of DSP components for telephony
3 *
4 * power_meter_tests.c
5 *
6 * Written by Steve Underwood <steveu@coppice.org>
7 *
8 * Copyright (C) 2003 Steve Underwood
9 *
10 * All rights reserved.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2, as
14 * published by the Free Software Foundation.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 *
25 * $Id: power_meter_tests.c,v 1.15 2006/11/24 12:34:55 steveu Exp $
26 */
27
28 /*! \page power_meter_tests_page Power meter tests
29 \section power_meter_tests_page_sec_1 What does it do?
30 These tests assess the accuracy of power meters built from the power meter module.
31 Both tones and noise are used to check the meter's behaviour.
32
33 \section power_meter_tests_page_sec_2 How does it work?
34 ???.
35 */
36
37 #ifdef HAVE_CONFIG_H
38 #include <config.h>
39 #endif
40
41 #include <stdlib.h>
42 #include <inttypes.h>
43 #include <stdio.h>
44 #include <memory.h>
45 #if defined(HAVE_TGMATH_H)
46 #include <tgmath.h>
47 #endif
48 #if defined(HAVE_MATH_H)
49 #include <math.h>
50 #endif
51 #include <time.h>
52 #include <tiffio.h>
53
54 #include "spandsp.h"
55
56 int main(int argc, char *argv[])
57 {
58 awgn_state_t noise_source;
59 power_meter_t meter;
60 tone_gen_descriptor_t tone_desc;
61 tone_gen_state_t gen;
62 int i;
63 int idum = 1234567;
64 int16_t amp[1000];
65 int len;
66 int32_t level;
67
68 power_meter_init(&meter, 7);
69
70 printf("Testing with a square wave 10dB from maximum\n");
71 for (i = 0; i < 1000; i++)
72 {
73 amp[i] = (i & 1) ? 10362 : -10362;
74 level = power_meter_update(&meter, amp[i]);
75 //printf("%12d %fdBm0 %fdBov\n", level, power_meter_dbm0(&meter), power_meter_dbov(&meter));
76 }
77 printf("Level: expected %" PRId32 "/%" PRId32 ", got %" PRId32 "\n", power_meter_level_dbov(-10.0f), power_meter_level_dbm0(-10.0f + DBM0_MAX_POWER), level);
78 printf("Power: expected %fdBm0, got %fdBm0\n", -10.0f + DBM0_MAX_POWER, power_meter_dbm0(&meter));
79 printf("Power: expected %fdBOv, got %fdBOv\n", -10.0f, power_meter_dbov(&meter));
80 if (level < power_meter_level_dbov(-10.0f)*0.99f
81 ||
82 level > power_meter_level_dbov(-10.0f)*1.01f)
83 {
84 printf("Test failed (level)\n");
85 exit(2);
86 }
87 if (0.1f < fabsf(power_meter_dbm0(&meter) + 10.0f - DBM0_MAX_POWER))
88 {
89 printf("Test failed (dBm0)\n");
90 exit(2);
91 }
92 if (0.1f < fabsf(power_meter_dbov(&meter) + 10.0))
93 {
94 printf("Test failed (dBOv)\n");
95 exit(2);
96 }
97
98 printf("Testing with a sine wave tone 10dB from maximum\n");
99 make_tone_gen_descriptor(&tone_desc,
100 1000,
101 -4,
102 0,
103 1,
104 1,
105 0,
106 0,
107 0,
108 TRUE);
109 tone_gen_init(&gen, &tone_desc);
110 len = tone_gen(&gen, amp, 1000);
111 for (i = 0; i < len; i++)
112 {
113 level = power_meter_update(&meter, amp[i]);
114 //printf("%12d %fdBm0 %fdBov\n", level, power_meter_dbm0(&meter), power_meter_dbov(&meter));
115 }
116 printf("Level: expected %" PRId32 "/%" PRId32 ", got %" PRId32 "\n", power_meter_level_dbov(-10.0f), power_meter_level_dbm0(-10.0f + DBM0_MAX_POWER), level);
117 printf("Power: expected %fdBm0, got %fdBm0\n", -10.0f + DBM0_MAX_POWER, power_meter_dbm0(&meter));
118 printf("Power: expected %fdBOv, got %fdBOv\n", -10.0f, power_meter_dbov(&meter));
119 if (level < power_meter_level_dbov(-10.0f)*0.95f
120 ||
121 level > power_meter_level_dbov(-10.0f)*1.05f)
122 {
123 printf("Test failed (level)\n");
124 exit(2);
125 }
126 if (0.2f < fabsf(power_meter_dbm0(&meter) + 10.0f - DBM0_MAX_POWER))
127 {
128 printf("Test failed (dBm0)\n");
129 exit(2);
130 }
131 if (0.2f < fabsf(power_meter_dbov(&meter) + 10.0))
132 {
133 printf("Test failed (dBOv)\n");
134 exit(2);
135 }
136
137 printf("Testing with AWGN 10dB from maximum\n");
138 awgn_init_dbov(&noise_source, idum, -10.0f);
139 for (i = 0; i < 1000; i++)
140 amp[i] = awgn(&noise_source);
141 for (i = 0; i < 1000; i++)
142 {
143 level = power_meter_update(&meter, amp[i]);
144 //printf("%12d %fdBm0 %fdBov\n", level, power_meter_dbm0(&meter), power_meter_dbov(&meter));
145 }
146 printf("Level: expected %" PRId32 "/%" PRId32 ", got %" PRId32 "\n", power_meter_level_dbov(-10.0f), power_meter_level_dbm0(-10.0f + DBM0_MAX_POWER), level);
147 printf("Power: expected %fdBm0, got %fdBm0\n", -10.0f + DBM0_MAX_POWER, power_meter_dbm0(&meter));
148 printf("Power: expected %fdBOv, got %fdBOv\n", -10.0f, power_meter_dbov(&meter));
149 if (level < power_meter_level_dbov(-10.0f)*0.95f
150 ||
151 level > power_meter_level_dbov(-10.0f)*1.05f)
152 {
153 printf("Test failed (level)\n");
154 exit(2);
155 }
156 if (0.2f < fabsf(power_meter_dbm0(&meter) + 10.0f - DBM0_MAX_POWER))
157 {
158 printf("Test failed (dBm0)\n");
159 exit(2);
160 }
161 if (0.2f < fabsf(power_meter_dbov(&meter) + 10.0f))
162 {
163 printf("Test failed (dBOv)\n");
164 exit(2);
165 }
166 printf("Tests passed\n");
167 return 0;
168 }
169 /*- End of function --------------------------------------------------------*/
170 /*- End of file ------------------------------------------------------------*/

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