Browse Source

FFT: verify parseval theorem

benchmark-la
Christoph Ruegg 10 years ago
parent
commit
2ab73ac781
  1. 30
      src/UnitTests/FourierTransformProviderTests/FourierTransformProviderTests.cs

30
src/UnitTests/FourierTransformProviderTests/FourierTransformProviderTests.cs

@ -28,6 +28,8 @@
// </copyright>
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));
}
}
}

Loading…
Cancel
Save