计算简单1-D数据向量的运行平均值似乎很简单。实际上,FILTER的MATLAB文档很乐意声称:
您可以使用过滤器查找不带平均值的平均值 使用for循环。此示例查找运行平均值 使用窗口大小为3的16元素向量:
D = [1:0.2:4]';
windowSize = 3;
F = ones(1,windowSize)/windowSize;
Df = filter(F,1,D);
结果:
就我的目的而言,这个结果有两个烦人的事情:输出点n是输入点的平均值n-(windowSize-1)... n(即没有居中,由水平位移证明)并指向可用数据的左侧被视为零。
FILTFILT处理这两个问题,但还有其他缺点。它是信号处理工具箱的一部分,并且它不能很好地处理NaN(我想从平均值中排除)。
FEX上的答案 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。
最简单的填充方法是复制第一个和最后一个值。如果您对数据有更多了解,那么其他方法可能会更合适。