From 2ab73ac781250a10388e9f57506d7c88b0cb0a7c Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Fri, 7 Oct 2016 15:13:10 +0200 Subject: [PATCH] FFT: verify parseval theorem --- .../FourierTransformProviderTests.cs | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/UnitTests/FourierTransformProviderTests/FourierTransformProviderTests.cs b/src/UnitTests/FourierTransformProviderTests/FourierTransformProviderTests.cs index 068b7e02..588768b5 100644 --- a/src/UnitTests/FourierTransformProviderTests/FourierTransformProviderTests.cs +++ b/src/UnitTests/FourierTransformProviderTests/FourierTransformProviderTests.cs @@ -28,6 +28,8 @@ // using System; +using MathNet.Numerics.Distributions; +using MathNet.Numerics.Statistics; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.FourierTransformProviderTests @@ -45,7 +47,7 @@ namespace MathNet.Numerics.UnitTests.FourierTransformProviderTests public class LinearAlgebraProviderTests { [Test] - public void ForwardInplace() + public void ForwardInplaceRealSine() { var samples = Generate.PeriodicMap(16, w => new Complex(Math.Sin(w), 0), 16, 1.0, Constants.Pi2); var spectrum = new Complex[samples.Length]; @@ -77,5 +79,31 @@ namespace MathNet.Numerics.UnitTests.FourierTransformProviderTests } } } + + [TestCase(0x1000)] + [TestCase(0x7FF)] + public void ForwardInplaceParsevalTheorem(int count) + { + var samples = Generate.RandomComplex(count, GetUniform(1)); + var timeSpaceEnergy = Generate.Map(samples, s => s.MagnitudeSquared()).Mean(); + + var work = new Complex[samples.Length]; + samples.Copy(work); + + Control.FourierTransformProvider.ForwardInplace(work); + + var frequencySpaceEnergy = Generate.Map(work, s => s.MagnitudeSquared()).Mean(); + + // TODO: normalize scaling - this should instead be controllable, not needed by default + frequencySpaceEnergy /= count; + + Assert.AreEqual(timeSpaceEnergy, frequencySpaceEnergy, 1e-12); + } + + IContinuousDistribution GetUniform(int seed) + { + return new ContinuousUniform(-1, 1, new System.Random(seed)); + } + } }