Esempio n. 1
0
        public void NaiveTransformsRealSineCorrectly()
        {
            var samples = SignalGenerator.EquidistantPeriodic(w => new Complex(Math.Sin(w), 0), Constants.Pi2, 0, 16);

            // real-odd transforms to imaginary odd
            var dft      = new DiscreteFourierTransform();
            var spectrum = dft.NaiveForward(samples, FourierOptions.Matlab);

            // all real components must be zero
            foreach (var c in spectrum)
            {
                Assert.AreEqual(0, c.Real, 1e-12, "real");
            }

            // all imaginary components except second and last musth be zero
            for (var i = 0; i < spectrum.Length; i++)
            {
                if (i == 1)
                {
                    Assert.AreEqual(-8, spectrum[i].Imaginary, 1e-12, "imag second");
                }
                else if (i == spectrum.Length - 1)
                {
                    Assert.AreEqual(8, spectrum[i].Imaginary, 1e-12, "imag last");
                }
                else
                {
                    Assert.AreEqual(0, spectrum[i].Imaginary, 1e-12, "imag");
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Run example
        /// </summary>
        public void Run()
        {
            // 1. Get 11 samples of f(x) = (x * x) / 2 equidistant within interval [-5, 5]
            var result = SignalGenerator.EquidistantInterval(Function, -5, 5, 11);

            Console.WriteLine(@"1. Get 11 samples of f(x) = (x * x) / 2 equidistant within interval [-5, 5]");
            for (var i = 0; i < result.Length; i++)
            {
                Console.Write(result[i].ToString("N") + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 2. Get 10 samples of f(x) = (x * x) / 2 equidistant starting at x=1 with step = 0.5 and retrieve sample points
            double[] samplePoints;
            result = SignalGenerator.EquidistantStartingAt(Function, 1, 0.5, 10, out samplePoints);
            Console.WriteLine(@"2. Get 10 samples of f(x) = (x * x) / 2 equidistant starting at x=1 with step = 0.5 and retrieve sample points");
            Console.Write(@"Points: ");
            for (var i = 0; i < samplePoints.Length; i++)
            {
                Console.Write(samplePoints[i].ToString("N") + @" ");
            }

            Console.WriteLine();
            Console.Write(@"Values: ");
            for (var i = 0; i < result.Length; i++)
            {
                Console.Write(result[i].ToString("N") + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 3. Get 10 samples of f(x) = (x * x) / 2 equidistant within period = 10 and period offset = 5
            result = SignalGenerator.EquidistantPeriodic(Function, 10, 5, 10);
            Console.WriteLine(@"3. Get 10 samples of f(x) = (x * x) / 2 equidistant within period = 10 and period offset = 5");
            for (var i = 0; i < result.Length; i++)
            {
                Console.Write(result[i].ToString("N") + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 4. Sample f(x) = (x * x) / 2 equidistant  to an integer-domain function starting at x = 0 and step = 2
            var equidistant = SignalGenerator.EquidistantToFunction(Function, 0, 2);

            Console.WriteLine(@" 4. Sample f(x) = (x * x) / 2 equidistant  to an integer-domain function starting at x = 0 and step = 2");
            for (var i = 0; i < 10; i++)
            {
                Console.Write(equidistant(i).ToString("N") + @" ");
            }

            Console.WriteLine();
        }
Esempio n. 3
0
        public void FourierRadix2MatchesNaiveOnRealSine(FourierOptions options)
        {
            var dft     = new DiscreteFourierTransform();
            var samples = SignalGenerator.EquidistantPeriodic(w => new Complex(Math.Sin(w), 0), Constants.Pi2, 0, 16);

            VerifyMatchesNaiveComplex(
                samples,
                1e-12,
                s => dft.NaiveForward(s, options),
                s => dft.Radix2Forward(s, options));

            VerifyMatchesNaiveComplex(
                samples,
                1e-12,
                s => dft.NaiveInverse(s, options),
                s => dft.Radix2Inverse(s, options));
        }
        public void FourierBluesteinMatchesNaiveOnRealSineNonPowerOfTwo(FourierOptions options)
        {
            var dft     = new DiscreteFourierTransform();
            var samples = SignalGenerator.EquidistantPeriodic(w => new Complex(Math.Sin(w), 0), Constants.Pi2, 0, 14);

            VerifyMatchesNaiveComplex(
                samples,
                12,
                s => dft.NaiveForward(s, options),
                s => dft.BluesteinForward(s, options));

            VerifyMatchesNaiveComplex(
                samples,
                12,
                s => dft.NaiveInverse(s, options),
                s => dft.BluesteinInverse(s, options));
        }