Transforms
đ FFT / DFTâ
Func<double, double> f = t => Math.Exp(-t * t / 0.02);
var freq = f.FastFourierTransform(-0.5, 0.5, 100)
.ToFrequencyResolution(100);
// DFT from real or complex samples
var dft = samples.DiscreteFourierTransform();
Inverse FFT / DFT
var timeDomain = freqDomain.InverseFastFourierTransform();
var timeDomain2 = freqDomain.InverseDiscreteFourierTransform();
đľ Fourier Seriesâ
Real Fourier series analysis and synthesis for periodic functions:
using CSharpNumerics.Numerics.SignalProcessing;
var fs = new FourierSeries();
// Analyse a square wave
double period = 2 * Math.PI;
Func<double, double> square = t => (t % period) < period / 2 ? 1.0 : -1.0;
fs.Analyze(square, period, nTerms: 20, nSamples: 4096);
// Coefficients
double a0 = fs.A0; // â 0 (zero mean)
double b1 = fs.Bn[0]; // â 4/Ď (first sine coefficient)
double b3 = fs.Bn[2]; // â 4/(3Ď)
// Reconstruct signal
double val = fs.Synthesize(t: 0.5);
// Sweep across time â vary term count for Gibbs phenomenon demo
double[] tVals = Enumerable.Range(0, 500).Select(i => i * period / 500).ToArray();
List<Serie> synth5 = fs.SynthesizeRange(tVals, maxTerms: 5);
List<Serie> synth20 = fs.SynthesizeRange(tVals, maxTerms: 20);
// Power spectrum: |câ|² per harmonic
List<Serie> power = fs.PowerSpectrum();
// Parseval's theorem: frequency-domain energy = time-domain energy
double eParseval = fs.ParsevalEnergy();
double eTime = fs.TimeDomainEnergy(square, nSamples: 4096);
// eParseval â eTime
đ Laplace Transformâ
double result = f.LaplaceTransform(2.0);
double inverse = F.InverseLaplaceTransform(1.0);
đ Low-Pass Filterâ
var filtered = input.LowPassFilter(output, alpha: 0.25);