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

问题描述 投票:0回答:1

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

下面的代码显示,当我这样做时,降采样步骤引入了一个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))

This graph shows, that there is a systematic bias that does not depend on the number of vectors

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

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

它来自哪里?

matlab resampling downsampling
1个回答
0
投票

代码有两个主要问题:

  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

© www.soinside.com 2019 - 2024. All rights reserved.