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"); } } }
/// <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(); }
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)); }