在 MATLAB 中计算滑动 window 的平均值

Compute mean value over a sliding window in MATLAB

我有一个时间序列数据或考虑一个长度为 N 的实数值数据。我想创建长度为 k 的子块,即 window 长度。 k的值可以任意选择。这会产生问题,因为 window 大小在数据中是相同的。我想将每个子块存储在一个数组中。但我坚持创建数据的子块并包括检查,以便 (mod(N, nseg)) nseg 必须被数据长度整除。

N = 512; %length of the time series
data = rand(N,1);
window_length = 30;  %k
Nseg = floor(N/window_length) %Number of segments or blocks

Modified_Data = [mean(reshape(data,window_length,Nseg))]; %Throws error 

如果您有图像处理工具箱,您可以使用 im2col 在整个时间序列上滑动特定的块大小。输出的每一列代表来自其中一个块的数据。

values = im2col(data, [window_length 1], 'distinct');

因为看起来您只想要每个块的平均值,您也可以使用 blockproc 来执行此操作。

means = blockproc(data, [window_length, 1], @(x)mean(x.data));

如果您没有图像处理工具箱,您可以使用 accumarray 来执行此任务。

means = accumarray(floor((0:(N-1)).'/window_length) + 1, data, [], @mean);

如果您想丢弃超出可被 window_length 整除的数字的任何数据,您可以使用类似以下内容的方式执行此操作:

data = data(1:(numel(data) - mod(numel(data), window_length)));

如果你想要重叠数据,你要么想要使用直接卷积(首选方法)

means = conv(data(:), ones(5, 1)/5, 'same');

或者您可以通过省略最后一个输入来创建具有 im2col 的重叠块。

values = im2col(data, [window_length 1]);
means = mean(values 1);

如果我没有正确理解你的问题,那就很简单了:

filter(ones(N,1)/N,1,signal)

如果您考虑用 [1/N 1/N 1/N...1/N] 过滤就是计算局部均值...

如果您有 R2016a+,请考虑使用内置 movmean 功能:

N = 512; %length of the time series
data = rand(N,1);
window_length = 30;  %k
Modified_Data = movmean(data, window_length);

有关详细信息和其他选项,请参阅文档。