public static IEnumerable <Complex> TransformReverse(IEnumerable <Complex> values) { if (!reverseTransformations.ContainsKey(values.Count())) { reverseTransformations[values.Count()] = GetReverseTransformation(values.Count()); } MatrixComplex transformation = reverseTransformations[values.Count()]; MatrixComplex vector = MatrixComplex.FromRowVectors(values.Select(MatrixComplex.CreateSingleton)); return((transformation * vector).Columns.Single()); }
// Intended for synthesis // Input \ Output | Real | Imaginary // ---------------|------|---------- // Real | + | - // Imaginary | + | + static MatrixComplex GetReverseTransformation(int size) { MatrixComplex transformation = new MatrixComplex(size, size); Complex factor = (2 * Math.PI / size) * Complex.ImaginaryOne; for (int row = 0; row < transformation.RowCount; row++) { for (int column = 0; column < transformation.ColumnCount; column++) { transformation[row, column] = Scalars.Exponentiate(-factor * row * column); } } return((1 / Scalars.SquareRoot(size)) * transformation); }