Je me demandais si quelqu'un pouvait me diriger vers un algorithme / technique utilisée pour comparer les signaux dépendants du temps. Idéalement, cet algorithme hypothétique prendrait en 2 signaux en tant qu'entrants et retournerait un nombre qui serait le pourcentage de similarité entre les signaux (0 étant que les 2 signaux sont statistiquement non liés et que ce soit un match parfait). P>
Bien sûr, je me rendra compte qu'il y a des problèmes de ma demande, à savoir que je ne suis pas sûr de définir correctement la «similitude» dans le contexte de la comparaison de ces 2 signaux, alors si quelqu'un pouvait aussi me diriger dans la bonne direction. (Quant à ce que je devrais regarder / savoir, etc.), j'apprécierais aussi. P>
6 Réponses :
Je ne connais pas le traitement du signal, il s'agit donc d'une suppose ..:
Votre signal est votre signal efficacement une liste des paires commandées (x, y) code>, où
x est le temps et
y code> l'amplitude? Si oui, alors peut-être que vous pourriez peut-être jeter alors la coordonnée du temps - par exemple: p>
Comparing: [(y0,z0), (y1,z1), (y2,z2), (y3,z3), ...]
solution générale: strong> Vous pouvez incliner les données dans des histogrammes et utiliser un test chi-carré ou un test Kolomogrov. P>
Les deux sont explicitement destinés à estimer les chances que les deux distributions représentent des échantillons aléatoires de la même distribution subînée EM> (c'est-à-dire avoir la même forme à la statistique). P>
Je ne connais pas la mise en œuvre de la CA au sommet de ma tête, mais root fournit c ++ Mise en œuvre des deux: p>
Je crois que les docs pointent sur certains papiers aussi. P>
Je pense que CERNLIB fournit à la fois des algorithmes de Fortran77, que vous peut em> lien vers c. La traduction du code racine peut être plus facile. P>
Vous pouvez essayer une transformation rapide Fourier (rechercher FFT à Wikipedia, il existe des bibliothèques open source pour effectuer des conversions). P>
FFTS transformera vos données du domaine temporel (c'est-à-dire une impulsion à 1s, 2s, 3s, 3s, 4s ...) aux données dans le domaine de fréquence (c'est-à-dire une impulsion chaque seconde). P>
Ensuite, vous pouvez comparer des fréquences et leurs forces relatives plus facilement. Ce devrait être une étape dans la bonne direction pour vous. P>
Pas une mauvaise suggestion pour certaines sortes d'informations, mais vous quittez réellement le PO avec le même problème: comment deux comparent à Spectra.
DMCKEE: Sauf que les signaux transformés de Fourier seraient comparables point par point sans changement. Au fait, "Spectra" est le mauvais terme pour les signaux d'origine, car cela impliquerait de l'énergie (ou une mesure équivalente) sur l'axe X.
Le Fonction de corrélation croisée est la solution de traitement de signal classique. Si vous avez accès à MATLAB, voir la fonction XCORL. La corrélation croisée suppose que La «similarité» que vous recherchez est une mesure de la relation linéaire entre les deux signaux. La définition de signaux de longueur finis à valeur réelle avec index de temps Bien que vous demandiez un numéro, la fonction est assez intéressante. Le domaine de fonction si si plus généralement, ci-dessous est un résumé de la corrélation croisée bien / mauvaise pour. P> La corrélation fonctionne bien pour déterminer si un signal est lié linéairement à un autre, c'est-à-dire de Pour obtenir plus de béton, supposons que pour le cas particulier de où la corrélation croisée sera Dans tous les cas, la normalisation de la fonction de corrélation croisée et la recherche de la valeur maximale vous indiquera Si les signaux sont potentiellement linéaires liés - si le nombre est faible, comme moins de 0,1, je serais à l'aise de les déclarer sans rapport. Plus élevé que cela et je l'examinerai plus avec précaution, graphique à la fois les fonctions de corrélation croisée normalisées et non formées et en regardant la structure. Une corrélation croisée périodique implique que les deux signaux sont périodiques et une fonction de corrélation croisée qui est sensiblement supérieure autour de max (abs (xcorr (signal1, signal2, 'coeff'))) code> vous donnerait spécifiquement ce que vous recherchez et qu'un équivalent existe également en python.
n = 0..n-1 code> est: p>
g < / Code> passe de
-n..n code> (à l'extérieur de cette plage du produit à l'intérieur de la somme est 0). p>
g code> est appelé le domaine de lag. P>
x1 code> et
x2 code> sont liés par un quart de temps, le La fonction de corrélation croisée aura son apogée au décalage correspondant au décalage. Par exemple, si vous aviez
x1 = sin] [wn] code> et
x2 = sin + phi] code>, donc deux ondes sinusoïdales à la même fréquence et à la même phase, la croix -Correlation fonctionnerait son pic au décalage correspondant au déphasage de la phase. p>
x2 code> est une version mise à l'échelle de
x1 code>, la corrélation croisée va échouer aussi. Vous pouvez normaliser la fonction à un coefficient de corrélation en divisant par
sqrt (somme (x1 ^ 2) * somme (x2 ^ 2)) code> et apportez-le dans
0..1 code > En prenant une valeur absolue (cette ligne de matlab a ces opérations). P>
x2 (t) = somme {n = 0..k-1} (a_n * x1 (t + phi_n)) code>
où x1 (t) code> et
x2 (t) code> sont les signaux en question,
a_n code> sont des facteurs d'échelle et
phi_n code > sont des quarts de temps. Les implications de ceci sont les suivantes: p>
(phi_n <> 0 pour certains n) code> La fonction de corrélation croisée sera non nulle. li>
(a_n <> 0 pour certains N) code> La fonction de corrélation croisée sera non nulle. li>
a_n code> et
phi_n code> ne sont pas zéro pour un certain nombre de n) La fonction de corrélation sera non nulle. Notez que c'est aussi une définition d'un filtre linéaire. LI>
ol>
x1 code> est un signal aléatoire à large bande. Laissez
x2 = x1 code>. Maintenant, la fonction de corrélation croisée normalisée sera exactement 1 à G = 0 et près de 0 partout ailleurs. Maintenant, laissez
x2 code> être une version filtrée (linéairement) de
x1 code>. La fonction de corrélation croisée ne sera pas nulle proche de
g = 0 code>. La largeur de la partie non nulle dépendra de la largeur de bande du filtre. P>
x1 code> et
x2 code> étant périodique, le Les informations sur la phase de déphasage de la partie originale de la réponse s'appliquent. P>
g = 0 code> implique un signal est une version filtrée de l'autre. P> p >
Il n'est pas tout à fait évident de la question, mais si Oort veut une mesure de la forme de la forme (plutôt que de la phase de phases), la corrélation croisée est inférieure à optimale: donné un signal de base S_B et deux signaux de test T_1, T_2 , il ne convient pas bien de dire quel signal de test ressemble le plus au signal de base.
Je recherche une fonction qui donnerait une mesure de la forme de la forme. Qu'est-ce qui serait mieux adapté?
@oort: Regardez ma réponse pour quelques choix. Celles-ci sont plus compliquées que la corrélation croisée, mais elles vont vraiment directement à la matière de similitude de forme.
Y a-t-il un avantage de l'entropie avec une corrélation croisée?
Warping Dynamic Time est une approche que vous pouvez utiliser si les signaux doivent être adaptés par la vitesse. et ralentissement du temps de ralentissement à différentes positions. P>
Vous ne dites pas beaucoup de ce que sont les signaux et quelle mesure de "la similitude" serait significative pour vous. Mais si les signaux sont en phase (c'est-à-dire que vous souhaitez comparer les deux signaux instantanés-instant instantanés et il n'y aura pas de retard à prendre en compte), je vous suggérerais de regarder le corrélateur de Pearson. Il vous donne une valeur de 1 si les deux signaux sont identiques, une valeur de 0 si elles sont totalement différentes, et quelque chose entre les deux si elles riment. En tant qu'avantage supplémentaire, Pearson s'en fiche si les signaux sont amplifiés différemment (sauf si un signal est l'inverse de l'autre, il vous donne le résultat de -1). P>
Cela ressemble-t-il à ce que vous cherchez? P>