Dependencies: DMSupport DMemWin
embedded/complex.h@0:08606a13a816, 2016-06-02 (annotated)
- Committer:
- destinyXfate
- Date:
- Thu Jun 02 05:04:57 2016 +0000
- Revision:
- 0:08606a13a816
;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
destinyXfate | 0:08606a13a816 | 1 | #ifndef _COMPLEX_H_ |
destinyXfate | 0:08606a13a816 | 2 | #define _COMPLEX_H_ |
destinyXfate | 0:08606a13a816 | 3 | |
destinyXfate | 0:08606a13a816 | 4 | #include "mbed.h" |
destinyXfate | 0:08606a13a816 | 5 | |
destinyXfate | 0:08606a13a816 | 6 | class complex |
destinyXfate | 0:08606a13a816 | 7 | { |
destinyXfate | 0:08606a13a816 | 8 | protected: |
destinyXfate | 0:08606a13a816 | 9 | // Internal presentation - real and imaginary parts |
destinyXfate | 0:08606a13a816 | 10 | double m_re; |
destinyXfate | 0:08606a13a816 | 11 | double m_im; |
destinyXfate | 0:08606a13a816 | 12 | |
destinyXfate | 0:08606a13a816 | 13 | public: |
destinyXfate | 0:08606a13a816 | 14 | // Imaginary unity |
destinyXfate | 0:08606a13a816 | 15 | static const complex i; |
destinyXfate | 0:08606a13a816 | 16 | static const complex j; |
destinyXfate | 0:08606a13a816 | 17 | |
destinyXfate | 0:08606a13a816 | 18 | // Constructors |
destinyXfate | 0:08606a13a816 | 19 | complex(): m_re(0.), m_im(0.) {} |
destinyXfate | 0:08606a13a816 | 20 | complex(double re, double im): m_re(re), m_im(im) {} |
destinyXfate | 0:08606a13a816 | 21 | complex(double val): m_re(val), m_im(0.) {} |
destinyXfate | 0:08606a13a816 | 22 | |
destinyXfate | 0:08606a13a816 | 23 | // Assignment |
destinyXfate | 0:08606a13a816 | 24 | complex& operator= (const double val) |
destinyXfate | 0:08606a13a816 | 25 | { |
destinyXfate | 0:08606a13a816 | 26 | m_re = val; |
destinyXfate | 0:08606a13a816 | 27 | m_im = 0.; |
destinyXfate | 0:08606a13a816 | 28 | return *this; |
destinyXfate | 0:08606a13a816 | 29 | } |
destinyXfate | 0:08606a13a816 | 30 | |
destinyXfate | 0:08606a13a816 | 31 | // Basic operations - taking parts |
destinyXfate | 0:08606a13a816 | 32 | double re() const { return m_re; } |
destinyXfate | 0:08606a13a816 | 33 | double im() const { return m_im; } |
destinyXfate | 0:08606a13a816 | 34 | |
destinyXfate | 0:08606a13a816 | 35 | // Conjugate number |
destinyXfate | 0:08606a13a816 | 36 | complex conjugate() const |
destinyXfate | 0:08606a13a816 | 37 | { |
destinyXfate | 0:08606a13a816 | 38 | return complex(m_re, -m_im); |
destinyXfate | 0:08606a13a816 | 39 | } |
destinyXfate | 0:08606a13a816 | 40 | |
destinyXfate | 0:08606a13a816 | 41 | // Norm |
destinyXfate | 0:08606a13a816 | 42 | double norm() const |
destinyXfate | 0:08606a13a816 | 43 | { |
destinyXfate | 0:08606a13a816 | 44 | return m_re * m_re + m_im * m_im; |
destinyXfate | 0:08606a13a816 | 45 | } |
destinyXfate | 0:08606a13a816 | 46 | |
destinyXfate | 0:08606a13a816 | 47 | // Arithmetic operations |
destinyXfate | 0:08606a13a816 | 48 | complex operator+ (const complex& other) const |
destinyXfate | 0:08606a13a816 | 49 | { |
destinyXfate | 0:08606a13a816 | 50 | return complex(m_re + other.m_re, m_im + other.m_im); |
destinyXfate | 0:08606a13a816 | 51 | } |
destinyXfate | 0:08606a13a816 | 52 | |
destinyXfate | 0:08606a13a816 | 53 | complex operator- (const complex& other) const |
destinyXfate | 0:08606a13a816 | 54 | { |
destinyXfate | 0:08606a13a816 | 55 | return complex(m_re - other.m_re, m_im - other.m_im); |
destinyXfate | 0:08606a13a816 | 56 | } |
destinyXfate | 0:08606a13a816 | 57 | |
destinyXfate | 0:08606a13a816 | 58 | complex operator* (const complex& other) const |
destinyXfate | 0:08606a13a816 | 59 | { |
destinyXfate | 0:08606a13a816 | 60 | return complex(m_re * other.m_re - m_im * other.m_im, |
destinyXfate | 0:08606a13a816 | 61 | m_re * other.m_im + m_im * other.m_re); |
destinyXfate | 0:08606a13a816 | 62 | } |
destinyXfate | 0:08606a13a816 | 63 | |
destinyXfate | 0:08606a13a816 | 64 | complex operator/ (const complex& other) const |
destinyXfate | 0:08606a13a816 | 65 | { |
destinyXfate | 0:08606a13a816 | 66 | const double denominator = other.m_re * other.m_re + other.m_im * other.m_im; |
destinyXfate | 0:08606a13a816 | 67 | return complex((m_re * other.m_re + m_im * other.m_im) / denominator, |
destinyXfate | 0:08606a13a816 | 68 | (m_im * other.m_re - m_re * other.m_im) / denominator); |
destinyXfate | 0:08606a13a816 | 69 | } |
destinyXfate | 0:08606a13a816 | 70 | |
destinyXfate | 0:08606a13a816 | 71 | complex& operator+= (const complex& other) |
destinyXfate | 0:08606a13a816 | 72 | { |
destinyXfate | 0:08606a13a816 | 73 | m_re += other.m_re; |
destinyXfate | 0:08606a13a816 | 74 | m_im += other.m_im; |
destinyXfate | 0:08606a13a816 | 75 | return *this; |
destinyXfate | 0:08606a13a816 | 76 | } |
destinyXfate | 0:08606a13a816 | 77 | |
destinyXfate | 0:08606a13a816 | 78 | complex& operator-= (const complex& other) |
destinyXfate | 0:08606a13a816 | 79 | { |
destinyXfate | 0:08606a13a816 | 80 | m_re -= other.m_re; |
destinyXfate | 0:08606a13a816 | 81 | m_im -= other.m_im; |
destinyXfate | 0:08606a13a816 | 82 | return *this; |
destinyXfate | 0:08606a13a816 | 83 | } |
destinyXfate | 0:08606a13a816 | 84 | |
destinyXfate | 0:08606a13a816 | 85 | complex& operator*= (const complex& other) |
destinyXfate | 0:08606a13a816 | 86 | { |
destinyXfate | 0:08606a13a816 | 87 | const double temp = m_re; |
destinyXfate | 0:08606a13a816 | 88 | m_re = m_re * other.m_re - m_im * other.m_im; |
destinyXfate | 0:08606a13a816 | 89 | m_im = m_im * other.m_re + temp * other.m_im; |
destinyXfate | 0:08606a13a816 | 90 | return *this; |
destinyXfate | 0:08606a13a816 | 91 | } |
destinyXfate | 0:08606a13a816 | 92 | |
destinyXfate | 0:08606a13a816 | 93 | complex& operator/= (const complex& other) |
destinyXfate | 0:08606a13a816 | 94 | { |
destinyXfate | 0:08606a13a816 | 95 | const double denominator = other.m_re * other.m_re + other.m_im * other.m_im; |
destinyXfate | 0:08606a13a816 | 96 | const double temp = m_re; |
destinyXfate | 0:08606a13a816 | 97 | m_re = (m_re * other.m_re + m_im * other.m_im) / denominator; |
destinyXfate | 0:08606a13a816 | 98 | m_im = (m_im * other.m_re - temp * other.m_im) / denominator; |
destinyXfate | 0:08606a13a816 | 99 | return *this; |
destinyXfate | 0:08606a13a816 | 100 | } |
destinyXfate | 0:08606a13a816 | 101 | |
destinyXfate | 0:08606a13a816 | 102 | complex& operator++ () |
destinyXfate | 0:08606a13a816 | 103 | { |
destinyXfate | 0:08606a13a816 | 104 | ++m_re; |
destinyXfate | 0:08606a13a816 | 105 | return *this; |
destinyXfate | 0:08606a13a816 | 106 | } |
destinyXfate | 0:08606a13a816 | 107 | |
destinyXfate | 0:08606a13a816 | 108 | complex operator++ (int) |
destinyXfate | 0:08606a13a816 | 109 | { |
destinyXfate | 0:08606a13a816 | 110 | complex temp(*this); |
destinyXfate | 0:08606a13a816 | 111 | ++m_re; |
destinyXfate | 0:08606a13a816 | 112 | return temp; |
destinyXfate | 0:08606a13a816 | 113 | } |
destinyXfate | 0:08606a13a816 | 114 | |
destinyXfate | 0:08606a13a816 | 115 | complex& operator-- () |
destinyXfate | 0:08606a13a816 | 116 | { |
destinyXfate | 0:08606a13a816 | 117 | --m_re; |
destinyXfate | 0:08606a13a816 | 118 | return *this; |
destinyXfate | 0:08606a13a816 | 119 | } |
destinyXfate | 0:08606a13a816 | 120 | |
destinyXfate | 0:08606a13a816 | 121 | complex operator-- (int) |
destinyXfate | 0:08606a13a816 | 122 | { |
destinyXfate | 0:08606a13a816 | 123 | complex temp(*this); |
destinyXfate | 0:08606a13a816 | 124 | --m_re; |
destinyXfate | 0:08606a13a816 | 125 | return temp; |
destinyXfate | 0:08606a13a816 | 126 | } |
destinyXfate | 0:08606a13a816 | 127 | |
destinyXfate | 0:08606a13a816 | 128 | complex operator+ (const double val) const |
destinyXfate | 0:08606a13a816 | 129 | { |
destinyXfate | 0:08606a13a816 | 130 | return complex(m_re + val, m_im); |
destinyXfate | 0:08606a13a816 | 131 | } |
destinyXfate | 0:08606a13a816 | 132 | |
destinyXfate | 0:08606a13a816 | 133 | complex operator- (const double val) const |
destinyXfate | 0:08606a13a816 | 134 | { |
destinyXfate | 0:08606a13a816 | 135 | return complex(m_re - val, m_im); |
destinyXfate | 0:08606a13a816 | 136 | } |
destinyXfate | 0:08606a13a816 | 137 | |
destinyXfate | 0:08606a13a816 | 138 | complex operator* (const double val) const |
destinyXfate | 0:08606a13a816 | 139 | { |
destinyXfate | 0:08606a13a816 | 140 | return complex(m_re * val, m_im * val); |
destinyXfate | 0:08606a13a816 | 141 | } |
destinyXfate | 0:08606a13a816 | 142 | |
destinyXfate | 0:08606a13a816 | 143 | complex operator/ (const double val) const |
destinyXfate | 0:08606a13a816 | 144 | { |
destinyXfate | 0:08606a13a816 | 145 | return complex(m_re / val, m_im / val); |
destinyXfate | 0:08606a13a816 | 146 | } |
destinyXfate | 0:08606a13a816 | 147 | |
destinyXfate | 0:08606a13a816 | 148 | complex& operator+= (const double val) |
destinyXfate | 0:08606a13a816 | 149 | { |
destinyXfate | 0:08606a13a816 | 150 | m_re += val; |
destinyXfate | 0:08606a13a816 | 151 | return *this; |
destinyXfate | 0:08606a13a816 | 152 | } |
destinyXfate | 0:08606a13a816 | 153 | |
destinyXfate | 0:08606a13a816 | 154 | complex& operator-= (const double val) |
destinyXfate | 0:08606a13a816 | 155 | { |
destinyXfate | 0:08606a13a816 | 156 | m_re -= val; |
destinyXfate | 0:08606a13a816 | 157 | return *this; |
destinyXfate | 0:08606a13a816 | 158 | } |
destinyXfate | 0:08606a13a816 | 159 | |
destinyXfate | 0:08606a13a816 | 160 | complex& operator*= (const double val) |
destinyXfate | 0:08606a13a816 | 161 | { |
destinyXfate | 0:08606a13a816 | 162 | m_re *= val; |
destinyXfate | 0:08606a13a816 | 163 | m_im *= val; |
destinyXfate | 0:08606a13a816 | 164 | return *this; |
destinyXfate | 0:08606a13a816 | 165 | } |
destinyXfate | 0:08606a13a816 | 166 | |
destinyXfate | 0:08606a13a816 | 167 | complex& operator/= (const double val) |
destinyXfate | 0:08606a13a816 | 168 | { |
destinyXfate | 0:08606a13a816 | 169 | m_re /= val; |
destinyXfate | 0:08606a13a816 | 170 | m_im /= val; |
destinyXfate | 0:08606a13a816 | 171 | return *this; |
destinyXfate | 0:08606a13a816 | 172 | } |
destinyXfate | 0:08606a13a816 | 173 | |
destinyXfate | 0:08606a13a816 | 174 | friend complex operator+ (const double left, const complex& right) |
destinyXfate | 0:08606a13a816 | 175 | { |
destinyXfate | 0:08606a13a816 | 176 | return complex(left + right.m_re, right.m_im); |
destinyXfate | 0:08606a13a816 | 177 | } |
destinyXfate | 0:08606a13a816 | 178 | |
destinyXfate | 0:08606a13a816 | 179 | friend complex operator- (const double left, const complex& right) |
destinyXfate | 0:08606a13a816 | 180 | { |
destinyXfate | 0:08606a13a816 | 181 | return complex(left - right.m_re, -right.m_im); |
destinyXfate | 0:08606a13a816 | 182 | } |
destinyXfate | 0:08606a13a816 | 183 | |
destinyXfate | 0:08606a13a816 | 184 | friend complex operator* (const double left, const complex& right) |
destinyXfate | 0:08606a13a816 | 185 | { |
destinyXfate | 0:08606a13a816 | 186 | return complex(left * right.m_re, left * right.m_im); |
destinyXfate | 0:08606a13a816 | 187 | } |
destinyXfate | 0:08606a13a816 | 188 | |
destinyXfate | 0:08606a13a816 | 189 | friend complex operator/ (const double left, const complex& right) |
destinyXfate | 0:08606a13a816 | 190 | { |
destinyXfate | 0:08606a13a816 | 191 | const double denominator = right.m_re * right.m_re + right.m_im * right.m_im; |
destinyXfate | 0:08606a13a816 | 192 | return complex(left * right.m_re / denominator, |
destinyXfate | 0:08606a13a816 | 193 | -left * right.m_im / denominator); |
destinyXfate | 0:08606a13a816 | 194 | } |
destinyXfate | 0:08606a13a816 | 195 | |
destinyXfate | 0:08606a13a816 | 196 | // Boolean operators |
destinyXfate | 0:08606a13a816 | 197 | bool operator== (const complex &other) const |
destinyXfate | 0:08606a13a816 | 198 | { |
destinyXfate | 0:08606a13a816 | 199 | return m_re == other.m_re && m_im == other.m_im; |
destinyXfate | 0:08606a13a816 | 200 | } |
destinyXfate | 0:08606a13a816 | 201 | |
destinyXfate | 0:08606a13a816 | 202 | bool operator!= (const complex &other) const |
destinyXfate | 0:08606a13a816 | 203 | { |
destinyXfate | 0:08606a13a816 | 204 | return m_re != other.m_re || m_im != other.m_im; |
destinyXfate | 0:08606a13a816 | 205 | } |
destinyXfate | 0:08606a13a816 | 206 | |
destinyXfate | 0:08606a13a816 | 207 | bool operator== (const double val) const |
destinyXfate | 0:08606a13a816 | 208 | { |
destinyXfate | 0:08606a13a816 | 209 | return m_re == val && m_im == 0.; |
destinyXfate | 0:08606a13a816 | 210 | } |
destinyXfate | 0:08606a13a816 | 211 | |
destinyXfate | 0:08606a13a816 | 212 | bool operator!= (const double val) const |
destinyXfate | 0:08606a13a816 | 213 | { |
destinyXfate | 0:08606a13a816 | 214 | return m_re != val || m_im != 0.; |
destinyXfate | 0:08606a13a816 | 215 | } |
destinyXfate | 0:08606a13a816 | 216 | |
destinyXfate | 0:08606a13a816 | 217 | friend bool operator== (const double left, const complex& right) |
destinyXfate | 0:08606a13a816 | 218 | { |
destinyXfate | 0:08606a13a816 | 219 | return left == right.m_re && right.m_im == 0.; |
destinyXfate | 0:08606a13a816 | 220 | } |
destinyXfate | 0:08606a13a816 | 221 | |
destinyXfate | 0:08606a13a816 | 222 | friend bool operator!= (const double left, const complex& right) |
destinyXfate | 0:08606a13a816 | 223 | { |
destinyXfate | 0:08606a13a816 | 224 | return left != right.m_re || right.m_im != 0.; |
destinyXfate | 0:08606a13a816 | 225 | } |
destinyXfate | 0:08606a13a816 | 226 | }; |
destinyXfate | 0:08606a13a816 | 227 | |
destinyXfate | 0:08606a13a816 | 228 | #endif |
destinyXfate | 0:08606a13a816 | 229 |