public void SpanDftTheory(Complex[] signalExpected, Complex[] spectrumExpected) { int windowSize = signalExpected.Length; IFftCalculator calculator = CreateCalculator(windowSize); Span <double> signalExpectedReal = stackalloc double[windowSize]; Span <double> signalExpectedImaginary = stackalloc double[windowSize]; ComplexSpan signalExpectedSpan = new ComplexSpan(signalExpectedReal, signalExpectedImaginary); signalExpected.CopyTo(signalExpectedSpan); Span <double> spectrumExpectedReal = stackalloc double[windowSize]; Span <double> spectrumExpectedImaginary = stackalloc double[windowSize]; ComplexSpan spectrumExpectedSpan = new ComplexSpan(spectrumExpectedReal, spectrumExpectedImaginary); spectrumExpected.CopyTo(spectrumExpectedSpan); Span <double> signalActualReal = stackalloc double[windowSize]; Span <double> signalActualImaginary = stackalloc double[windowSize]; ComplexSpan signalActualSpan = new ComplexSpan(signalActualReal, signalActualImaginary); Span <double> spectrumActualReal = stackalloc double[windowSize]; Span <double> spectrumActualImaginary = stackalloc double[windowSize]; ComplexSpan spectrumActualSpan = new ComplexSpan(spectrumActualReal, spectrumActualImaginary); calculator.DFT(signalExpectedSpan, spectrumActualSpan); Assert.Equal(spectrumExpected, spectrumActualSpan.ToArray(), complexComparer); calculator.IDFT(spectrumActualSpan, signalActualSpan); Assert.Equal(signalExpected, signalActualSpan.ToArray(), complexComparer); }
public void ArrayDftTheory(Complex[] signalExpected, Complex[] spectrumExpected) { int windowSize = signalExpected.Length; IFftCalculator calculator = CreateCalculator(windowSize); Complex[] spectrumActual = new Complex[windowSize]; calculator.DFT(signalExpected, spectrumActual); Assert.Equal(spectrumExpected, spectrumActual, complexComparer); Complex[] signalActual = new Complex[windowSize]; calculator.IDFT(spectrumActual, signalActual); Assert.Equal(signalExpected, signalActual, complexComparer); }
static void Main(string[] args) { Console.WriteLine("Number of cores: {0}", Environment.ProcessorCount); Console.WriteLine("Accelerated vectors: {0}", Vector.IsHardwareAccelerated); Console.WriteLine("Size of vectors: {0}", Vector <double> .Count); Console.WriteLine("Support Avx2: {0}", Avx2.IsSupported); Console.WriteLine("Support Avx: {0}", Avx.IsSupported); Console.WriteLine("Support Sse: {0}", Sse.IsSupported); Console.WriteLine("Support Sse2: {0}", Sse2.IsSupported); Console.WriteLine("Support Sse3: {0}", Sse3.IsSupported); Console.WriteLine("Support Ssse3: {0}", Ssse3.IsSupported); Console.WriteLine("Support Sse41: {0}", Sse41.IsSupported); Console.WriteLine("Support Sse42: {0}", Sse42.IsSupported); Console.WriteLine("Support Fma: {0}", Fma.IsSupported); int windowSize = 1024; IFftCalculator[] calculatorsUsingArray = new IFftCalculator[] { new FftCalculator(windowSize), new ParallelFftCalculator(windowSize) }; foreach (var harness in calculatorsUsingArray.Select(calculator => new FftBenchmarkHarness(calculator))) { TimeSpan elapsedTime = harness.BenchmarkUsingArray(); Console.WriteLine("{0}: {1}", harness.Name, elapsedTime); } IFftCalculator[] calculatorsUsingSpan = new IFftCalculator[] { new SpanFftCalculator(windowSize), new VectorTFftCalculator(windowSize), new IntrinsicsFftCalculator(windowSize), }; foreach (var harness in calculatorsUsingSpan.Select(calculator => new FftBenchmarkHarness(calculator))) { TimeSpan elapsedTime = harness.BenchmarkUsingSpan(); Console.WriteLine("{0}: {1}", harness.Name, elapsedTime); } }