2016-04-09 1 views
0

J'essaie de mesurer la bande passante d'un signal à partir des spectres de puissance. Je veux pouvoir extraire les valeurs min et max en fonction d'une valeur d'amplitude relative. J'ai utilisé "seewave" pour calculer les spectres de puissance, et je peux faire un tracé de densité, et fournir l'abline, mais je ne peux pas comprendre comment obtenir R pour me dire où l'abline croise la parcelle. Je vais devoir changer les valeurs d'amplitude relative d'intérêt, en fonction de la qualité du signal, mais je veux trouver un moyen simple de mesurer la bande passante en utilisant R. Merci d'avance!Mesure de la bande passante d'un signal en 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

Vous pourriez vouloir vérifier? Env ... Exemple d'utilisation: environ (ampl, freq, xout = 0,45) – chinsoon12

Répondre

1

Enregistrer les résultats de l'identification des valeurs "y" qui dépassent le seuil: les valeurs

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

ensuite utilisé ces indices pour tirer des "x" pour placer verticale lignes au premier et dernier indices:

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

BTW, je suggeste d les valeurs «power.spec» d'origine plutôt que votre version as.matrix car spec renvoie une matrice, ce qui évite d'avoir recours à la coercition. J'ai testé cela sur le premier exemple de la page ?spec. Je suppose que vous pourriez être vraiment difficile et essayer de prendre la moyenne de "x" où les seuils étaient en excès et ceux juste avant et après. Ce qui serait alors:

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

Je ne regarde les différences avec diff et la séparation typique dans mon exemple a été

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

donc je aurais pu aller en arrière et en avant par moitié ce montant pour obtenir une estimation raisonnable. (J'ai utilisé cela comme mon estimation pour "demi-hauteur": max(myspec[, "y"])/2)

+0

Merci beaucoup! Cela peut sembler une question stupide, mais comment puis-je extraire les valeurs où les lignes rencontrent l'axe des x? –

+0

Je n'ai aucun moyen de tester cela puisque toutes les valeurs y dans l'exemple que j'utilisais (à cause de votre échec à inclure une méthode d'obtention de 'IBK.trill.1') n'avaient que des valeurs positives. (Et je me demande si c'est aussi le cas avec vos données.) Qu'est-ce que 'min (power.spec [, 'y'])'? La réponse peut dépendre du niveau de précision dont vous avez besoin pour la réponse [. Si vous avez seulement besoin de connaître les valeurs des indices où y [n-1] est un signe et y [n] est un autre signe, alors c'est assez facile (mais vraiment une question différente et je pense qu'on y a déjà répondu.) –