Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
计算简单的一维数据向量的运行平均值似乎很简单。确实, FILTER的MATLAB文档很高兴地宣称:
您可以使用过滤器查找运行平均值,而无需使用for循环。本示例使用16的窗口大小查找16元素向量的运行平均值:D = [1:0.2:4]'; windowSize = 3; F = ones(1,windowSize)/windowSize; Df = filter(F,1,D); 结果: 上例http://www.tc.umn.edu/~vande642/pictures/untitled.png中原始数据和经过过滤的数据图的图像 就我的目的而言,关于此结果有两个令人讨厌的事情:输出点n是输入点n-(windowSize-1).. n(即,未居中,如水平移位所示)的平均值,并且指向该点的左侧可用数据视为零。 FILTFILT处理这两个问题,但还有其他缺点。它是Signal Processing Toolbox的一部分,并且不能很好地处理NaN(我想从平均值中排除掉NaN)。 FEX上的某些 人显然也有同样的挫败感,但是对我来说,这种简单的事情需要自定义代码似乎很奇怪。我在这里想念什么吗? 回答: 您还可以使用卷积进行移动平均。因此,您无需担心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 。 填充的最简单方法是复制第一个和最后一个值。如果您对数据了解更多,其他方法可能会更适合。 更多&回答... |
![]() |
![]() |