IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

programme de "xcorr" en c++


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    15
    D�tails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 15
    Par d�faut programme de "xcorr" en c++
    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.

  2. #2
    Expert confirm�

    Inscrit en
    Ao�t 2006
    Messages
    3 967
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 3 967
    Par d�faut
    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.

  3. #3
    Invit�
    Invit�(e)
    Par d�faut
    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 :
    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);
      }
     
    }
    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.

    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�).

  4. #4
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    15
    D�tails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 15
    Par d�faut
    Citation Envoy� par ElGat0 Voir le message
    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 :
    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);
      }
     
    }
    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.

    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�).


    pour quoi la sortie c'est de x(i)*x(n-i)

  5. #5
    Invit�
    Invit�(e)
    Par d�faut
    Parce que c'est �a, la cross-correlation. Xcorr sous Matlab fait une cross-corr�lation.

  6. #6
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    15
    D�tails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 15
    Par d�faut
    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

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo