2015-06-22 51 views
2

背景:我有兴趣从一套音频记录器本地化声源。每个音频阵列由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) 
} 

这个电流函数充当我的任务,但它不是理想的好解决方法。任何建议或提示,以改善我的代码的功能将不胜感激。

回答

2

我会计算所有的行对在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