oui oui oui ! allez reteste !
mais dans le code denomX et denomY on peut pas les sortir non ? ça depend des XValue et YValue ?
oui oui oui ! allez reteste !
mais dans le code denomX et denomY on peut pas les sortir non ? ça depend des XValue et YValue ?
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
est ce que c'est trop demandé de réediter le ptit code
je dois lire des choses sur cette histoire de decalage ça a du mal a rentrer ds ma ptite tete de biologiste mais j'y arrive
merci pour l'aide
c'est fait ! je teste ça a l'aire de tourner plus vite en effet
Cette histoire de décalage c'est la difference entre "similarité" et "égalité.
Si on fait seulement une comparaison valeur/valeur de chaque echantillon, on va mesurer l'égalité. En faisant intervenir la notion de "décalage" on permet que deux echantillons soient "egaux" s'ils contiennent les memes valeurs dans le meme ordre.
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Un autre probleme : le coefficient de cross correlation n'est pas sensé etre entre -1 et 1 ? j'ai des valeurs de l'ordre de 100 des 20 ... !
Y aurait il un probleme quelque part ?
voici mon code :
y aurait il un prob kke part ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 double crosscorrelation (cwt_t xa, cwt_t xb,double Xmoy,double Ymoy,int n,int d){ double result ; //double Xmoy = xrsa(xa,n); //double Ymoy = xrsa(xb,n); int j,start = 0; int end = n; double numerateur = 0,denomX =0, denomY = 0; for(j=start;j<end;j++){ double XValue = xa.cwt[0][j]; int yindex = (j-d)%n; if(yindex<0) yindex+=xb.cwt[0][yindex]; double YValue = xb.cwt[0][yindex]; numerateur += (XValue - Xmoy)*(YValue - Ymoy); denomX = pow((XValue-Xmoy),2); denomY = pow((YValue-Ymoy),2); } // printf("%f \n",numerateur/sqrt(denomX*denomY)); result = numerateur / sqrt(denomX*denomY); return result; }
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
merci pour la correction. j'ai corrigé mais toujours pareil les valeus ne sont pas entre [-1,1] ??
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
salut, moi je me suis servi de ce code pour faire des filtres et autres spectrogrammes sur du son
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 typedef real double; void iwt97(real* x,int n); void fwt97(real* x,int n);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 #include <stdio.h> #include <stdlib.h> real *tempbank=0; /** * fwt97 - Forward biorthogonal 9/7 wavelet transform (lifting implementation) * * x is an input signal, which will be replaced by its output transform. * n is the length of the signal, and must be a power of 2. * * The first half part of the output signal contains the approximation coefficients. * The second half part contains the detail coefficients (aka. the wavelets coefficients). * * See also iwt97. */ void fwt97(real* x,int n) { real a; int i; // Predict 1 a=-1.586134342; for (i=1;i<n-2;i+=2) { x[i]+=a*(x[i-1]+x[i+1]); } x[n-1]+=2*a*x[n-2]; // Update 1 a=-0.05298011854; for (i=2;i<n;i+=2) { x[i]+=a*(x[i-1]+x[i+1]); } x[0]+=2*a*x[1]; // Predict 2 a=0.8829110762; for (i=1;i<n-2;i+=2) { x[i]+=a*(x[i-1]+x[i+1]); } x[n-1]+=2*a*x[n-2]; // Update 2 a=0.4435068522; for (i=2;i<n;i+=2) { x[i]+=a*(x[i-1]+x[i+1]); } x[0]+=2*a*x[1]; // Scale a=1/1.149604398; for (i=0;i<n;i++) { if (i%2) x[i]*=a; else x[i]/=a; } // Pack if (tempbank==0) tempbank=(real *)malloc(n*sizeof(real)); for (i=0;i<n;i++) { if (i%2==0) tempbank[i/2]=x[i]; else tempbank[n/2+i/2]=x[i]; } for (i=0;i<n;i++) x[i]=tempbank[i]; } /** * iwt97 - Inverse biorthogonal 9/7 wavelet transform * * This is the inverse of fwt97 so that iwt97(fwt97(x,n),n)=x for every signal x of length n. * * See also fwt97. */ void iwt97(real* x,int n) { real a; int i; // Unpack if (tempbank==0) tempbank=(real *)malloc(n*sizeof(real)); for (i=0;i<n/2;i++) { tempbank[i*2]=x[i]; tempbank[i*2+1]=x[i+n/2]; } for (i=0;i<n;i++) x[i]=tempbank[i]; // Undo scale a=1.149604398; for (i=0;i<n;i++) { if (i%2) x[i]*=a; else x[i]/=a; } // Undo update 2 a=-0.4435068522; for (i=2;i<n;i+=2) { x[i]+=a*(x[i-1]+x[i+1]); } x[0]+=2*a*x[1]; // Undo predict 2 a=-0.8829110762; for (i=1;i<n-2;i+=2) { x[i]+=a*(x[i-1]+x[i+1]); } x[n-1]+=2*a*x[n-2]; // Undo update 1 a=0.05298011854; for (i=2;i<n;i+=2) { x[i]+=a*(x[i-1]+x[i+1]); } x[0]+=2*a*x[1]; // Undo predict 1 a=1.586134342; for (i=1;i<n-2;i+=2) { x[i]+=a*(x[i-1]+x[i+1]); } x[n-1]+=2*a*x[n-2]; } int main97() { real x[32]; int i; // Makes a fancy cubic signal for (i=0;i<32;i++) x[i]=5+i+0.4*i*i-0.02*i*i*i; // Prints original sigal x printf("Original signal:\n"); for (i=0;i<32;i++) printf("x[%d]=%f\n",i,x[i]); printf("\n"); // Do the forward 9/7 transform fwt97(x,32); // Prints the wavelet coefficients printf("Wavelets coefficients:\n"); for (i=0;i<32;i++) printf("wc[%d]=%f\n",i,x[i]); printf("\n"); // Do the inverse 9/7 transform iwt97(x,32); // Prints the reconstructed signal printf("Reconstructed signal:\n"); for (i=0;i<32;i++) printf("xx[%d]=%f\n",i,x[i]); }
merci pour les corrections c'est beaucoup mieux en effet
Ok, la cross correlation c'est fait ça marche tres bien.
j'aurais une autre question. Imaginons la matrice de transformée suivante :
|a b c|
|d e f|
|g h i |
ou abc, def, ghi, correspondent à des spectres de wavelet.
Comment faire pour detecter des regions communes entre les trois vecteurs en les analysant tous ensemble, pas par pair, pour reprendre le meme exemple imaginons que la region delimitée par la colonne 1 et 2 se comporte de la meme manière, dois je faire une cross correlation 2 à 2 entre les 3 vecteurs ou existe il un moyen de dire voila cette region est conservée entre les 3 signaux.
Bien. c'est deja ca.
Oui, si tu comptes utiliser la cross-correlation comme mesure de similarité, tu dois calculer les cross-correlation entre TOUS les vecteurs 2 a 2 (car la mesure de similarité n'est pas transitive: V1~=V2 et V2~=V3 n'implique pas forcement que V1~=V3)Comment faire pour detecter des regions communes entre les trois vecteurs en les analysant tous ensemble, pas par pair, pour reprendre le meme exemple imaginons que la region delimitée par la colonne 1 et 2 se comporte de la meme manière, dois je faire une cross correlation 2 à 2 entre les 3 vecteurs ou existe il un moyen de dire voila cette region est conservée entre les 3 signaux.
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
autrement di j'utilise une fenetre qui se deplace le long des colonnes en calculant la crosscorrelation entre les lignes par paire ! mais pour affirmer que deux fenetres sont pareilles ou similaires je dois fixer un seuil ou une chose dans ce genre ? par exp pour une crosscorrelation > 0.5 on dit que c'est similaire ?
Heu... je ne sais pas trop ce que tu cherches a mesurer comme similarité. Si chaque ligne représente les coefficients des frequences de wavelet, je ne vois pas trop a quoi sert la fenetre par "colonnes".
Oui. Il faut que tu trouves un seuil acceptable. Tu peux faire ca empiriquement a partir de données de test dont tu sais si elles sont similaires ou pas.mais pour affirmer que deux fenetres sont pareilles ou similaires je dois fixer un seuil ou une chose dans ce genre ? par exp pour une crosscorrelation > 0.5 on dit que c'est similaire ?
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
ce que je voulais dire c'est peut on mesurer une similarité locale par exemple entre la position 0 et N je dis qu'à la position P ; 0<P<N les 4 vecteurs sont similaires donc c'est une region conservée entre les 4
J'ai l'impression que la crossimilarité entre les vecteur c'est une mesure de similarité globale.
je me trompe peut etre ?
question idiote :
vecteur V1 = [1,1,1,1]
vecteur V2 = [1,1,1,1]
crosscorrelation 0 ?
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Comment ?Ah ok. Effectivement on peut faire ca
Bah comme tu l'as dit. Tu fais une fenetre que tu deplace le long de tes vecteurs.
Un moyen de faire ca c'est d'extraire un sous-vecteur de taille WINDOW dans chaque vecteur et de calculer leur cross-correlation. Ensuite il faut memoriser la position ou on a obtenu la meilleure cross-correlation.
Quelquechose de ce genre la:
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 int WINDOW=4; double bestcorrelation=-1; int bestposition=-1; for(int p=0;p<=X1.length-WINDOW;p++) { // sous echantillons double[] SubX1 = Arrays.copyOfRange(X1, p, p+WINDOW); double[] SubX2 = Arrays.copyOfRange(X2, p, p+WINDOW); // correlation des sous-echantillon double subcorrelation=-1; for(int k=0;k<WINDOW;k++) { double c = crosscorrelation(SubX1,SubX2,k); subcorrelation = Math.max(subcorrelation, c ); } // conserve la meilleure correlation if (subcorrelation>bestcorrelation) { bestcorrelation=subcorrelation; bestposition=p; } }
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Peut on comparer des vecteurs de transformées d'ondelette de tailles différentes ?
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
parceque le probleme c'est que quand je fait ma transformée sur un vecteur V1 et une autre sur V2, après si V1=V2 en longueure ya pas de problemes pour tout ce qui est correlation et autres calcul seulement si les vecteurs sont de tailles differentes length(V1)>length(V2) ça pose un probleme parceque on peut pas prendre le min ça na pas de sens on perd de l'information.
Comment faire ?
si V1= a b c d e
et V2 = a2 b2 c2 d2 e2 f2 g2 h2
Si on se base sur la fonction de crosscorrelation qui limite la fin de la boucle interne (end) à min(V1.length,V2.length) on perd de l'information, non ? on mesure la crosscorrelation que sur une partie de V2 et non sur la totalité.
y a t il un moyen de calculer une crosscorrelation en tenant compte de la totalité des deux vecteurs ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager