Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 在MATLAB中计算运行平均值

计算简单的一维数据向量的运行平均值似乎很简单。确实, 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

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



更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 01:16


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.