python - Comment obtenir de haute et basse de l'enveloppe d'un signal?
J'ai pas mal de données bruyantes, et je suis en train de travailler sur une haute et basse de l'enveloppe du signal. C'est un peu comme cet exemple dans MATLAB:
http://uk.mathworks.com/help/signal/examples/signal-smoothing.html
dans "l'Extraction de Crête". Est-il une fonction similaire en Python qui peut le faire? L'ensemble de mon projet a été écrit en Python, le pire des cas, je peux tirer mon tableau numpy et de le jeter dans MATLAB et utiliser cet exemple. Mais je préfère le look de matplotlib... et vraiment abc faire tous ceux I/O entre MATLAB et Python...
Merci,
Une rapide recherche sur google m'a montré ceci: mathworks.com/matlabcentral/fileexchange/...
Et il y a aussi celles-ci: dsp.stackexchange.com/a/3464, stackoverflow.com/questions/30889748/..., scipy.github.io/devdocs/generated/scipy.signal.hilbert.html
Et il y a aussi celles-ci: dsp.stackexchange.com/a/3464, stackoverflow.com/questions/30889748/..., scipy.github.io/devdocs/generated/scipy.signal.hilbert.html
OriginalL'auteur | 2015-12-12
Vous devez vous connecter pour publier un commentaire.
Autant que je suis conscient qu'il n'existe pas une telle fonction dans Numpy /Scipy /Python. Cependant, il n'est pas difficile d'en créer un. L'idée générale est la suivante:
Étant donné un vecteur de valeurs (s):
Comme vous pouvez le voir, il s'agit de la séquence de trois étapes (Trouver l'emplacement, l'ajustement du modèle, d'évaluer modèle) mais appliquée deux fois, une fois pour la partie supérieure de l'enveloppe et l'autre pour le bas.
Pour recueillir les "pics" de (s) vous avez besoin de trouver les points où la pente de (s) passe du positif au négatif et à recueillir le "creux" de (s) vous avez besoin de trouver les points où la pente de (s) passe du négatif au positif.
Un pic exemple: s = [4,5,4] 5-4 est positif 4-5 est négatif
Un à travers un exemple: s = [5,4,5] 4-5 est négatif 5-4 est positif
Voici un exemple de script pour vous obtenir a commencé avec beaucoup de commentaires en ligne:
Ce qui produit ce résultat:
Points d'amélioration:
Le code ci-dessus n'est pas filtre des pics ou des creux qui peuvent être présentes plus proche que d'un certain seuil de "distance" (Tl) (temps). Ceci est similaire à la deuxième paramètre de
envelope
. Il est facile de l'ajouter si, en examinant les différences entre les valeurs consécutives deu_x,u_y
.Cependant, une rapide amélioration sur le point mentionné précédemment est de filtre passe-bas de vos données avec une moyenne mobile de filtre AVANT interpolation supérieure et inférieure de l'enveloppe de fonctions. Vous pouvez le faire facilement par convolution de votre (s), avec un filtre à moyenne mobile. Sans aller jusqu'à un grand détail ici (peut le faire si nécessaire), afin de produire une moyenne mobile de filtre qui fonctionne sur N échantillons consécutifs, vous devez faire quelque chose comme ceci:
s_filtered = numpy.convolve(s, numpy.ones((1,N))/float(N)
. Plus le (N) la douceur de vos données apparaît. Veuillez noter, cependant, que cela va changer votre (s) valeurs de (N/2) échantillons vers la droite (danss_filtered
) en raison de quelque chose qui est appelé le retard de groupe de l'effet de lissage du filtre. Pour plus d'informations sur la moyenne mobile, veuillez consulter ce lien.Espère que cette aide.
(Heureux de ammend la réponse, si plus d'informations sur l'application d'origine est fourni. Peut-être que les données peuvent être pré-traitées dans une mesure plus appropriée (?) )
Heureux d'entendre qu'il était utile. Une parcelle d'un exemple de vos données peuvent aussi aider. Quel est le signal de réfléchir en termes de dynamique moléculaire?
L'énergie totale à terme, ce qui est totalement chaos dû à des erreurs numériques...
OriginalL'auteur A_A
Bâtiment sur @A_A 's réponse, remplacez le signe de vérifier avec nim/max de test pour la rendre plus solide.
Si vous vous attendez à ce que la fonction soit croissante, essayez:
pour la partie inférieure de l'enveloppe.
OriginalL'auteur mousomer