首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用重叠窗口计算均方根

用重叠窗口计算均方根
EN

Stack Overflow用户
提问于 2009-10-17 07:56:17
回答 1查看 2.6K关注 0票数 1

我有一个均方根值的一维浮点数组,每个值用相同的窗口长度计算.比方说

代码语言:javascript
复制
RMS = {0, 0.01, 0.4, ... }

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

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

代码语言:javascript
复制
rollingRMS[0] = RMS from 0 to len
...
rollingRMS[n] = RMS from n to len+n

尽可能有效地计算。我知道这不是很难破解,但是有人已经准备好这方面的代码了吗?

编辑:--我要求提供示例代码,所以我想提供一些示例代码是不错的。以下是皮尔的回答,用C#写成。这与我最初的问题有点不同,因为我意识到,如果得到的数组与原始数组的大小相同,并且在每个元素上都有窗口结束,那就太好了。

代码语言:javascript
复制
// 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);
} 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-17 08:51:49

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

代码语言:javascript
复制
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

不难发现:

代码语言:javascript
复制
SquareOfRollingRMS[i] = RollingRMS[i-1] * LEN - a[i-1]^2 + a[i+LEN-1]^2
RollingRMS[i] = SqurefOfRollingRMS[i]^(1/2)

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

编辑:

通过将LEN移动到方程的左边,您可以节省一些除法和乘法运算。这可能会加速很多,因为划分通常是相对缓慢的。

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1581686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档