我有一组向量,这些向量包含任意形状,例如具有单个最大值的三角形脉冲。我需要通过整数因子对这些向量进行下采样。相对于向量长度的最大值位置应保持不变。
下面的代码显示,当我这样做时,降采样步骤引入了一个bias=-0.0085
,它应该平均为零。
根据矢量的数量,偏差似乎并没有太大变化(尝试200到800个矢量)。
我还尝试了不同的重采样功能,例如downsample
和decimate
,导致相同的结果。
datapoints = zeros(1000,800);
for ii = 1:size(datapoints,2)
datapoints(ii:ii+18,ii) = [1:10,9:-1:1];
end
%downsample each column of the data
datapoints_downsampled = datapoints(1:10:end,:);
[~,maxinds_downsampled] = max(datapoints_downsampled);
[~,maxinds] = max(datapoints);
%bias needs to be zero
bias = mean(maxinds/size(datapoints,1)-maxinds_downsampled/size(datapoints_downsampled,1))
此图显示存在不依赖于向量数的系统偏差
如何消除这种偏见?仅给定一个向量,有没有办法确定其幅度?
它来自哪里?
代码有两个主要问题:
将索引除以向量的长度会导致较小的偏差:如果最大值位于第一个元素,则即使子采样保留了包含元素的元素,1/1000也不会等于1/100。最大值。需要对此进行校正,方法是在除法之前减去1,然后在除法之后加上1/1000。
二次抽样的10倍也会导致偏差:由于我们仅确定整数位置,因此在1/10情况下我们保留位置,在4/10情况下我们将位置朝一个方向移动,在5/10的情况下,我们将位置朝另一个方向移动。解决方案是使用奇数次采样因子,或以次采样精度确定最大值的位置(这首先需要适当的低通滤波)。
下面的代码是对OP中代码的修改,它绘制了误差与位置的散布图以及OP的偏差图。第一个情节有助于确定上述问题2。我已经制作了二次采样因子和二次采样变量的偏移量,建议您使用这些值来了解正在发生的事情。为了避免采样偏差,我还对最大位置进行了随机设置。注意我也使用N/factor
而不是size(datapoints_downsampled,1)
。如果N/factor
不是整数,则下采样矢量的大小将使用错误的值。
N = 1000;
datapoints = zeros(N,800);
for ii = 1:size(datapoints,2)
datapoints(randi(N-20)+(1:19),ii) = [1:10,9:-1:1];
end
factor = 11;
offset = round(factor/2);
datapoints_downsampled = datapoints(offset:factor:end,:);
[~,maxinds_downsampled] = max(datapoints_downsampled,[],1);
[~,maxinds] = max(datapoints,[],1);
maxpos_downsampled = (maxinds_downsampled-1)/(N/factor) + offset/N;
maxpos = (maxinds)/N;
subplot(121), scatter(maxpos,maxpos_downsampled-maxpos)
bias = cumsum(maxpos_downsampled-maxpos)./(1:size(datapoints,2));
subplot(122), plot(bias)