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