public void CheckWithIntegerDelay_WhiteNoise(int frameLength, int expectedDelay)
        {
            var random = new Random(57);

            var x = new Complex[frameLength];
            var y = new Complex[frameLength];

            for (var t = 0; t < frameLength; t++)
            {
                var u = (t + expectedDelay) % frameLength;
                if (u < 0)
                {
                    u += frameLength;
                }

                x[t] = 2 * random.NextDouble() - 1;
                y[u] = x[t];
            }

            Fourier.Forward(x, FourierOptions.AsymmetricScaling);
            Fourier.Forward(y, FourierOptions.AsymmetricScaling);

            var delays = SourceSeparation.EstimatePerFrequencyDelays(x, y);

            for (var w = 1; w < delays.Length; w++)
            {
                var waveLength = (double)frameLength / w;

                if (Math.Abs(expectedDelay) + 1.0E-6 < waveLength / 2)
                {
                    Assert.AreEqual(expectedDelay, delays[w], 1.0E-6);
                }
            }
        }
        public void CheckWithIntegerDelay_Impulse(int frameLength, int peakPosition1, int peakPosition2)
        {
            var expectedDelay = peakPosition2 - peakPosition1;

            var x = new Complex[frameLength];
            var y = new Complex[frameLength];

            x[peakPosition1] = 1;
            y[peakPosition2] = 1;

            Fourier.Forward(x, FourierOptions.AsymmetricScaling);
            Fourier.Forward(y, FourierOptions.AsymmetricScaling);

            var delays = SourceSeparation.EstimatePerFrequencyDelays(x, y);

            for (var w = 1; w < delays.Length; w++)
            {
                var waveLength = (double)frameLength / w;

                if (Math.Abs(expectedDelay) + 1.0E-6 < waveLength / 2)
                {
                    Assert.AreEqual(expectedDelay, delays[w], 1.0E-6);
                }
            }
        }