bonjour,
j'ai entrain de traduire un programme de Matlab en Visual C++, du coup j'ai besoin la fonction "xcorr" en C++, j'ai cherché par tout, mais pas grande chose, est ce que quelqu'un peut me donner un coup de main? merci bcp.
bonjour,
j'ai entrain de traduire un programme de Matlab en Visual C++, du coup j'ai besoin la fonction "xcorr" en C++, j'ai cherché par tout, mais pas grande chose, est ce que quelqu'un peut me donner un coup de main? merci bcp.
Hia,
Quand on pose ce genre de question, le minimum est de préciser ce que fait la fonction à remplacer.
Personnellement, je n'utilise pas matlab, et je ne vais pas plonger dans sa doc juste pour te répondre.
Si les cons volaient, il ferait nuit à midi.
La convolution c'est le b-a ba du traitement du signal, ça...pas bien compliqué.
En gros, avec x ton signal d'entrée (d'indice 0 à N), y ton signal de sortie, tu veux chaque y(i) = somme de zéro à N de x(i)*x(N-i).
En C ça donne une double boucle for imbriquée, comme ça :
En C++ le principe est exactement le même ; mais pour le faire plus à la C++ way tu pourrais envisager de stocker ton x et ton y dans un valarray, par exemple, et de faire un truc un peu sophistiqué avec l'algo std::transform.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int i; int j; for (j = 0; j<N ; j++) { for (i = 0; i<N ; i++) { y(j) = x(i)*x(N-i); } }
Note que c'est vraiment pas l'algo le plus efficace, par contre, et que t'as tout plein de bibliothèques qui t'implémenteront ça bien mieux, bien plus vite (en passant par la FFT tu réduis énormément la complexité).
Parce que c'est ça, la cross-correlation. Xcorr sous Matlab fait une cross-corrélation.
j'ai trouvé un code pour FFT, mais je ne comprends pas, quel qu'un peut m'expliquer? et aussi si je l'appelle cette fonction FFT dans "main", qu'est ce que je dois mettre comme paramètre? urgent! merci!
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 void fft::FFT( complex<double> *TData, complex<double> *FData, int r) //r: nbre de points FFT { //definition des variables int count; int i,j,k; int bfsize,p; double angle; complex<double> *W, *X1,*X2,*X; count = (int)pow(2.0,r); // allocation memoire W = new complex<double>[count/2]; X1 = new complex<double>[count]; X2 = new complex<double>[count]; for(i=0; i<count/2; i++) { angle = -i*PI*2/count; W[i] = complex<double> (cos(angle),sin(angle)); // correspond exp(-2*PI*i/N) } memcpy(X1,TData,sizeof(complex<double>) *count); //copier TD (qu'on veut faire FFT) dans X1 //FFT for(k = 0; k < r;k++) { for(j = 0; j<(int)pow(2.0,k); j++) { bfsize=(int)pow(2.0,(r-k)); for(i = 0;i<bfsize/2;i++) { p = j*bfsize; X2[i+p] = X1[i+p] + X1[i+p+bfsize/2]; X2[i+p+bfsize/2] = (X1[i+p] - X1[i+p+bfsize/2])*W[(int)(i *pow(2.0,k))]; } } X=X1; X1=X2; X2=X; } for(j = 0;j<count; j++) { p = 0; for(i = 0; i < r; i++) { if(j&(1<<j)) { p+=1<<(r-i-1); } } FData[j]=X1[p]; } delete W; delete X1; delete X2; }
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