Beispiel #1
0
        /// <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"
            });
        }
Beispiel #2
0
        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());
        }
Beispiel #3
0
 public override IEnumerable <double> ProcessOverride(IEnumerable <double> signal)
 {
     return(Dsp.Convolve(signal, this.ImpulseResponse));
 }
Beispiel #4
0
        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));
        }
Beispiel #5
0
 /// <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));
 }