Mercurial > hg > audiostuff
comparison spandsp-0.0.3/spandsp-0.0.3/src/spandsp/complex.h @ 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 * complex.h | |
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: complex.h,v 1.8 2006/10/24 13:45:28 steveu Exp $ | |
26 */ | |
27 | |
28 /*! \file */ | |
29 | |
30 /*! \page complex_page Complex number support | |
31 \section complex_page_sec_1 What does it do? | |
32 Complex number support is part of the C99 standard. However, support for this | |
33 in C compilers is still patchy. A set of complex number feaures is provided as | |
34 a "temporary" measure, until native C language complex number support is | |
35 widespread. | |
36 */ | |
37 | |
38 #if !defined(_COMPLEX_H_) | |
39 #define _COMPLEX_H_ | |
40 | |
41 /*! | |
42 Floating complex type. | |
43 */ | |
44 typedef struct | |
45 { | |
46 float re; | |
47 float im; | |
48 } complexf_t; | |
49 | |
50 /*! | |
51 Floating complex type. | |
52 */ | |
53 typedef struct | |
54 { | |
55 double re; | |
56 double im; | |
57 } complex_t; | |
58 | |
59 #if defined(HAVE_LONG_DOUBLE) | |
60 /*! | |
61 Long double complex type. | |
62 */ | |
63 typedef struct | |
64 { | |
65 long double re; | |
66 long double im; | |
67 } complexl_t; | |
68 #endif | |
69 | |
70 /*! | |
71 Complex integer type. | |
72 */ | |
73 typedef struct | |
74 { | |
75 int re; | |
76 int im; | |
77 } icomplex_t; | |
78 | |
79 /*! | |
80 Complex 16 bit integer type. | |
81 */ | |
82 typedef struct | |
83 { | |
84 int16_t re; | |
85 int16_t im; | |
86 } i16complex_t; | |
87 | |
88 /*! | |
89 Complex 32 bit integer type. | |
90 */ | |
91 typedef struct | |
92 { | |
93 int32_t re; | |
94 int32_t im; | |
95 } i32complex_t; | |
96 | |
97 #ifdef __cplusplus | |
98 extern "C" { | |
99 #endif | |
100 | |
101 static __inline__ complexf_t complex_setf(float re, float im) | |
102 { | |
103 complexf_t z; | |
104 | |
105 z.re = re; | |
106 z.im = im; | |
107 return z; | |
108 } | |
109 /*- End of function --------------------------------------------------------*/ | |
110 | |
111 static __inline__ complex_t complex_set(float re, float im) | |
112 { | |
113 complex_t z; | |
114 | |
115 z.re = re; | |
116 z.im = im; | |
117 return z; | |
118 } | |
119 /*- End of function --------------------------------------------------------*/ | |
120 | |
121 #if defined(HAVE_LONG_DOUBLE) | |
122 static __inline__ complexl_t complex_setl(long double re, long double im) | |
123 { | |
124 complexl_t z; | |
125 | |
126 z.re = re; | |
127 z.im = im; | |
128 return z; | |
129 } | |
130 /*- End of function --------------------------------------------------------*/ | |
131 #endif | |
132 | |
133 static __inline__ icomplex_t icomplex_set(int re, int im) | |
134 { | |
135 icomplex_t z; | |
136 | |
137 z.re = re; | |
138 z.im = im; | |
139 return z; | |
140 } | |
141 /*- End of function --------------------------------------------------------*/ | |
142 | |
143 static __inline__ complexf_t complex_addf(const complexf_t *x, const complexf_t *y) | |
144 { | |
145 complexf_t z; | |
146 | |
147 z.re = x->re + y->re; | |
148 z.im = x->im + y->im; | |
149 return z; | |
150 } | |
151 /*- End of function --------------------------------------------------------*/ | |
152 | |
153 static __inline__ complex_t complex_add(const complex_t *x, const complex_t *y) | |
154 { | |
155 complex_t z; | |
156 | |
157 z.re = x->re + y->re; | |
158 z.im = x->im + y->im; | |
159 return z; | |
160 } | |
161 /*- End of function --------------------------------------------------------*/ | |
162 | |
163 #if defined(HAVE_LONG_DOUBLE) | |
164 static __inline__ complexl_t complex_addl(const complexl_t *x, const complexl_t *y) | |
165 { | |
166 complexl_t z; | |
167 | |
168 z.re = x->re + y->re; | |
169 z.im = x->im + y->im; | |
170 return z; | |
171 } | |
172 /*- End of function --------------------------------------------------------*/ | |
173 #endif | |
174 | |
175 static __inline__ icomplex_t icomplex_add(const icomplex_t *x, const icomplex_t *y) | |
176 { | |
177 icomplex_t z; | |
178 | |
179 z.re = x->re + y->re; | |
180 z.im = x->im + y->im; | |
181 return z; | |
182 } | |
183 /*- End of function --------------------------------------------------------*/ | |
184 | |
185 static __inline__ complexf_t complex_subf(const complexf_t *x, const complexf_t *y) | |
186 { | |
187 complexf_t z; | |
188 | |
189 z.re = x->re - y->re; | |
190 z.im = x->im - y->im; | |
191 return z; | |
192 } | |
193 /*- End of function --------------------------------------------------------*/ | |
194 | |
195 static __inline__ complex_t complex_sub(const complex_t *x, const complex_t *y) | |
196 { | |
197 complex_t z; | |
198 | |
199 z.re = x->re - y->re; | |
200 z.im = x->im - y->im; | |
201 return z; | |
202 } | |
203 /*- End of function --------------------------------------------------------*/ | |
204 | |
205 #if defined(HAVE_LONG_DOUBLE) | |
206 static __inline__ complexl_t complex_subl(const complexl_t *x, const complexl_t *y) | |
207 { | |
208 complexl_t z; | |
209 | |
210 z.re = x->re - y->re; | |
211 z.im = x->im - y->im; | |
212 return z; | |
213 } | |
214 /*- End of function --------------------------------------------------------*/ | |
215 #endif | |
216 | |
217 static __inline__ icomplex_t icomplex_sub(const icomplex_t *x, const icomplex_t *y) | |
218 { | |
219 icomplex_t z; | |
220 | |
221 z.re = x->re - y->re; | |
222 z.im = x->im - y->im; | |
223 return z; | |
224 } | |
225 /*- End of function --------------------------------------------------------*/ | |
226 | |
227 static __inline__ complexf_t complex_mulf(const complexf_t *x, const complexf_t *y) | |
228 { | |
229 complexf_t z; | |
230 | |
231 z.re = x->re*y->re - x->im*y->im; | |
232 z.im = x->re*y->im + x->im*y->re; | |
233 return z; | |
234 } | |
235 /*- End of function --------------------------------------------------------*/ | |
236 | |
237 static __inline__ complex_t complex_mul(const complex_t *x, const complex_t *y) | |
238 { | |
239 complex_t z; | |
240 | |
241 z.re = x->re*y->re - x->im*y->im; | |
242 z.im = x->re*y->im + x->im*y->re; | |
243 return z; | |
244 } | |
245 /*- End of function --------------------------------------------------------*/ | |
246 | |
247 #if defined(HAVE_LONG_DOUBLE) | |
248 static __inline__ complexl_t complex_mull(const complexl_t *x, const complexl_t *y) | |
249 { | |
250 complexl_t z; | |
251 | |
252 z.re = x->re*y->re - x->im*y->im; | |
253 z.im = x->re*y->im + x->im*y->re; | |
254 return z; | |
255 } | |
256 /*- End of function --------------------------------------------------------*/ | |
257 #endif | |
258 | |
259 static __inline__ complexf_t complex_divf(const complexf_t *x, const complexf_t *y) | |
260 { | |
261 complexf_t z; | |
262 float f; | |
263 | |
264 f = y->re*y->re + y->im*y->im; | |
265 z.re = ( x->re*y->re + x->im*y->im)/f; | |
266 z.im = (-x->re*y->im + x->im*y->re)/f; | |
267 return z; | |
268 } | |
269 /*- End of function --------------------------------------------------------*/ | |
270 | |
271 static __inline__ complex_t complex_div(const complex_t *x, const complex_t *y) | |
272 { | |
273 complex_t z; | |
274 double f; | |
275 | |
276 f = y->re*y->re + y->im*y->im; | |
277 z.re = ( x->re*y->re + x->im*y->im)/f; | |
278 z.im = (-x->re*y->im + x->im*y->re)/f; | |
279 return z; | |
280 } | |
281 /*- End of function --------------------------------------------------------*/ | |
282 | |
283 #if defined(HAVE_LONG_DOUBLE) | |
284 static __inline__ complexl_t complex_divl(const complexl_t *x, const complexl_t *y) | |
285 { | |
286 complexl_t z; | |
287 long double f; | |
288 | |
289 f = y->re*y->re + y->im*y->im; | |
290 z.re = ( x->re*y->re + x->im*y->im)/f; | |
291 z.im = (-x->re*y->im + x->im*y->re)/f; | |
292 return z; | |
293 } | |
294 /*- End of function --------------------------------------------------------*/ | |
295 #endif | |
296 | |
297 static __inline__ complexf_t complex_conjf(const complexf_t *x) | |
298 { | |
299 complexf_t z; | |
300 | |
301 z.re = x->re; | |
302 z.im = -x->im; | |
303 return z; | |
304 } | |
305 /*- End of function --------------------------------------------------------*/ | |
306 | |
307 static __inline__ complex_t complex_conj(const complex_t *x) | |
308 { | |
309 complex_t z; | |
310 | |
311 z.re = x->re; | |
312 z.im = -x->im; | |
313 return z; | |
314 } | |
315 /*- End of function --------------------------------------------------------*/ | |
316 | |
317 #if defined(HAVE_LONG_DOUBLE) | |
318 static __inline__ complexl_t complex_conjl(const complexl_t *x) | |
319 { | |
320 complexl_t z; | |
321 | |
322 z.re = x->re; | |
323 z.im = -x->im; | |
324 return z; | |
325 } | |
326 /*- End of function --------------------------------------------------------*/ | |
327 #endif | |
328 | |
329 static __inline__ icomplex_t icomplex_conj(const icomplex_t *x) | |
330 { | |
331 icomplex_t z; | |
332 | |
333 z.re = x->re; | |
334 z.im = -x->im; | |
335 return z; | |
336 } | |
337 /*- End of function --------------------------------------------------------*/ | |
338 | |
339 static __inline__ float powerf(const complexf_t *x) | |
340 { | |
341 return x->re*x->re + x->im*x->im; | |
342 } | |
343 /*- End of function --------------------------------------------------------*/ | |
344 | |
345 static __inline__ double power(const complex_t *x) | |
346 { | |
347 return x->re*x->re + x->im*x->im; | |
348 } | |
349 /*- End of function --------------------------------------------------------*/ | |
350 | |
351 #if defined(HAVE_LONG_DOUBLE) | |
352 static __inline__ long double powerl(const complexl_t *x) | |
353 { | |
354 return x->re*x->re + x->im*x->im; | |
355 } | |
356 /*- End of function --------------------------------------------------------*/ | |
357 #endif | |
358 | |
359 #ifdef __cplusplus | |
360 } | |
361 #endif | |
362 | |
363 #endif | |
364 /*- End of file ------------------------------------------------------------*/ |