代码之家  ›  专栏  ›  技术社区  ›  Ville Koskinen

用重叠窗口计算RMS

  •  1
  • Ville Koskinen  · 技术社区  · 16 年前

    我有一个一维的浮点数组 root mean square 值,每个值使用相同的窗口长度计算。比方说

    RMS = {0, 0.01, 0.4, ... }
    

    RMS[i] RMS[i + len] . 在这里 len

    我想创建一个滚动窗口。我想要

    rollingRMS[0] = RMS from 0 to len
    ...
    rollingRMS[n] = RMS from n to len+n
    

    尽可能有效地计算。我知道这并不难破解,但有人准备好了代码吗?

    编辑: 终止 在每个元素上。

    // The RMS data to be analysed
    float[] RMS = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    // The resulting rolling RMS values
    float[] rollingRMS = new float[RMS.Length];
    // Window lenght
    int len = 3;
    // Calculate: rollingRMS will hold root mean square from windows which end at 
    // each respective sample in the RMS array. For the first len samples the input
    // will be treated as zero-padded
    for (int i = 0; i < RMS.Length; i++)
    {
        if (i == 0)
            rollingRMS[i] = (float)Math.Sqrt((RMS[i] * RMS[i] / len));
        else if (i < len)
            rollingRMS[i] = (float)Math.Sqrt(
                (   RMS[i] * RMS[i] + 
                    len * (rollingRMS[i - 1] * rollingRMS[i - 1])
                ) / len);
        else
            rollingRMS[i] = (float)Math.Sqrt(
                (   len * (rollingRMS[i - 1] * rollingRMS[i - 1]) +
                    RMS[i] * RMS[i] -
                    RMS[i - len] * RMS[i - len]
                ) / len);
    } 
    
    1 回复  |  直到 16 年前
        1
  •  3
  •   pierrotlefou    16 年前

    我不确定我是否正确理解了你的问题。但是让我试试。

    a=[1,2,3,4,5,6,7,8,9,10]
    LEN = 3
    SquareOfRollingRMS[0] = (a[0]^2 + a[1]^2 + a[2]^2          ) / LEN
    SquareOfRollingRMS[1] = (         a[1]^2 + a[2]^2 + a[3]^2 ) / LEN
    

    SquareOfRollingRMS[i] = RollingRMS[i-1] * LEN - a[i-1]^2 + a[i+LEN-1]^2
    RollingRMS[i] = SqurefOfRollingRMS[i]^(1/2)
    

    这样做可以避免重新计算重叠窗口。

    编辑:

    您可以通过移动来保存一些除法和乘法操作 LEN

    LEN_by_SquareOfRollingRMS[0] = (a[0]^2 + a[1]^2 + a[2]^2)
    LEN_by_SquareOfRollingRMS[i] = LEN_by_RollingRMS[i-1] - a[i-1]^2 + a[i+LEN-1]^2