26 #include "complex_midi.h"
30 struct Complex Czero={0.F, 0.F};
32 struct Complex Addc(struct Complex z1, struct Complex z2)
34 struct Complex result;
35 result.r = z1.r + z2.r;
36 result.i = z1.i + z2.i;
40 struct Complex Subtractc(struct Complex z1, struct Complex z2)
42 struct Complex result;
43 result.r = z1.r - z2.r;
44 result.i = z1.i - z2.i;
48 struct Complex Multiplyc(struct Complex z1, struct Complex z2)
50 struct Complex result;
51 result.r = z1.r*z2.r - z1.i*z2.i;
52 result.i = z1.i*z2.r + z1.r*z2.i;
56 struct Complex Dividec(struct Complex z1, struct Complex z2)
60 MultiplyConjPtr(&temp, &z1, &z2);
61 return Scalec(temp, 1.F/Cmag2(z2));
67 void SubtractCptr(
struct Complex * result,
struct Complex * z1,
struct Complex * z2)
69 result->r = z1->r - z2->r;
70 result->i = z1->i - z2->i;
73 void AddCptr (
struct Complex * result,
struct Complex * z1,
struct Complex * z2)
75 result->r = z1->r + z2->r;
76 result->i = z1->i + z2->i;
79 void MultiplyCptr(
struct Complex * result,
struct Complex * z1,
struct Complex * z2)
83 result->r = z1->r*z2->r - z1->i*z2->i;
85 result->i = z1->i*z2->r + temp*z2->i ;
88 void MultiplyConjPtr(
struct Complex * result,
struct Complex * z1,
struct Complex * z2)
92 result->r = z1->r*z2->r + z1->i*z2->i;
94 result->i = z1->i*z2->r - temp*z2->i;
97 struct Complex Scalec(struct Complex z, float scale)
99 struct Complex result;
100 result.r = scale * z.r;
101 result.i = scale * z.i;
105 struct Complex Unitc(struct Complex z)
109 temp = z.r*z.r + z.i*z.i;
110 if(temp < .0000000000000000000000000001)
112 z.r += .00000000000001;
115 return Scalec(z, 1.F/sqrt(temp));
118 float Cmag(
struct Complex z)
120 return (
float) sqrt(z.r*z.r + z.i*z.i);
123 float Cmag2(
struct Complex z)
125 return (z.r*z.r + z.i*z.i);
131 struct Complex Csqrt(struct Complex value)
134 struct Complex result;
142 result.r = (float) sqrt(value.r);
147 result.i = -((float) sqrt(-value.r));
152 result.r = (float) sqrt(.5*(mag+value.r));
153 result.i = (float) sqrt(.5*(mag-value.r));
156 result.i = -result.i;
162 void GetScaledEtoJtimes(
float Angle,
struct Complex *Result,
float scale)
164 Result->r = scale * (float) cos(Angle);
165 Result->i = scale * (float) sin(Angle);
168 void GetEtoJtimes(
float Angle,
struct Complex *Result)
170 Result->r = (float) cos(Angle);
171 Result->i = (float) sin(Angle);
174 void GetExpc(
struct Complex *Result,
struct Complex z)
177 GetScaledEtoJtimes(z.i, Result, (
float) exp(z.r));
180 struct Complex jtimes(struct Complex z)
182 struct Complex result;
191 float Arg(
struct Complex z)
193 if(fabs(z.r)<.000000000000000001)
194 if(fabs(z.i)<.000000000000000001)
197 return (
float) atan2(z.i,z.r);
200 void printC(
struct Complex z)
202 if(fabs(z.i) < .00001F*fabs(z.r))
213 cpl_msg_info(cpl_func,
"%.4g + j %.4g = %.4g @ %4.1fø\n",
214 z.r,z.i,Cmag(z), 57.2958F*Arg(z));