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