计算MATLAB中的运行平均值

时间:2010-08-10 21:39:14

标签: matlab

计算简单1-D数据向量的运行平均值似乎很简单。实际上,FILTER的MATLAB文档很乐意声称:

  

您可以使用过滤器查找不带平均值的平均值   使用for循环。此示例查找运行平均值   使用窗口大小为3的16元素向量:

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(我想从平均值中排除)。

FEX上的

Some people显然也有同样的挫败感,但对我来说这似乎很简单需要自定义代码似乎很奇怪。我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

您还可以使用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,或者使用'valid'参数运行conv。例如,如果您有图像处理工具箱,则可以使用PADARRAY

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