【发布时间】:2009-10-17 07:56:17
【问题描述】:
我有一个 root mean square 值的一维浮点数组,每个值都使用相同的窗口长度计算。比方说
RMS = {0, 0.01, 0.4, ... }
现在,可以表示为原始窗口范围的较大窗口的 RMS 可以计算为从 RMS[i] 到 RMS[i + len] 的“参与”RMS 值的 RMS。这里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);
}
【问题讨论】:
标签: c# algorithm math audio statistics