0

パワー スペクトルから信号の帯域幅を測定しようとしています。相対振幅値を指定して、最小値と最大値を抽出できるようにしたいと考えています。私は「seewave」を使用してパワースペクトルを計算しており、密度プロットを作成してアブラインを提供できますが、アブラインがプロットと交差する場所をRに教えてもらう方法がわかりません。信号の品質に応じて、関心のある相対振幅値を変更する必要がありますが、R を使用して帯域幅を測定する簡単な方法を見つけたいと考えています。よろしくお願いします!

power.spec <- spec(IBK.trill.1, flim=c(0,2))
pow.spec <- as.matrix(power.spec)
head(pow.spec)
#                x           y
# [1,] 0.000000000 0.007737077
# [2,] 0.007470703 0.029795630
# [3,] 0.014941406 0.021248476
# [4,] 0.022412109 0.015603801
# [5,] 0.029882813 0.014103307
# [6,] 0.037353516 0.014584454
freq <- pow.spec[1:2941,1]
head(freq)
# [1] 0.000000000 0.007470703 0.014941406 0.022412109 0.029882813 0.037353516
ampl <- pow.spec[,2]
head(ampl)
# [1] 0.007737077 0.029795630 0.021248476 0.015603801 0.014103307 0.014584454
plot(ampl ~ freq, type="l",xlim=c(0,2))
abline(h=0.45)

ここに画像の説明を入力

4

1 に答える 1

1

しきい値を超える "y" 値の識別結果を保存します。

wspec <- which( power.spec[, "y"] > 0.45)

次に、これらのインデックスを使用して「x」値から引き出し、最初と最後のインデックスに垂直線を配置します。

abline( v= power.spec[ c( wspec[1], tail(wspec, 1) ) , "x"],  col="blue" )

as.matrixところで、私はあなたのバージョンではなく元の「power.spec」値を提案しましたspec。これは、行列を返すため、強制は必要ありません。ページの最初の例でこれをテストしました?spec。私はあなたが本当に好き嫌いをして、しきい値が超過した場所とその直前と直後の「x」の平均を取ることができると思います。次に、次のようになります。

abline( v= c( mean( myspec[ c( wspec[1]-1,  wspec[1]), "x"]) , 
            mean( myspec[ c( tail(wspec, 1), tail(wspec, 1)+1 ) , "x"]) ),  col="blue" ) 

ここに画像の説明を入力

私は違いを見てdiff、私の例での典型的な分離は

mean( diff(myspec[ , "x"]) )
[1] 0.0005549795

したがって、合理的な見積もりを得るために、その量の半分だけ遡って進めることができたはずです. (これを「半分の高さ」の見積もりとして使用しましたmax(myspec[, "y"])/2:)

于 2016-04-10T01:04:58.363 に答える