/// <summary> /// Convolves the specified finite signal with an enumerable signal. /// </summary> /// <param name="s1">The finite signal.</param> /// <param name="s2">The enumerable signal.</param> /// <returns></returns> /// <exception cref="SamplerateMismatchException"></exception> public static IEnumerableSignal Convolve(this IFiniteSignal s1, IEnumerableSignal s2) { if (s1.SampleRate != s2.SampleRate) { throw new SamplerateMismatchException(); } return(new EnumerableSignal(Dsp.Convolve(s2.Signal, s1.Signal), s1.SampleRate, s1.Start + s2.Start) { DisplayName = "convolution result" }); }
public void TestConvolve2() { Fft.FftProvider = new FftwProvider(); var x = new[] { 0.276025076998578, 0.679702676853675, 0.655098003973841, 0.162611735194631 }; var x2 = new[] { 0.257508254123736, 0.840717255983663, 0.254282178971531, 0.814284826068816, 0.243524968724989, 0.929263623187228, 0.349983765984809, 0.196595250431208, 0.251083857976031 }; IEnumerable <double> y = new[] { 0.118997681558377, 0.498364051982143, 0.959743958516081, 0.340385726666133, 0.585267750979777, 0.223811939491137, 0.751267059305653, 0.255095115459269, 0.505957051665142, 0.699076722656686, 0.890903252535799, 0.959291425205444, 0.547215529963803, 0.138624442828679, 0.149294005559057 }; var target = new[] { 0.032846344214803, 0.218444018516304, 0.681607923894635, 1.092123249297922, 1.102675860408013, 0.838637405405360, 0.798252571381053, 0.822841039495085, 0.841593665814167, 0.826140209658119, 1.094008872602152, 1.410576134814834, 1.500385179763377, 1.183508904704664, 0.649904138880630, 0.281271797868616, 0.120344166235758, 0.024276957298115 }; var target2 = new[] { 0.030642885222870, 0.228376261252129, 0.696384239185831, 1.118148544942429, 1.115714407941796, 1.649681392896622, 1.546094578511470, 2.403339593306050, 1.640616065530008, 2.313309936596889, 2.057177973907335, 2.624883046543862, 2.557340468529460, 2.398710561054729, 2.357714037548000, 2.076032996517954, 1.751812342971872, 1.350244496751099, 0.768975585726849, 0.535692359201659, 0.216900371766017, 0.064156852325964, 0.037485314888463 }; var result = Dsp.Convolve(y, x).ToReadOnlyList(); FilterAssert.ListsAreReasonablyClose(target, result); result = Dsp.Convolve(y, x2).ToReadOnlyList(); FilterAssert.ListsAreReasonablyClose(target2, result); result = Dsp.Convolve((IEnumerable <double>)x, y.ToReadOnlyList()).ToReadOnlyList(); FilterAssert.ListsAreReasonablyClose(target, result); result = Dsp.Convolve((IEnumerable <double>)x2, y.ToReadOnlyList()).ToReadOnlyList(); FilterAssert.ListsAreReasonablyClose(target2, result); Assert.That(Dsp.Convolve(Enumerable.Empty <double>(), x).ToReadOnlyList().Count == 0); Assert.That(Dsp.Convolve(y, new List <double>()).ToReadOnlyList().Count == 0); Assert.Throws <ArgumentNullException>(() => Dsp.Convolve(null, x).ToReadOnlyList()); Assert.Throws <ArgumentNullException>(() => Dsp.Convolve(y, null).ToReadOnlyList()); }
public override IEnumerable <double> ProcessOverride(IEnumerable <double> signal) { return(Dsp.Convolve(signal, this.ImpulseResponse)); }
public void TestConvolve() { Fft.FftProvider = new FftwProvider(); var x = new[] { 0.706046088019609, 0.031832846377421, 0.276922984960890, 0.046171390631154, 0.097131781235848, 0.823457828327293, 0.694828622975817, 0.317099480060861, 0.950222048838355, 0.034446080502909 }; var y = new[] { 0.438744359656398, 0.381558457093008, 0.765516788149002, 0.795199901137063, 0.186872604554379, 0.489764395788231, 0.445586200710899, 0.646313010111265, 0.709364830858073, 0.754686681982361 }; var target = new[] { 0.309773738776068, 0.283364337781218, 0.674134623045390, 0.711736101800065, 0.429476447439455, 1.005647957710862, 1.112065240300617, 1.726619556339416, 2.410188791663434, 2.129381251142283, 1.819441363049064, 1.852986487123710, 1.305830381386788, 1.719629972594990, 1.759561460666554, 1.378806697858031, 0.935627807393663, 0.741554763253968, 0.025995998202038 }; var result = Dsp.Convolve(x, y); FilterAssert.ListsAreReasonablyClose(target, result); Assert.That(Dsp.Convolve(new List <double>(), y).Count == 0); Assert.That(Dsp.Convolve(x, new List <double>()).Count == 0); Assert.Throws <ArgumentNullException>(() => Dsp.Convolve(null, y)); Assert.Throws <ArgumentNullException>(() => Dsp.Convolve(x, null)); }
/// <summary> /// Convolves two vectors. /// </summary> /// <param name="input">The first vector.</param> /// <param name="input2">The second vector.</param> /// <returns></returns> public static IEnumerable <double> Convolve(this IEnumerable <double> input, IReadOnlyList <double> input2) { return(Dsp.Convolve(input, input2)); }