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++

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 15
    Points : 10
    Points
    10
    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 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    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.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 69
    Points : 142
    Points
    142
    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 à l'essai
    Inscrit en
    Juin 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 15
    Points : 10
    Points
    10
    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
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 69
    Points : 142
    Points
    142
    Par défaut
    Parce que c'est ça, la cross-correlation. Xcorr sous Matlab fait une cross-corrélation.

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 15
    Points : 10
    Points
    10
    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