From e1dae7578bee7898f53687d4b9362f7fe70bfc6f Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Fri, 28 Oct 2016 13:08:07 +0200 Subject: [PATCH] FFT-Managed: temporary real conjugate-even implementation --- .../ManagedFourierTransformProvider.cs | 47 +++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/src/Numerics/Providers/FourierTransform/ManagedFourierTransformProvider.cs b/src/Numerics/Providers/FourierTransform/ManagedFourierTransformProvider.cs index 13cc5799..f956917b 100644 --- a/src/Numerics/Providers/FourierTransform/ManagedFourierTransformProvider.cs +++ b/src/Numerics/Providers/FourierTransform/ManagedFourierTransformProvider.cs @@ -53,7 +53,7 @@ namespace MathNet.Numerics.Providers.FourierTransform { } - public string ToString() + public override string ToString() { return "Managed"; } @@ -93,12 +93,53 @@ namespace MathNet.Numerics.Providers.FourierTransform public void ForwardReal(double[] samples, int n, FourierTransformScaling scaling) { - throw new NotImplementedException(); + // TODO: backport proper, optimized implementation from Iridium + + Complex[] data = new Complex[n]; + for (int i = 0; i < data.Length; i++) + { + data[i] = new Complex(samples[i], 0.0); + } + + Forward(data, scaling); + + samples[0] = data[0].Real; + samples[1] = 0d; + for (int i = 1, j = 2; i < data.Length/2; i++) + { + samples[j++] = data[i].Real; + samples[j++] = data[i].Imaginary; + } + if (n.IsEven()) + { + samples[n] = data[data.Length/2].Real; + samples[n+1] = 0d; + } } public void BackwardReal(double[] spectrum, int n, FourierTransformScaling scaling) { - throw new NotImplementedException(); + // TODO: backport proper, optimized implementation from Iridium + + Complex[] data = new Complex[n]; + data[0] = new Complex(spectrum[0], 0d); + for (int i = 1, j = 2; i < data.Length/2; i++) + { + data[i] = new Complex(spectrum[j++], spectrum[j++]); + data[data.Length - i] = data[i].Conjugate(); + } + if (n.IsEven()) + { + data[data.Length/2] = new Complex(spectrum[n], 0d); + } + + Backward(data, scaling); + + for (int i = 0; i < data.Length; i++) + { + spectrum[i] = data[i].Real; + } + spectrum[n] = 0d; } public void ForwardMultidim(Complex[] samples, int[] dimensions, FourierTransformScaling scaling)