Mercurial > hg > audiostuff
comparison spandsp-0.0.6pre17/src/spandsp/complex.h @ 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 * 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 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: complex.h,v 1.20 2009/02/21 05:39:08 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(_SPANDSP_COMPLEX_H_) | |
| 39 #define _SPANDSP_COMPLEX_H_ | |
| 40 | |
| 41 /*! | |
| 42 Floating complex type. | |
| 43 */ | |
| 44 typedef struct | |
| 45 { | |
| 46 /*! \brief Real part. */ | |
| 47 float re; | |
| 48 /*! \brief Imaginary part. */ | |
| 49 float im; | |
| 50 } complexf_t; | |
| 51 | |
| 52 /*! | |
| 53 Floating complex type. | |
| 54 */ | |
| 55 typedef struct | |
| 56 { | |
| 57 /*! \brief Real part. */ | |
| 58 double re; | |
| 59 /*! \brief Imaginary part. */ | |
| 60 double im; | |
| 61 } complex_t; | |
| 62 | |
| 63 #if defined(HAVE_LONG_DOUBLE) | |
| 64 /*! | |
| 65 Long double complex type. | |
| 66 */ | |
| 67 typedef struct | |
| 68 { | |
| 69 /*! \brief Real part. */ | |
| 70 long double re; | |
| 71 /*! \brief Imaginary part. */ | |
| 72 long double im; | |
| 73 } complexl_t; | |
| 74 #endif | |
| 75 | |
| 76 /*! | |
| 77 Complex integer type. | |
| 78 */ | |
| 79 typedef struct | |
| 80 { | |
| 81 /*! \brief Real part. */ | |
| 82 int re; | |
| 83 /*! \brief Imaginary part. */ | |
| 84 int im; | |
| 85 } complexi_t; | |
| 86 | |
| 87 /*! | |
| 88 Complex 16 bit integer type. | |
| 89 */ | |
| 90 typedef struct | |
| 91 { | |
| 92 /*! \brief Real part. */ | |
| 93 int16_t re; | |
| 94 /*! \brief Imaginary part. */ | |
| 95 int16_t im; | |
| 96 } complexi16_t; | |
| 97 | |
| 98 /*! | |
| 99 Complex 32 bit integer type. | |
| 100 */ | |
| 101 typedef struct | |
| 102 { | |
| 103 /*! \brief Real part. */ | |
| 104 int32_t re; | |
| 105 /*! \brief Imaginary part. */ | |
| 106 int32_t im; | |
| 107 } complexi32_t; | |
| 108 | |
| 109 #if defined(__cplusplus) | |
| 110 extern "C" | |
| 111 { | |
| 112 #endif | |
| 113 | |
| 114 static __inline__ complexf_t complex_setf(float re, float im) | |
| 115 { | |
| 116 complexf_t z; | |
| 117 | |
| 118 z.re = re; | |
| 119 z.im = im; | |
| 120 return z; | |
| 121 } | |
| 122 /*- End of function --------------------------------------------------------*/ | |
| 123 | |
| 124 static __inline__ complex_t complex_set(double re, double im) | |
| 125 { | |
| 126 complex_t z; | |
| 127 | |
| 128 z.re = re; | |
| 129 z.im = im; | |
| 130 return z; | |
| 131 } | |
| 132 /*- End of function --------------------------------------------------------*/ | |
| 133 | |
| 134 #if defined(HAVE_LONG_DOUBLE) | |
| 135 static __inline__ complexl_t complex_setl(long double re, long double im) | |
| 136 { | |
| 137 complexl_t z; | |
| 138 | |
| 139 z.re = re; | |
| 140 z.im = im; | |
| 141 return z; | |
| 142 } | |
| 143 /*- End of function --------------------------------------------------------*/ | |
| 144 #endif | |
| 145 | |
| 146 static __inline__ complexi_t complex_seti(int re, int im) | |
| 147 { | |
| 148 complexi_t z; | |
| 149 | |
| 150 z.re = re; | |
| 151 z.im = im; | |
| 152 return z; | |
| 153 } | |
| 154 /*- End of function --------------------------------------------------------*/ | |
| 155 | |
| 156 static __inline__ complexi16_t complex_seti16(int16_t re, int16_t im) | |
| 157 { | |
| 158 complexi16_t z; | |
| 159 | |
| 160 z.re = re; | |
| 161 z.im = im; | |
| 162 return z; | |
| 163 } | |
| 164 /*- End of function --------------------------------------------------------*/ | |
| 165 | |
| 166 static __inline__ complexi32_t complex_seti32(int32_t re, int32_t im) | |
| 167 { | |
| 168 complexi32_t z; | |
| 169 | |
| 170 z.re = re; | |
| 171 z.im = im; | |
| 172 return z; | |
| 173 } | |
| 174 /*- End of function --------------------------------------------------------*/ | |
| 175 | |
| 176 static __inline__ complexf_t complex_addf(const complexf_t *x, const complexf_t *y) | |
| 177 { | |
| 178 complexf_t z; | |
| 179 | |
| 180 z.re = x->re + y->re; | |
| 181 z.im = x->im + y->im; | |
| 182 return z; | |
| 183 } | |
| 184 /*- End of function --------------------------------------------------------*/ | |
| 185 | |
| 186 static __inline__ complex_t complex_add(const complex_t *x, const complex_t *y) | |
| 187 { | |
| 188 complex_t z; | |
| 189 | |
| 190 z.re = x->re + y->re; | |
| 191 z.im = x->im + y->im; | |
| 192 return z; | |
| 193 } | |
| 194 /*- End of function --------------------------------------------------------*/ | |
| 195 | |
| 196 #if defined(HAVE_LONG_DOUBLE) | |
| 197 static __inline__ complexl_t complex_addl(const complexl_t *x, const complexl_t *y) | |
| 198 { | |
| 199 complexl_t z; | |
| 200 | |
| 201 z.re = x->re + y->re; | |
| 202 z.im = x->im + y->im; | |
| 203 return z; | |
| 204 } | |
| 205 /*- End of function --------------------------------------------------------*/ | |
| 206 #endif | |
| 207 | |
| 208 static __inline__ complexi_t complex_addi(const complexi_t *x, const complexi_t *y) | |
| 209 { | |
| 210 complexi_t z; | |
| 211 | |
| 212 z.re = x->re + y->re; | |
| 213 z.im = x->im + y->im; | |
| 214 return z; | |
| 215 } | |
| 216 /*- End of function --------------------------------------------------------*/ | |
| 217 | |
| 218 static __inline__ complexi16_t complex_addi16(const complexi16_t *x, const complexi16_t *y) | |
| 219 { | |
| 220 complexi16_t z; | |
| 221 | |
| 222 z.re = x->re + y->re; | |
| 223 z.im = x->im + y->im; | |
| 224 return z; | |
| 225 } | |
| 226 /*- End of function --------------------------------------------------------*/ | |
| 227 | |
| 228 static __inline__ complexi32_t complex_addi32(const complexi32_t *x, const complexi32_t *y) | |
| 229 { | |
| 230 complexi32_t z; | |
| 231 | |
| 232 z.re = x->re + y->re; | |
| 233 z.im = x->im + y->im; | |
| 234 return z; | |
| 235 } | |
| 236 /*- End of function --------------------------------------------------------*/ | |
| 237 | |
| 238 static __inline__ complexf_t complex_subf(const complexf_t *x, const complexf_t *y) | |
| 239 { | |
| 240 complexf_t z; | |
| 241 | |
| 242 z.re = x->re - y->re; | |
| 243 z.im = x->im - y->im; | |
| 244 return z; | |
| 245 } | |
| 246 /*- End of function --------------------------------------------------------*/ | |
| 247 | |
| 248 static __inline__ complex_t complex_sub(const complex_t *x, const complex_t *y) | |
| 249 { | |
| 250 complex_t z; | |
| 251 | |
| 252 z.re = x->re - y->re; | |
| 253 z.im = x->im - y->im; | |
| 254 return z; | |
| 255 } | |
| 256 /*- End of function --------------------------------------------------------*/ | |
| 257 | |
| 258 #if defined(HAVE_LONG_DOUBLE) | |
| 259 static __inline__ complexl_t complex_subl(const complexl_t *x, const complexl_t *y) | |
| 260 { | |
| 261 complexl_t z; | |
| 262 | |
| 263 z.re = x->re - y->re; | |
| 264 z.im = x->im - y->im; | |
| 265 return z; | |
| 266 } | |
| 267 /*- End of function --------------------------------------------------------*/ | |
| 268 #endif | |
| 269 | |
| 270 static __inline__ complexi_t complex_subi(const complexi_t *x, const complexi_t *y) | |
| 271 { | |
| 272 complexi_t z; | |
| 273 | |
| 274 z.re = x->re - y->re; | |
| 275 z.im = x->im - y->im; | |
| 276 return z; | |
| 277 } | |
| 278 /*- End of function --------------------------------------------------------*/ | |
| 279 | |
| 280 static __inline__ complexi16_t complex_subi16(const complexi16_t *x, const complexi16_t *y) | |
| 281 { | |
| 282 complexi16_t z; | |
| 283 | |
| 284 z.re = x->re - y->re; | |
| 285 z.im = x->im - y->im; | |
| 286 return z; | |
| 287 } | |
| 288 /*- End of function --------------------------------------------------------*/ | |
| 289 | |
| 290 static __inline__ complexi32_t complex_subi32(const complexi32_t *x, const complexi32_t *y) | |
| 291 { | |
| 292 complexi32_t z; | |
| 293 | |
| 294 z.re = x->re - y->re; | |
| 295 z.im = x->im - y->im; | |
| 296 return z; | |
| 297 } | |
| 298 /*- End of function --------------------------------------------------------*/ | |
| 299 | |
| 300 static __inline__ complexf_t complex_mulf(const complexf_t *x, const complexf_t *y) | |
| 301 { | |
| 302 complexf_t z; | |
| 303 | |
| 304 z.re = x->re*y->re - x->im*y->im; | |
| 305 z.im = x->re*y->im + x->im*y->re; | |
| 306 return z; | |
| 307 } | |
| 308 /*- End of function --------------------------------------------------------*/ | |
| 309 | |
| 310 static __inline__ complex_t complex_mul(const complex_t *x, const complex_t *y) | |
| 311 { | |
| 312 complex_t z; | |
| 313 | |
| 314 z.re = x->re*y->re - x->im*y->im; | |
| 315 z.im = x->re*y->im + x->im*y->re; | |
| 316 return z; | |
| 317 } | |
| 318 /*- End of function --------------------------------------------------------*/ | |
| 319 | |
| 320 #if defined(HAVE_LONG_DOUBLE) | |
| 321 static __inline__ complexl_t complex_mull(const complexl_t *x, const complexl_t *y) | |
| 322 { | |
| 323 complexl_t z; | |
| 324 | |
| 325 z.re = x->re*y->re - x->im*y->im; | |
| 326 z.im = x->re*y->im + x->im*y->re; | |
| 327 return z; | |
| 328 } | |
| 329 /*- End of function --------------------------------------------------------*/ | |
| 330 #endif | |
| 331 | |
| 332 static __inline__ complexi_t complex_muli(const complexi_t *x, const complexi_t *y) | |
| 333 { | |
| 334 complexi_t z; | |
| 335 | |
| 336 z.re = x->re*y->re - x->im*y->im; | |
| 337 z.im = x->re*y->im + x->im*y->re; | |
| 338 return z; | |
| 339 } | |
| 340 /*- End of function --------------------------------------------------------*/ | |
| 341 | |
| 342 static __inline__ complexi16_t complex_muli16(const complexi16_t *x, const complexi16_t *y) | |
| 343 { | |
| 344 complexi16_t z; | |
| 345 | |
| 346 z.re = (int16_t) ((int32_t) x->re*(int32_t) y->re - (int32_t) x->im*(int32_t) y->im); | |
| 347 z.im = (int16_t) ((int32_t) x->re*(int32_t) y->im + (int32_t) x->im*(int32_t) y->re); | |
| 348 return z; | |
| 349 } | |
| 350 /*- End of function --------------------------------------------------------*/ | |
| 351 | |
| 352 static __inline__ complexi16_t complex_mul_q1_15(const complexi16_t *x, const complexi16_t *y) | |
| 353 { | |
| 354 complexi16_t z; | |
| 355 | |
| 356 z.re = (int16_t) (((int32_t) x->re*(int32_t) y->re - (int32_t) x->im*(int32_t) y->im) >> 15); | |
| 357 z.im = (int16_t) (((int32_t) x->re*(int32_t) y->im + (int32_t) x->im*(int32_t) y->re) >> 15); | |
| 358 return z; | |
| 359 } | |
| 360 /*- End of function --------------------------------------------------------*/ | |
| 361 | |
| 362 static __inline__ complexi32_t complex_muli32i16(const complexi32_t *x, const complexi16_t *y) | |
| 363 { | |
| 364 complexi32_t z; | |
| 365 | |
| 366 z.re = x->re*(int32_t) y->re - x->im*(int32_t) y->im; | |
| 367 z.im = x->re*(int32_t) y->im + x->im*(int32_t) y->re; | |
| 368 return z; | |
| 369 } | |
| 370 /*- End of function --------------------------------------------------------*/ | |
| 371 | |
| 372 static __inline__ complexi32_t complex_muli32(const complexi32_t *x, const complexi32_t *y) | |
| 373 { | |
| 374 complexi32_t z; | |
| 375 | |
| 376 z.re = x->re*y->re - x->im*y->im; | |
| 377 z.im = x->re*y->im + x->im*y->re; | |
| 378 return z; | |
| 379 } | |
| 380 /*- End of function --------------------------------------------------------*/ | |
| 381 | |
| 382 static __inline__ complexf_t complex_divf(const complexf_t *x, const complexf_t *y) | |
| 383 { | |
| 384 complexf_t z; | |
| 385 float f; | |
| 386 | |
| 387 f = y->re*y->re + y->im*y->im; | |
| 388 z.re = ( x->re*y->re + x->im*y->im)/f; | |
| 389 z.im = (-x->re*y->im + x->im*y->re)/f; | |
| 390 return z; | |
| 391 } | |
| 392 /*- End of function --------------------------------------------------------*/ | |
| 393 | |
| 394 static __inline__ complex_t complex_div(const complex_t *x, const complex_t *y) | |
| 395 { | |
| 396 complex_t z; | |
| 397 double f; | |
| 398 | |
| 399 f = y->re*y->re + y->im*y->im; | |
| 400 z.re = ( x->re*y->re + x->im*y->im)/f; | |
| 401 z.im = (-x->re*y->im + x->im*y->re)/f; | |
| 402 return z; | |
| 403 } | |
| 404 /*- End of function --------------------------------------------------------*/ | |
| 405 | |
| 406 #if defined(HAVE_LONG_DOUBLE) | |
| 407 static __inline__ complexl_t complex_divl(const complexl_t *x, const complexl_t *y) | |
| 408 { | |
| 409 complexl_t z; | |
| 410 long double f; | |
| 411 | |
| 412 f = y->re*y->re + y->im*y->im; | |
| 413 z.re = ( x->re*y->re + x->im*y->im)/f; | |
| 414 z.im = (-x->re*y->im + x->im*y->re)/f; | |
| 415 return z; | |
| 416 } | |
| 417 /*- End of function --------------------------------------------------------*/ | |
| 418 #endif | |
| 419 | |
| 420 static __inline__ complexf_t complex_conjf(const complexf_t *x) | |
| 421 { | |
| 422 complexf_t z; | |
| 423 | |
| 424 z.re = x->re; | |
| 425 z.im = -x->im; | |
| 426 return z; | |
| 427 } | |
| 428 /*- End of function --------------------------------------------------------*/ | |
| 429 | |
| 430 static __inline__ complex_t complex_conj(const complex_t *x) | |
| 431 { | |
| 432 complex_t z; | |
| 433 | |
| 434 z.re = x->re; | |
| 435 z.im = -x->im; | |
| 436 return z; | |
| 437 } | |
| 438 /*- End of function --------------------------------------------------------*/ | |
| 439 | |
| 440 #if defined(HAVE_LONG_DOUBLE) | |
| 441 static __inline__ complexl_t complex_conjl(const complexl_t *x) | |
| 442 { | |
| 443 complexl_t z; | |
| 444 | |
| 445 z.re = x->re; | |
| 446 z.im = -x->im; | |
| 447 return z; | |
| 448 } | |
| 449 /*- End of function --------------------------------------------------------*/ | |
| 450 #endif | |
| 451 | |
| 452 static __inline__ complexi_t complex_conji(const complexi_t *x) | |
| 453 { | |
| 454 complexi_t z; | |
| 455 | |
| 456 z.re = x->re; | |
| 457 z.im = -x->im; | |
| 458 return z; | |
| 459 } | |
| 460 /*- End of function --------------------------------------------------------*/ | |
| 461 | |
| 462 static __inline__ complexi16_t complex_conji16(const complexi16_t *x) | |
| 463 { | |
| 464 complexi16_t z; | |
| 465 | |
| 466 z.re = x->re; | |
| 467 z.im = -x->im; | |
| 468 return z; | |
| 469 } | |
| 470 /*- End of function --------------------------------------------------------*/ | |
| 471 | |
| 472 static __inline__ complexi32_t complex_conji32(const complexi32_t *x) | |
| 473 { | |
| 474 complexi32_t z; | |
| 475 | |
| 476 z.re = x->re; | |
| 477 z.im = -x->im; | |
| 478 return z; | |
| 479 } | |
| 480 /*- End of function --------------------------------------------------------*/ | |
| 481 | |
| 482 static __inline__ float powerf(const complexf_t *x) | |
| 483 { | |
| 484 return x->re*x->re + x->im*x->im; | |
| 485 } | |
| 486 /*- End of function --------------------------------------------------------*/ | |
| 487 | |
| 488 static __inline__ double power(const complex_t *x) | |
| 489 { | |
| 490 return x->re*x->re + x->im*x->im; | |
| 491 } | |
| 492 /*- End of function --------------------------------------------------------*/ | |
| 493 | |
| 494 #if defined(HAVE_LONG_DOUBLE) | |
| 495 static __inline__ long double powerl(const complexl_t *x) | |
| 496 { | |
| 497 return x->re*x->re + x->im*x->im; | |
| 498 } | |
| 499 /*- End of function --------------------------------------------------------*/ | |
| 500 #endif | |
| 501 | |
| 502 #if defined(__cplusplus) | |
| 503 } | |
| 504 #endif | |
| 505 | |
| 506 #endif | |
| 507 /*- End of file ------------------------------------------------------------*/ |
