From 23f68b2dbb4634e1790ceba04edca30779873df9 Mon Sep 17 00:00:00 2001 From: Esiur Project Date: Sun, 6 Nov 2022 20:42:01 +0300 Subject: [PATCH] Correlation --- Esiur.Analysis.Test/Program.cs | 10 ++++++ Esiur.Analysis/DSP/Functions.cs | 55 ++++++++++++++++++++++++--------- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/Esiur.Analysis.Test/Program.cs b/Esiur.Analysis.Test/Program.cs index 8bdfbe6..a59465e 100644 --- a/Esiur.Analysis.Test/Program.cs +++ b/Esiur.Analysis.Test/Program.cs @@ -1,13 +1,23 @@ +using System.Diagnostics; +using Esiur.Analysis.DSP; + namespace Esiur.Analysis.Test { internal static class Program { + private const int V = -1; + /// /// The main entry point for the application. /// [STAThread] static void Main() { + var signalA = new double[] { 1, 1, 1, V, 1, 1, V, V, 1, V, 1, V, V, V, V }; + var signalB = new double[] { 1, V, V, V, V, 1, V, V, V, V, 1, V, V, V, V }; + var cor = signalA.CrossCorrelation(signalB, true); + Debug.WriteLine(cor); + // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); diff --git a/Esiur.Analysis/DSP/Functions.cs b/Esiur.Analysis/DSP/Functions.cs index 16c6106..a592e69 100644 --- a/Esiur.Analysis/DSP/Functions.cs +++ b/Esiur.Analysis/DSP/Functions.cs @@ -1,21 +1,22 @@ using System; using System.Collections.Generic; using System.Text; +using Esiur.Analysis.DSP; namespace Esiur.Analysis.DSP { public static class Functions { - public static double[] ConvolveMany(params double[][] signals) + public static double[] MultipleConvolution(params double[][] signals) { var rt = signals[0]; for (var i = 1; i < signals.Length; i++) - rt = rt.Convolve(signals[i]); + rt = rt.Convolution(signals[i]); return rt; } - public static double[] Convolve(this double[] signal, double[] filter) + public static double[] Convolution(this double[] signal, double[] filter) { var length = signal.Length + filter.Length - 1; var rt = new double[length]; @@ -37,20 +38,46 @@ namespace Esiur.Analysis.DSP return rt; } - public static double[] CrossCorrelate(this double[] signal, double[] filter) + public static double[] CrossCorrelation(this double[] signal, double[] filter, bool cyclic = false) { - var length = signal.Length + filter.Length - 1; - var rt = new double[length]; - for (var i = 0; i < length; i++) - { - for (var j = 0; j < signal.Length && j + i < filter.Length; j++) - { - rt[i] = signal[j] * filter[i + j]; - } - } - return rt; + if (cyclic) + { + var length = signal.Length + filter.Length - 1; + var rt = new double[length]; + + for (var i = 0; i < length; i++) + { + for (var j = 0; j < signal.Length; j++) + { + rt[i] += signal[j] * filter[(i + j) % filter.Length]; + } + } + + return rt; + + } + else + { + var length = signal.Length + filter.Length - 1; + var rt = new double[length]; + + for (var i = 0; i < length; i++) + { + for (var j = 0; j < signal.Length; j++) + { + if (i + j < filter.Length) + rt[i] += signal[j] * filter[i + j]; + } + } + + return rt; + } } + public static double[] AutoCorrelation(this double[] signal, bool cyclic = false) + { + return signal.CrossCorrelation(signal, cyclic); + } } }