背景:我对从一组录音机中定位声源感兴趣。每个音频阵列由6个定向麦克风组成,每60度(0、60、120、180、240、300度)均匀间隔。我有兴趣寻找具有最大信号强度集的相邻麦克风。数据由时间戳,天线编号和方位以及信号强度组成。下面我附上了一个简化的数据集。

    df <- data.frame(ant.bearing = seq(0,300, by=60), sig = c(98, 60, 44, 67, 58, 91), ts=1)


目标:从这个数据集中,我想使用一个函数来提取两个具有最大信号强度的相邻天线(即,在上面的示例代码中,轴承的方位角为0和300度),同时考虑到该数据是圆形的。自然与天线0和300是邻居。输出将是满足上述任务的两行数据,例如在上述情况下,第1和第6行。

我尝试过的

direction.finder <- function(dat){
    # finding bearing with max signal strength
    max <- dat[dat$sig == max(dat$sig),][1,]

    # finding signal strengths of neighbor antennas and pulling out which has highest

    left  = dat[dat$ant.bearing==max$ant.bearing-60,]
    right = dat[dat$ant.bearing==max$ant.bearing+60,]

    if(max$ant.bearing==0)
        left = dat[dat$ant.bearing==300,]
    if(max$ant.bearing==300)
        right = dat[dat$ant.bearing==0,]

    sub = right

    if(left$sig > right$sig)
        sub = left

    dat <- rbind(max, sub)
}


此当前功能可以很好地解决我的任务,但并不理想。任何改进我的代码功能的建议或技巧将不胜感激。

最佳答案

我将计算df中的所有行对:

(pairs <- cbind(1:nrow(df), c(2:nrow(df), 1)))
#      [,1] [,2]
# [1,]    1    2
# [2,]    2    3
# [3,]    3    4
# [4,]    4    5
# [5,]    5    6
# [6,]    6    1


您可以找到与which.max最佳的配对:

(best.row <- which.max(df$sig[pairs[,1]] + df$sig[pairs[,2]]))
# [1] 6


最后,您可以查找相应的天线方位:

df$ant.bearing[pairs[best.row,]]
# [1] 300   0


如果缺少值,可以通过为缺少的条目创建NA值来稍微调整代码:

# Data
df <- data.frame(ant.bearing = seq(0,180, by=60), sig = c(44, 67,88, 52), ts=2)
#   ant.bearing sig ts
# 1           0  44  2
# 2          60  67  2
# 3         120  88  2
# 4         180  52  2

(pairs <- cbind(1:6, c(2:6, 1)))
#      [,1] [,2]
# [1,]    1    2
# [2,]    2    3
# [3,]    3    4
# [4,]    4    5
# [5,]    5    6
# [6,]    6    1

sig <- rep(NA, 6)
sig[1+df$ant.bearing/60] <- df$sig
sig
# [1] 44 67 88 52 NA NA


现在,其余过程类似:

(best.row <- which.max(sig[pairs[,1]] + sig[pairs[,2]]))
# [1] 2
60*(pairs[best.row,]-1)
# [1]  60 120

10-04 16:00
查看更多