2015-06-22 64 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