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

How to remove bias when downsampling a vector in 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))

此图表明存在不依赖于向量数量的系统偏差

如何消除这种偏见?有没有办法只给定一个矢量来确定它的大小?

从哪里来的?

代码有两个主要问题:

  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)