在Matlab中对向量进行降采样时如何消除偏差

我有一组向量,这些向量包含任意形状,例如具有单个最大值的三角形脉冲。 我需要通过整数因子对这些向量进行下采样。 最大值相对于向量长度的位置应保持不变。

下面的代码显示,当我这样做时,降采样步骤引入了一个bias=-0.0085,平均应该为零。

根据向量的数量,偏差似乎并没有太大变化(尝试200到800个向量)

我还尝试了downsampledecimate之类的不同重采样函数,以得到相同的结果。

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))

在Matlab中对向量进行降采样时如何消除偏差

此图显示存在一个不依赖于向量数量的系统偏差

如何消除这种偏见?仅给定一个向量,有没有办法确定其幅度?

它来自哪里?

mumu1514 回答:在Matlab中对向量进行降采样时如何消除偏差

代码有两个主要问题:

  1. 将索引除以矢量的长度会导致较小的偏差:如果最大值位于第一个元素,则即使子采样保留了元素,1/1000也不会等于1/100。包含最大值。需要对此进行校正,方法是在除法之前减去1,然后在除法之后加上1/1000。

  2. 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)

output of code above

本文链接:https://www.f2er.com/3014178.html

大家都在问