public void ExampleLowpass() { int shiftUp = 1000; //1khz int fade = 2; //8 sample fade. int halfsize = samplesize / 2; int kick = frequencies[0].Length * shiftUp / rate; for (int i = 0; i < sampleCount; i++) { for (int j = 0; j < frequencies[i].Length; j++) { if (j == 0 || j == halfsize) { continue; } if (j < halfsize) { if (!(j < kick + 1)) { frequencies[i][j] = 0; } } else { if (!(j - halfsize > halfsize - 1 - kick)) { frequencies[i][j] = 0; } } } dft.BluesteinInverse(frequencies[i], MathNet.Numerics.IntegralTransforms.FourierOptions.Default); } }
public void FourierBluesteinIsReversible(FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.Random((u, v) => new Complex(u, v), GetUniform(1), 0x7FFF); var work = new Complex[samples.Length]; samples.CopyTo(work, 0); dft.BluesteinForward(work, options); Assert.IsFalse(work.ListAlmostEqual(samples, 6)); dft.BluesteinInverse(work, options); AssertHelpers.ListAlmostEqual(samples, work, 10); }
public void FourierBluesteinMatchesNaiveOnRandomNonPowerOfTwo(FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.Random((u, v) => new Complex(u, v), _uniform, 0x7F); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveForward(s, options), s => dft.BluesteinForward(s, options)); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveInverse(s, options), s => dft.BluesteinInverse(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, 1e-12, s => dft.NaiveForward(s, options), s => dft.BluesteinForward(s, options)); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveInverse(s, options), s => dft.BluesteinInverse(s, options)); }
public void FourierBluesteinMatchesNaiveOnRandomPowerOfTwo([Values(FourierOptions.Default, FourierOptions.Matlab, FourierOptions.NumericalRecipes)] FourierOptions options) { var dft = new DiscreteFourierTransform(); var samples = SignalGenerator.Random((u, v) => new Complex(u, v), _uniform, 0x80); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveForward(s, options), s => dft.BluesteinForward(s, options)); VerifyMatchesNaiveComplex( samples, 1e-12, s => dft.NaiveInverse(s, options), s => dft.BluesteinInverse(s, options)); }
public void FourierBluesteinIsReversible(FourierOptions options) { var dft = new DiscreteFourierTransform(); VerifyIsReversibleComplex( 0x7FFF, 1e-12, s => { dft.BluesteinForward(s, options); return s; }, s => { dft.BluesteinInverse(s, options); return s; }); }
public void FourierBluesteinIsReversible(FourierOptions options) { var dft = new DiscreteFourierTransform(); VerifyIsReversibleComplex( 0x7FFF, 1e-12, s => { dft.BluesteinForward(s, options); return(s); }, s => { dft.BluesteinInverse(s, options); return(s); }); }
/// <summary> /// Applies the inverse Fast Fourier Transform (iFFT) to arbitrary-length sample vectors. /// </summary> /// <param name="samples">Sample vector, where the FFT is evaluated in place.</param> public static void FourierInverse(Complex[] samples) { _dft.BluesteinInverse(samples, FourierOptions.Default); }