将C#中的两个信号关联起来,长度不同

时间:2015-09-03 08:19:34

标签: c# correlation

我有一个信号,我将它实时存储在c#的列表中。我还有一个参考信号,我想与实时信号进行比较。这两个信号的大小不同。如何对齐这两个信号?如何在c#中将它们关联起来?我的意思是有计算相关性的函数吗?

3 个答案:

答案 0 :(得分:2)

我认为您需要重新考虑您的数据结构。目前尚不清楚这些信号;

  1. 涵盖不同的时间跨度;
  2. 读数之间有不同的时间步长;
  3. 或两者兼而有之。
  4. 在第一种情况下,您可以简单地裁剪系列,使它们具有相同的长度并覆盖相同的时间跨度。但是,数字列表只能包含,而不能包含它们的时间。如果您不将此信息存储在程序的其他位置,那么您将无法进行裁剪。

    在第二种情况下,您需要选择一个或多个适当的系列,并将两个信号都符合。这可能采取一系列lerp操作的形式来填补目标点。

    // x - the first value
    // y - the second value
    // t - the distance from the first to the second value, normalized to 0..1
    public static float Lerp(float x, float y, float t) {
    
        return x + t * (y - x);
    }
    

    如您所见,执行Lerp需要t,这可以从两个已知点的时间值计算得出。

    更好的数据结构可能是时间到值的映射:

    var signal = new Dictionary<DateTime, double>();
    

    这样您就可以更轻松地跟踪阅读的时间。

    StackOverflow上已有question about performing the actual correlation

    顺便说一下,这是R更容易做到的事情 - 看一下zoo包的灵感。

答案 1 :(得分:2)

您将无法找到不同长度的数组之间的相关性。您需要使更短的阵列更长,或者使更长的阵列更短。我建议你考虑Autoregressive conditional heteroskedasticity和/或Vector autoregression,以便通过延长或缩短阵列来进行操作。之后,您可以应用相关计算。

答案 2 :(得分:1)

使用以下VB.NET代码生成相同大小的数组。它基本上会拉伸/压缩数组,同时它将保持线性值序列。

e.g。 {2,4,6}将被拉伸至9号 {2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0}

Public Sub Process
        Dim requiredLength As Integer = 10
        Dim originalArr() As Double = {2.2, 3.3, 4.4, 4}

        Dim lcm As Integer = GetLCM(originalArr.Length - 1, requiredLength - 1)

        Dim finalArr(requiredLength - 1) As Double
        Dim finalIndex As Integer = 0
        Dim originalIndex As Integer = 0
        Dim currentValue As Double

        Dim portionRatio As Integer = (lcm / (originalArr.Length - 1))
        Dim portionValue As Double = 0
        For i = 0 To lcm
            If portionRatio = 1 Or (i + 1) Mod portionRatio = 1 Then
                currentValue = originalArr(originalIndex)

                If originalIndex < originalArr.Length - 1 Then portionValue = (originalArr(originalIndex + 1) - originalArr(originalIndex)) / (lcm - 1)

                originalIndex += 1
            Else
                currentValue += portionValue
            End If

            If i Mod (lcm / (requiredLength - 1)) = 0 Then
                finalArr(finalIndex) = currentValue
                finalIndex += 1
            End If
        Next
End Sub

Private Function GetGCD(num1 As Integer, num2 As Integer) As Integer
    While (Not num1 = num2)
        If num1 > num2 Then num1 = num1 - num2
        If num2 > num1 Then num2 = num2 - num1
    End While

    Return num1
End Function

Private  Function GetLCM(num1 As Integer, num2 As Integer) As Integer
    Return (num1 * num2) / GetGCD(num1, num2)
End Function

如果您在流程之前和之后在Excel图表上绘制数组。您将看到图表线具有相同的形状。

然后使用任何相关系数公式将其与所需数组进行比较。