2

背景:一連のオーディオ レコーダーから音源をローカライズすることに興味があります。各オーディオ アレイは、60 度 (0、60、120、180、240、300 度) ごとに均等に配置された 6 つの指向性マイクで構成されます。信号強度のセットが最大である隣接するマイクのペアを見つけることに興味があります。データは、タイムスタンプ、アンテナ番号と方向、および信号強度で構成されます。以下に、単純化されたデータセットを添付しました。

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

目標:このデータセットから、このデータが円形であるという事実を考慮しながら、関数を使用して、信号強度のセットが最大である 2 つの隣接するアンテナ (つまり、上記のサンプル コードでは方位 0 度と 300 度のアンテナ) を抽出したいと考えています。自然とアンテナ 0 と 300 は隣接しています。出力は、上記のタスクを満たす 2 行のデータになります。たとえば、上記の場合は行 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)
} 

この現在の機能は、私のタスクの適切な回避策として機能しますが、理想的ではありません。私のコードの機能を改善するための提案やヒントは大歓迎です。

4

1 に答える 1

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
于 2015-06-22T04:28:22.520 に答える