public static ComplexDouble[] Transform(ComplexDouble[] input) { int length = input.Length; if (length == 1) { return new ComplexDouble[] { input[0] } } ; ComplexDouble[] evens = new ComplexDouble[length / 2]; ComplexDouble[] odds = new ComplexDouble[length / 2]; for (int i = 0; i < length / 2; i++) { evens[i] = input[2 * i]; odds[i] = input[2 * i + 1]; } ComplexDouble[] evensRes = Transform(evens); ComplexDouble[] oddsRes = Transform(odds); for (int i = 0; i < length / 2; i++) { oddsRes[i] *= ComplexDouble.FromRF(1, -2 * Math.PI * i / length); } ComplexDouble[] res = new ComplexDouble[length]; for (int i = 0; i < length / 2; i++) { res[i] = evensRes[i] + oddsRes[i]; res[i + length / 2] = evensRes[i] - oddsRes[i]; } return(res); }
public static ComplexDouble FromRF(double r, double f) { ComplexDouble res = new ComplexDouble(); res.a = r * Math.Cos(f); res.b = r * Math.Sin(f); return(res); }
public static ComplexDouble FromAB(double a, double b) { ComplexDouble res = new ComplexDouble(); res.a = a; res.b = b; return(res); }
static ComplexDouble ImgExponent(double power) { return(ComplexDouble.FromRF(1, power)); }
public static ComplexDouble operator *(ComplexDouble z1, ComplexDouble z2) { return(ComplexDouble.FromAB(z1.a * z2.a - z1.b * z2.b, z1.a * z2.b + z2.a * z1.b)); }
public static ComplexDouble operator *(ComplexDouble z, double x) { return(ComplexDouble.FromAB(z.a * x, z.b * x)); }
public static ComplexDouble operator +(ComplexDouble z1, ComplexDouble z2) { return(ComplexDouble.FromAB(z1.a + z2.a, z1.b + z2.b)); }
public static ComplexDouble[] Transform(double[] input) { return(Transform(input.Select(x => ComplexDouble.FromAB(x, 0)).ToArray())); }