2016-04-09 17 views
0

Ich versuche die Bandbreite eines Signals aus den Leistungsspektren zu messen. Ich möchte in der Lage sein, die Min- und Max-Werte bei einem relativen Amplitudenwert zu extrahieren. Ich habe "seewave" benutzt, um die Leistungsspektren zu berechnen, und ich kann ein Dichtediagramm erstellen und die Abline bereitstellen, aber ich kann nicht herausfinden, wie ich R dazu bringen kann, mir zu sagen, wo sich die Abline mit der Kurve schneidet. Ich werde die relativen Amplitudenwerte, die von Interesse sind, abhängig von der Signalqualität ändern, möchte aber einen einfachen Weg finden, die Bandbreite mit R zu messen. Vielen Dank im Voraus!Messbandbreite eines Signals in 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) 

enter image description here

+0

Sie möchten vielleicht auschecken? Ca .. Beispielverwendung: ca. (ampl, freq, xout = 0,45) – chinsoon12

Antwort

1

Speicher der Ergebnisse der Identifikation von „y“ -Werte, die Ihren Schwellenwert überschreiten:

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

Dann diese Indizes verwendet, um von den „x“ Werten ziehen vertikal zu platzieren Zeilen am ersten und letzten Indizes:

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

BTW, ich suggestete d die ursprünglichen "power.spec" -Werte lieber als Ihre as.matrix Version, weil spec eine Matrix zurückgibt, so dass Zwang nicht benötigt wird. Ich habe dies am ersten Beispiel aus der ?spec Seite getestet. Ich nehme an, du könntest echt wählerisch werden und versuchen, den Mittelwert von "x" zu nehmen, wo die Schwellenwerte überschritten wurden, und die Werte davor und danach. Welches wäre dann:

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") 

enter image description here

ich mit diff auf die Unterschiede aussahen und die typische Trennung in meinem Beispiel

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

So war ich zurück und voraus auf die Hälfte hätte gegangen um eine angemessene Schätzung zu erhalten. (Ich benutzte dies als meine Schätzung für "halbe Höhe": max(myspec[, "y"])/2)

+0

Vielen Dank! Dies mag wie eine dumme Frage erscheinen, aber wie extrahiere ich dann die Werte, wo die Linien die x-Achse treffen? –

+0

Ich habe keine Möglichkeit, das zu testen, da alle y-Werte in dem Beispiel, das ich verwendete (weil Sie keine Methode zum Abrufen von "IBK.trill.1" enthielten) nur positive Werte hatten. (Und ich frage mich, ob das auch bei Ihren Daten der Fall ist.) Was ist 'min (power.spec [, 'y'])'? Die Antwort kann davon abhängen, welche Genauigkeit Sie für die Antwort benötigen [. Wenn Sie nur die Werte von Indizes kennen müssen, wo y [n-1] ein Vorzeichen ist und y [n] ein anderes Vorzeichen ist, dann ist es ziemlich einfach (aber wirklich eine andere Frage und eine, die ich vermute, wurde bereits beantwortet.) –

Verwandte Themen