gpt4 book ai didi

c# - 使用重叠窗口计算 RMS

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:44 34 4
gpt4 key购买 nike

我有一个一维 float 组 root mean square值,每个值都使用相同的窗口长度计算。假设

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

现在,可以表示为原始窗口范围的较大窗口的 RMS 可以计算为从 RMS[i]RMS[i + len]。这里 len 是较大窗口的长度除以原始窗口的长度。

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

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

尽可能高效地计算。我知道这不是很难破解,但是有人有现成的代码吗?

编辑:我要求提供示例代码,所以我想提供一些代码会比较合适。下面是根据pierr的回答,用C#写的。这与我原来的问题有点不同,因为我意识到如果生成的数组与原始数组具有相同的大小并且在每个元素处都有窗口 end 会很好。

// 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);
}

最佳答案

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

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

关于c# - 使用重叠窗口计算 RMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1581686/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com