基于常量样本的背景减法和内插

时间:2018-10-16 11:50:38

标签: matlab interpolation linear-interpolation

我需要您的专业知识来解决问题。我有以下具有不同列的矩阵。

Time            subsamp raw     filt_BG filter
230.5382060     1       1       1       0
230.5382176     2       1       1       0
230.5382292     1       4       0       1
230.5382407     2       4       0       1
230.5382523     1       3       0       1
230.5382639     2       3       0       1
230.5382755     1       2       1       0
230.5382870     2       2       1       0
230.5382986     1       2       0       1
230.5383102     2       2       0       1
230.5383218     1       1       0       1
230.5383333     2       1       0       1
230.5383449     1       3       1       0
230.5383565     2       3       1       0

它包含两种不同类型的原始数据(第3列)。每种原始数据都有相同的编号。子样本(第2列)。 'filt_BG'和'filter'分隔数据类型。我尝试通过下图说明问题和所需的解决方案。 enter image description here 在上图中(左侧),原始数据被绘制为时间的函数。颜色分别基于“过滤器”和“ filt_BG”表示不同的窗口(子样本)“ sig”和“ BG”。我想从窗口“ BG1”到窗口“ BG2”(子样本到子样本)进行插值,以便可以从“ sig1”和“ sig2”中减去插值数据(子样本到子样本)。从“ BG2”到“ BG3”类似,对“ sig3”和“ sig4”进行内插和减法。这给了我“ solution1”(右上)。现在,如果不存在“ BG3”,那么我只想使用“ BG2”来减去“ sig3”和“ sig4”(solution2,右下方)。解决方案矩阵如下所示。谢谢您的想法/解决方案。请记住,我将拥有数百万个数据点,而不是此处所述的简单数据。另外,我没有任何工具箱,只有可用的matlab。任何基于工具箱的解决方案都可以。

Time            subsamp solution1   solution2   
230.5382060     1       NaN         NaN
230.5382176     2       NaN         NaN
230.5382292     1       2.5         2.5
230.5382407     2       2.5         2.5
230.5382523     1       1.5         1.5
230.5382639     2       1.5         1.5
230.5382755     1       NaN         NaN
230.5382870     2       NaN         NaN
230.5382986     1       -0.5        0
230.5383102     2       -0.5        0
230.5383218     1       -1.5        -1
230.5383333     2       -1.5        -1
230.5383449     1       NaN         NaN
230.5383565     2       NaN         NaN 

最好的问候

1 个答案:

答案 0 :(得分:2)

您可以使用cumsum计算插值的样本点和查询点,并可以使用interp1插值数据。如果缺少BG数据(原始数据包含NaN),则需要在其开始和结束处添加第一个和最后一个有效的原始数据,以便interp1可以生成所需的推断。

idxsig = data(:,5)==1;                         % logical index to sig
idxBG  = (data(:,4)==1) & (~isnan(data(:,3))); % logical index to BG   

f1 = find(idxBG,1,'first');
f2 = find(idxBG,1,'last');
                                               % Add the first and the last-
                                               % valid data to the beginning-
                                               % and the end of raw data to-
                                               % get valid extrapolation                           
sig = data(idxsig,3);
BG = [data(f1,3);data(idxBG,3);data(f2,3)];
idxBG =  [true ;idxBG; true];
idxsig = [false; idxsig; false];
                                               % preparing sample and query-
                                               % points for interpolation
idx_sum = cumsum(idxBG);                          
idx_sig = idx_sum(idxsig)+0.5;                 % query points
idx_BG = idx_sum(idxBG);                       % sample points
intr = sig - interp1(idx_BG, BG, idx_sig);
solution = NaN(size(idxBG));
solution(idxsig) = intr                        % reformat to the original size
solution = solution(2:end-1);

solution =

       NaN
       NaN
   2.50000
   2.50000
   1.50000
   1.50000
       NaN
       NaN
  -0.50000
  -0.50000
  -1.50000
  -1.50000
       NaN
       NaN