aboutsummaryrefslogtreecommitdiff
path: root/src/comp_prim.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/comp_prim.h')
-rw-r--r--src/comp_prim.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/comp_prim.h b/src/comp_prim.h
new file mode 100644
index 0000000..e0166d3
--- /dev/null
+++ b/src/comp_prim.h
@@ -0,0 +1,138 @@
+/*---------------------------------------------------------------------------*\
+
+ FILE........: comp_prim.h
+ AUTHOR......: David Rowe
+ DATE CREATED: Marh 2015
+
+ Complex number maths primitives.
+
+\*---------------------------------------------------------------------------*/
+
+/*
+ Copyright (C) 2015 David Rowe
+
+ All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License version 2.1, as
+ published by the Free Software Foundation. This program is
+ distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __COMP_PRIM__
+#define __COMP_PRIM__
+
+#include <math.h>
+
+/*---------------------------------------------------------------------------*\
+
+ FUNCTIONS
+
+\*---------------------------------------------------------------------------*/
+
+inline static COMP cneg(COMP a) {
+ COMP res;
+
+ res.real = -a.real;
+ res.imag = -a.imag;
+
+ return res;
+}
+
+inline static COMP cconj(COMP a) {
+ COMP res;
+
+ res.real = a.real;
+ res.imag = -a.imag;
+
+ return res;
+}
+
+inline static COMP cmult(COMP a, COMP b) {
+ COMP res;
+
+ res.real = a.real * b.real - a.imag * b.imag;
+ res.imag = a.real * b.imag + a.imag * b.real;
+
+ return res;
+}
+
+inline static COMP fcmult(float a, COMP b) {
+ COMP res;
+
+ res.real = a * b.real;
+ res.imag = a * b.imag;
+
+ return res;
+}
+
+inline static COMP cadd(COMP a, COMP b) {
+ COMP res;
+
+ res.real = a.real + b.real;
+ res.imag = a.imag + b.imag;
+
+ return res;
+}
+
+inline static float cabsolute(COMP a) {
+ return sqrtf((a.real * a.real) + (a.imag * a.imag));
+}
+
+/*
+ * Euler's formula in a new convenient function
+ */
+inline static COMP comp_exp_j(float phi) {
+ COMP res;
+ res.real = cosf(phi);
+ res.imag = sinf(phi);
+ return res;
+}
+
+/*
+ * Quick and easy complex 0
+ */
+inline static COMP comp0() {
+ COMP res;
+ res.real = 0;
+ res.imag = 0;
+ return res;
+}
+
+/*
+ * Quick and easy complex subtract
+ */
+inline static COMP csub(COMP a, COMP b) {
+ COMP res;
+ res.real = a.real - b.real;
+ res.imag = a.imag - b.imag;
+ return res;
+}
+
+/*
+ * Compare the magnitude of a and b. if |a|>|b|, return true, otw false.
+ * This needs no square roots
+ */
+inline static int comp_mag_gt(COMP a, COMP b) {
+ return ((a.real * a.real) + (a.imag * a.imag)) >
+ ((b.real * b.real) + (b.imag * b.imag));
+}
+
+/*
+ * Normalize a complex number's magnitude to 1
+ */
+inline static COMP comp_normalize(COMP a) {
+ COMP b;
+ float av = cabsolute(a);
+ b.real = a.real / av;
+ b.imag = a.imag / av;
+ return b;
+}
+
+#endif