【问题标题】:computing running averages in MATLAB在 MATLAB 中计算运行平均值
【发布时间】:2011-03-28 02:08:09
【问题描述】:

计算简单一维数据向量的运行平均值似乎很简单。事实上,FILTER 的 MATLAB 文档很高兴地声称:

您可以使用过滤器来查找运行平均值,而无需 使用 for 循环。此示例查找运行平均值 一个 16 元素的向量,使用 3 的窗口大小:

D = [1:0.2:4]';
windowSize = 3;
F = ones(1,windowSize)/windowSize;
Df = filter(F,1,D);

结果:

Image of raw and filtered data plot from above example http://www.tc.umn.edu/~vande642/pictures/untitled.png

出于我的目的,这个结果有两个令人讨厌的地方:输出点 n 是输入点 n-(windowSize-1)..n 的平均值(即不居中,如水平移位所示)并指向可用数据的左侧被视为零。

FILTFILT 处理这两个问题,但还有其他缺点。它是信号处理工具箱的一部分,它不能很好地处理 NaN(我希望将其排除在平均值之外)。

Somepeople 在 FEX 上显然有同样的挫败感,但我觉得奇怪的是,这么简单的事情需要自定义代码。我在这里遗漏了什么?

【问题讨论】:

  • filtfilt 不依赖于其他 Signal Processing Toolbox 函数,是 m-Code。因此,您只需将其复制粘贴到您的代码中即可根据需要进行更改。
  • 如果您没有 SP 工具箱,则不确定版权。我的直觉告诉我这是违法的。

标签: matlab


【解决方案1】:

您还可以使用convolution 进行运行平均。因此,您无需担心 filtfilt。

例如,您可以使用

D = [1:0.2:4];
windowSize = 3;
F = ones(1,windowSize)/windowSize;
Df = conv(D,F);
%# if you didn't use 'valid', Df is larger than D. To correct:
halfSize = floor(windowSize/2);
Df = Df(halfSize+1:end-halfSize);

当然,您仍然需要处理边缘,因此您应该先填充 D,或者使用“有效”参数运行 conv。例如,如果您有图像处理工具箱,您可以使用PADARRAY

最简单的填充方法是复制第一个和最后一个值。如果您对自己的数据有更多了解,其他方法可能会更适合。

【讨论】:

  • true.. 但如果您希望结果是可用数据的平均值(因此对于 windowSize = 3,第一个数据点的输出是点 1 和 2 的平均值),填充得到棘手!如果您绘制您给出的示例,并且 conv.m 似乎也有滞后。当然这一切都是可行的,但似乎又比应该做的工作多!
  • 啊,'valid' 参数很有用——看来是时候升级我的 MATLAB 了,我的当前版本没有它!
  • @Matt:默认情况下,Df大于D。如果你plot(Df(2:end-1)),你会看到边缘效应,但没有滞后。
  • 嗯.. 有没有办法进行填充并获得平均值?似乎如果说 3 个 bin 与 1 个相比从边缘下降,则您需要填充不同的值才能获得第一个 bin 的正确平均值。具体来说,您需要填充有效箱的平均值,这取决于所考虑的点。所以我不确定填充是否可行!
  • @Matt:你知道什么样的函数可以描述你的数据吗?如果您的数据应该是恒定的(但有噪声),您可以简单地镜像数据。如果您知道数据是线性的,则可以使用2*data(1)-data(2:1+halfSize) 填充,这对于您在 OP 中提供的示例数据非常有效。
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
相关资源
最近更新 更多