comparison spandsp-0.0.6pre17/src/dds_int.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 * dds.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 Lesser General Public License version 2.1,
14 * as 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 Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 *
25 * $Id: dds_int.c,v 1.16 2009/02/21 04:27:46 steveu Exp $
26 */
27
28 /*! \file */
29
30 #if defined(HAVE_CONFIG_H)
31 #include "config.h"
32 #endif
33
34 #include <inttypes.h>
35 #if defined(HAVE_TGMATH_H)
36 #include <tgmath.h>
37 #endif
38 #if defined(HAVE_MATH_H)
39 #include <math.h>
40 #endif
41 #include "floating_fudge.h"
42
43 #include "spandsp/telephony.h"
44 #include "spandsp/complex.h"
45 #include "spandsp/dds.h"
46
47 #if !defined(M_PI)
48 # define M_PI 3.14159265358979323846 /* pi */
49 #endif
50
51 /* In a A-law or u-law channel, a 128 step sine table is adequate to keep the spectral
52 mess due to the DDS at a similar level to the spectral mess due to the A-law or u-law
53 compression. */
54 #define SLENK 7
55 #define DDS_STEPS (1 << SLENK)
56 #define DDS_SHIFT (32 - 2 - SLENK)
57
58 /* This is a simple set of direct digital synthesis (DDS) functions to generate sine
59 waves. This version uses a 128 entry sin/cos table to cover one quadrant. */
60
61 static const int16_t sine_table[DDS_STEPS] =
62 {
63 201,
64 603,
65 1005,
66 1407,
67 1809,
68 2210,
69 2611,
70 3012,
71 3412,
72 3812,
73 4211,
74 4609,
75 5007,
76 5404,
77 5800,
78 6195,
79 6590,
80 6983,
81 7376,
82 7767,
83 8157,
84 8546,
85 8933,
86 9319,
87 9704,
88 10088,
89 10469,
90 10850,
91 11228,
92 11605,
93 11980,
94 12354,
95 12725,
96 13095,
97 13463,
98 13828,
99 14192,
100 14553,
101 14912,
102 15269,
103 15624,
104 15976,
105 16326,
106 16673,
107 17018,
108 17361,
109 17700,
110 18037,
111 18372,
112 18703,
113 19032,
114 19358,
115 19681,
116 20001,
117 20318,
118 20632,
119 20943,
120 21251,
121 21555,
122 21856,
123 22154,
124 22449,
125 22740,
126 23028,
127 23312,
128 23593,
129 23870,
130 24144,
131 24414,
132 24680,
133 24943,
134 25202,
135 25457,
136 25708,
137 25956,
138 26199,
139 26439,
140 26674,
141 26906,
142 27133,
143 27357,
144 27576,
145 27791,
146 28002,
147 28209,
148 28411,
149 28610,
150 28803,
151 28993,
152 29178,
153 29359,
154 29535,
155 29707,
156 29875,
157 30038,
158 30196,
159 30350,
160 30499,
161 30644,
162 30784,
163 30920,
164 31050,
165 31177,
166 31298,
167 31415,
168 31527,
169 31634,
170 31737,
171 31834,
172 31927,
173 32015,
174 32099,
175 32177,
176 32251,
177 32319,
178 32383,
179 32442,
180 32496,
181 32546,
182 32590,
183 32629,
184 32664,
185 32693,
186 32718,
187 32738,
188 32753,
189 32762,
190 32767,
191 };
192
193 SPAN_DECLARE(int32_t) dds_phase_rate(float frequency)
194 {
195 return (int32_t) (frequency*65536.0f*65536.0f/SAMPLE_RATE);
196 }
197 /*- End of function --------------------------------------------------------*/
198
199 SPAN_DECLARE(float) dds_frequency(int32_t phase_rate)
200 {
201 return (float) phase_rate*(float) SAMPLE_RATE/(65536.0f*65536.0f);
202 }
203 /*- End of function --------------------------------------------------------*/
204
205 SPAN_DECLARE(int16_t) dds_scaling_dbm0(float level)
206 {
207 return (int16_t) (powf(10.0f, (level - DBM0_MAX_SINE_POWER)/20.0f)*32767.0f);
208 }
209 /*- End of function --------------------------------------------------------*/
210
211 SPAN_DECLARE(int16_t) dds_scaling_dbov(float level)
212 {
213 return (int16_t) (powf(10.0f, (level - DBOV_MAX_SINE_POWER)/20.0f)*32767.0f);
214 }
215 /*- End of function --------------------------------------------------------*/
216
217 SPAN_DECLARE(int16_t) dds_lookup(uint32_t phase)
218 {
219 uint32_t step;
220 int16_t amp;
221
222 phase >>= DDS_SHIFT;
223 step = phase & (DDS_STEPS - 1);
224 if ((phase & DDS_STEPS))
225 step = (DDS_STEPS - 1) - step;
226 amp = sine_table[step];
227 if ((phase & (2*DDS_STEPS)))
228 amp = -amp;
229 return amp;
230 }
231 /*- End of function --------------------------------------------------------*/
232
233 SPAN_DECLARE(int16_t) dds_offset(uint32_t phase_acc, int32_t phase_offset)
234 {
235 return dds_lookup(phase_acc + phase_offset);
236 }
237 /*- End of function --------------------------------------------------------*/
238
239 SPAN_DECLARE(void) dds_advance(uint32_t *phase_acc, int32_t phase_rate)
240 {
241 *phase_acc += phase_rate;
242 }
243 /*- End of function --------------------------------------------------------*/
244
245 SPAN_DECLARE(int16_t) dds(uint32_t *phase_acc, int32_t phase_rate)
246 {
247 int16_t amp;
248
249 amp = dds_lookup(*phase_acc);
250 *phase_acc += phase_rate;
251 return amp;
252 }
253 /*- End of function --------------------------------------------------------*/
254
255 SPAN_DECLARE(int16_t) dds_mod(uint32_t *phase_acc, int32_t phase_rate, int16_t scale, int32_t phase)
256 {
257 int16_t amp;
258
259 amp = (int16_t) (((int32_t) dds_lookup(*phase_acc + phase)*(int32_t) scale) >> 15);
260 *phase_acc += phase_rate;
261 return amp;
262 }
263 /*- End of function --------------------------------------------------------*/
264
265 SPAN_DECLARE(complexi_t) dds_lookup_complexi(uint32_t phase)
266 {
267 return complex_seti(dds_lookup(phase + (1 << 30)), dds_lookup(phase));
268 }
269 /*- End of function --------------------------------------------------------*/
270
271 SPAN_DECLARE(complexi_t) dds_complexi(uint32_t *phase_acc, int32_t phase_rate)
272 {
273 complexi_t amp;
274
275 amp = complex_seti(dds_lookup(*phase_acc + (1 << 30)), dds_lookup(*phase_acc));
276 *phase_acc += phase_rate;
277 return amp;
278 }
279 /*- End of function --------------------------------------------------------*/
280
281 SPAN_DECLARE(complexi_t) dds_complexi_mod(uint32_t *phase_acc, int32_t phase_rate, int16_t scale, int32_t phase)
282 {
283 complexi_t amp;
284
285 amp = complex_seti(((int32_t) dds_lookup(*phase_acc + phase + (1 << 30))*(int32_t) scale) >> 15,
286 ((int32_t) dds_lookup(*phase_acc + phase)*(int32_t) scale) >> 15);
287 *phase_acc += phase_rate;
288 return amp;
289 }
290 /*- End of function --------------------------------------------------------*/
291
292 SPAN_DECLARE(complexi16_t) dds_lookup_complexi16(uint32_t phase)
293 {
294 return complex_seti16(dds_lookup(phase + (1 << 30)), dds_lookup(phase));
295 }
296 /*- End of function --------------------------------------------------------*/
297
298 SPAN_DECLARE(complexi16_t) dds_complexi16(uint32_t *phase_acc, int32_t phase_rate)
299 {
300 complexi16_t amp;
301
302 amp = complex_seti16(dds_lookup(*phase_acc + (1 << 30)), dds_lookup(*phase_acc));
303 *phase_acc += phase_rate;
304 return amp;
305 }
306 /*- End of function --------------------------------------------------------*/
307
308 SPAN_DECLARE(complexi16_t) dds_complexi16_mod(uint32_t *phase_acc, int32_t phase_rate, int16_t scale, int32_t phase)
309 {
310 complexi16_t amp;
311
312 amp = complex_seti16((int16_t) (((int32_t) dds_lookup(*phase_acc + phase + (1 << 30))*(int32_t) scale) >> 15),
313 (int16_t) (((int32_t) dds_lookup(*phase_acc + phase)*(int32_t) scale) >> 15));
314 *phase_acc += phase_rate;
315 return amp;
316 }
317 /*- End of function --------------------------------------------------------*/
318
319 SPAN_DECLARE(complexi32_t) dds_lookup_complexi32(uint32_t phase)
320 {
321 return complex_seti32(dds_lookup(phase + (1 << 30)), dds_lookup(phase));
322 }
323 /*- End of function --------------------------------------------------------*/
324
325 SPAN_DECLARE(complexi32_t) dds_complexi32(uint32_t *phase_acc, int32_t phase_rate)
326 {
327 complexi32_t amp;
328
329 amp = complex_seti32(dds_lookup(*phase_acc + (1 << 30)), dds_lookup(*phase_acc));
330 *phase_acc += phase_rate;
331 return amp;
332 }
333 /*- End of function --------------------------------------------------------*/
334
335 SPAN_DECLARE(complexi32_t) dds_complexi32_mod(uint32_t *phase_acc, int32_t phase_rate, int16_t scale, int32_t phase)
336 {
337 complexi32_t amp;
338
339 amp = complex_seti32(((int32_t) dds_lookup(*phase_acc + phase + (1 << 30))*(int32_t) scale) >> 15,
340 ((int32_t) dds_lookup(*phase_acc + phase)*(int32_t) scale) >> 15);
341 *phase_acc += phase_rate;
342 return amp;
343 }
344 /*- End of function --------------------------------------------------------*/
345 /*- End of file ------------------------------------------------------------*/

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