具有不均匀采样数据的高斯滤波器

时间:2016-01-22 15:27:08

标签: r filter gaussian

我有一个不均匀采样的时间序列,我想将其下采样到20Hz。我通过在0.05s时间窗口(20Hz)中对数据点进行分级并对其应用算术平均值来制作移动平均值。数据框如下所示:

          Time    Right     Left
1  0.000000000 18.21980 30.98789
2  0.009222031 22.15157 37.18590
3  0.022511959 25.63218 42.49231
4  0.029854059 28.43851 46.57811
5  0.039320946 30.43885 49.29414
6  0.052499056 31.60561 50.67852
7  0.059612036 32.01045 50.92879
8  0.076606989 31.80335 50.34975
9  0.082647085 31.18134 49.29151
10 0.090698957 30.35415 48.09110

我用于移动平均线的代码是:

data$group_num <- floor(data$Time/0.05)

data2<-NULL

data2$Right = aggregate(data$Right,
                               list(group_num=data$group_num), mean)
data2$Left = aggregate(data$Left,
                                     list(group_num=data$group_num), mean)
data2$Time = aggregate(data$Time,
                                 list(group_num=data$group_num), mean)

然而,为了优化它,我想制作一个高斯滤波器,以便bin中间的数据点具有更大的权重。我找不到任何可以处理不均匀采样的函数。因此,我开始写一个脚本,我设法给他们权重。

data$weight <- ((data$Time-data$group_num*0.05)*((data$group_num+1)*0.05-data$Time))^5

我必须通过它们自己的bin中的权重的平均值来规范化这些权重(例如)。通过尝试将这些权重标准化为他们自己组的平均值,我遇到了功能太慢的问题。有人可以帮我一把吗??

1 个答案:

答案 0 :(得分:0)

我终于设法做了我想做的事。帮助我克服这个问题的关键功能是ave()。感谢上帝。所以这就是我基本上做的:

data$weight <- (abs(data$Time-(data$group_num*0.05+0.025)))^(-1)

data$Norm<-ave(data$weight,data$group_num,FUN=function(x) x/sum(x))

data$Time2<- data$Time*data$Norm

data$Right2<- data$Right*data$Norm

data$Left2<- data$Left*data$Norm

data2$Time<- tapply(data$Time2, data$group_num, sum)

data2$Right<- tapply(data$Right2, data$group_num, sum)

data2$Left<- tapply(data$Left2, data$group_num, sum)

感谢Marat Talipov的帮助。从我在你的代码中看到的,这也可以工作。但是因为这只是工作得很好而且足够快,所以我会坚持下去。