mkfilter/complex.h
00001 struct c_complex
00002 {
00003 double re, im;
00004 };
00005
00006 struct complex
00007 {
00008 double re;
00009 double im;
00010 complex(double r, double i = 0.0) { re = r; im = i; }
00011 complex() { }
00012 complex(c_complex z) { re = z.re; im = z.im; }
00013 };
00014
00015 extern complex csqrt(complex);
00016 extern complex cexp(complex);
00017 extern complex expj(double);
00018 extern complex evaluate(complex[], int, complex[], int, complex);
00019
00020 inline double hypot(complex z) { return ::hypot(z.im, z.re); }
00021 inline double atan2(complex z) { return ::atan2(z.im, z.re); }
00022
00023 inline complex cconj(complex z)
00024 {
00025 z.im = -z.im;
00026 return z;
00027 }
00028
00029 inline complex operator * (double a, complex z)
00030 {
00031 z.re *= a; z.im *= a;
00032 return z;
00033 }
00034
00035 inline complex operator / (complex z, double a)
00036 {
00037 z.re /= a; z.im /= a;
00038 return z;
00039 }
00040
00041 inline void operator /= (complex &z, double a)
00042 {
00043 z = z / a;
00044 }
00045
00046 extern complex operator * (complex, complex);
00047 extern complex operator / (complex, complex);
00048
00049 inline complex operator + (complex z1, complex z2)
00050 {
00051 z1.re += z2.re;
00052 z1.im += z2.im;
00053 return z1;
00054 }
00055
00056 inline complex operator - (complex z1, complex z2)
00057 {
00058 z1.re -= z2.re;
00059 z1.im -= z2.im;
00060 return z1;
00061 }
00062
00063 inline complex operator - (complex z)
00064 {
00065 return 0.0 - z;
00066 }
00067
00068 inline bool operator == (complex z1, complex z2)
00069 {
00070 return (z1.re == z2.re) && (z1.im == z2.im);
00071 }
00072
00073 inline complex sqr(complex z)
00074 {
00075 return z*z;
00076 }