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.
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; }
Partager