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 :

Lecture et analyse d'echantillon de la carte son.


Sujet :

C++

  1. #21
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    En ajoutant un champ dans ta structure param

  2. #22
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Hum, hum, je vois pas trop comment recuper ces informations a partir de mon main.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct pilote_parameters{
    PaStream *stream;
    unsigned long framesPerBuffer;
    PaTime timestart;
    int compteur;
     
    vector <int> frequences; //historique des frequence
    int frequence; // frequence calculée dans ma fct captureduson
     
    };
    mais soit, comment aller alors chercher ces informations ( vector de freq et int de freq) quand je suis dans mon main... je ne sais pas faire "param.frequence" ou "param->frequence" dans mon main...

  3. #23
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Un paramètre passé à l'appel de la fonction portaudio

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    voila , me voici face a un nouveau probleme. dans le code suivant , je fait un echantillonage, mais apparement je suis limiter a param.time>100, car au sinon, ca plante. le probleme c'est que j'aimerai avoir un echatillonage en dessous de 100 milli-secondes, genre 10 ms... Comment faire?

    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
    //commencer l'acquisition
     
     
    	fflush(stdin);
    	err=Pa_StartStream(param.stream);
    	if(err!=paNoError){
    		cout<<"PortAudio error: "<<Pa_GetErrorText(err);
    	}
     
    	Sleep(param.time);
    	// arreter l'acquistion
    	err=Pa_StopStream(param.stream);
    	if(err!=paNoError){
    	cout<<"PortAudio error: "<<Pa_GetErrorText(err);
    	}

  5. #25
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    10 ms, c'est moins que la latence de ta carte son, donc normal que ça plante...

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Et donc j'aimerais savoir comment est-ce que je pourrais diminuer alors au minimum ce temp d'attente pour quand meme avoir des donnée?

  7. #27
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Soit tu les traites en temps réel, soit tu les traites après.
    Dans le premier cas, tu as des données à chaque fois, mais tu dois les traiter rapidement, dans le second, tu prends une plage large de valeurs et tu les traites aussi longtemps que tu veux.

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    on a reussi a passer au dessu de cela, en fesant les calcul dans la fonction callback.

    MAis nou sommes confrontés a un autre probleme: le filtre.
    donc on obtiens un tableau de n echantillons, et il faut le filtrer.
    voici une partie du code:
    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
    /* Computes the output y of a general FIR-IIR digital filter when
    /* signal x (length=NPoints) is presented at the input.
    /* The filter realization is the Transposed Direct Form II.
    /* Its transfer function is :
    /*
    /*          B^[0] + B^[1] z^-1   + ... + B^[m_numOrder] z^-m_numOrder
    /*    T(z)=  -------------------------------------------------------
    /*            1   + A^[1] z^-1   + ... + A^[m_denOrder] z^-m_denOrder
    /*
    /* ZI is the vector of internal variables of the filter.
    /* It should have a minimum dimension = max(m_numOrder+1,m_denOrder+1)
    /* It is set to the final conditions on return.
    /* WARNING : m_denOrder and m_numOrder shouldn't be both set to zero
    /*        at the same time.
     
     */
     
    void filter(float* BCoef, int NumOrder, float* ACoef, int DenOrder,
                float* x, int NPoints, float* y, float* ZI)
    {
     
    }
    je suppose que notre tableau est donc x et que le tableau filtré c'est y, mais j'en suis pas certain( surtout que un tab!=float). et j'ai aussi les tab des coef A[] et B[]. Mais bon j'ai besoin d'un tit cp de main pour lever mes inconues..

  9. #29
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Oui, x et y sont les tableaux glissants en entrée et en sortie, et A et B sont les tableaux des coefficients, on voit la formule dans le commentaire que tu donnes d'ailleurs

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    donc je vais rentrer avec mon tableau float x[80] ainsi que mes deux tableau float ACoef[5] et Bcoef[5]. Alors j'aobtiens aussi que int NPoints =80 et que
    int DenOrder=5,int NumOrder=5.
    B =
    0.010209480791203 0.040837923164813 0.061256884747219
    0.040837923164813 0.010209480791203
    A =
    1.000000000000000 -1.968427786938519 1.735860709208887
    -0.724470829507363 0.120389599896245


    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
     
    float *x[80];
    float *y[80]; /* est-ce bien cela? et je suppose qu'il n'y a pas besoin de l'initialiser*/
    float *ACoef[5];
    float *Bcoef[5];
    float *ZI; /* qu'est-ce ZI?, que vaut il?*/
    int NPoints =80;
    int DenOrder=5;
    int NumOrder=5;
    ACoef[0]=1.000000000000000  ;
    ACoef[1]=-1.968427786938519;
    ACoef[2]=1.735860709208887;
    ACoef[3]=-0.724470829507363;
    ACoef[4]=0.120389599896245;
    BCoef[0]=0.010209480791203  ;
    BCoef[1]=0.040837923164813;
    BCoef[2]=0.061256884747219;
    BCoef[3]=0.040837923164813;
    BCoef[4]=0.010209480791203;
    // le tableau x sera rempli ici
     
    filter(BCoef,NumOrder,ACoef, DenOrder, x, NPoints,  y,  ZI);
    Voila, dans le code precedent je ne sais pas trop si je doit initialiser y. Deplus, je ne vois pas ce qu'est ZI. Ensuite, apres passage dans le filtre, est ce que mon tableau x sera modifier? et je suppose que y sera mon tableau x filtré, est ce que je me trompe?

    Et aussi est ce que le code si dessus pourrais fonctionner correctement?


    Nous avaons aussi un autre probleme, le programme ne tourne pas sur d'autre machine:
    -win 98SE : dll manquant( msvcr80d.dll,msvcp80.dll,msvcp80d.dll) dont les 2 premier sont rajoutables, mais pas le dernier.
    -win xp:"cette application n'a pas pu démarrer car la configuration de l'application est incorrecte. Réinstallez l'application pr résoudre ce problème": p-e il faut utiliser :Microsoft Visual C++ 2005 Redistributable Package (x86) ?

  11. #31
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float x[80];
    float y[80];
    float ACoef[5];
    float Bcoef[5];
    et de préférence, ces variables devraient être allouées dynamiquement (c'est comme ça que c'est fait en réalité dans tous les outils de ce type).

    Pour ZI, c'est le vecteur des variables internes (c'est un filtre à état qui a besoin à chaque appel de savoir ce qui s'était passé avant, la fonction se charge de le mettre à jour à chaque fois), donc au départ, que des 0.

  12. #32
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    donc mon tableau x filtré sera le tableau y? et est-ce que le tableau x sera modifié?


    Nous avons aussi un autre probleme, le programme ne tourne pas sur d'autre machine:
    -win 98SE : dll manquant( msvcr80d.dll,msvcp80.dll,msvcp80d.dll) dont les 2 premier sont rajoutables, mais pas le dernier.
    -win xp:"cette application n'a pas pu démarrer car la configuration de l'application est incorrecte. Réinstallez l'application pr résoudre ce problème": p-e il faut utiliser :Microsoft Visual C++ 2005 Redistributable Package (x86) ?

    j'ai aussi une question, est ce que je px la faire par mp?

  13. #33
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Mieux vaut répondre ici pour les prochains qui pourraient avoir le même souci

    Le tableau X n'est pas modifié, ce n'est même pas envisageable car il est nécessaire au filtrage, c'est y qui donnera le résultat.

    Il n'est pas normal d'avoir la version debug à fournir, il y a une erreur quelque part.

    Pour l'autre bug, il s'agit vraisemblablement d'une erreur de manifeste -> il doit être intégré lors de l'édition des liens à l'application/bibliothèque.

  14. #34
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Voila, on a mit le filtre, mais on a encore des soucis... le vecteur y est en 10^10 pour les 5 premieres valeurs, et apres on a des1;#inf et IND...

    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
    void calcul(short int *t, float &moy){
    	float *x= new float[80];  //ici on transfert notre tableau t dans X
    	for( int j=0; j<80; j++){
    	 (x[j])=float((t[j]));
    	}
    	 	float *y= new float[80];
    	float *ACoef= new float[5];
    	float *BCoef= new float[5];
    	ACoef[0]=1.000000000000000;
    ACoef[1]=-1.968427786938519;
    ACoef[2]=1.735860709208887;
    ACoef[3]=-0.724470829507363;
    ACoef[4]=0.120389599896245;
    BCoef[0]=0.010209480791203;
    BCoef[1]=0.040837923164813;
    BCoef[2]=0.061256884747219;
    BCoef[3]=0.040837923164813;
    BCoef[4]=0.010209480791203;
     
    	float *ZI= new float[80];	
     
    	for(int k=0;k<80;k++){
    	cout<<t[k]<<endl;
    	}
    	filter(BCoef, 5, ACoef, 5, x, 80, y, ZI);
    	cout<<"apres le filtre"<<endl;
    for(int k=0;k<80;k++){
    	cout<<x[k]<<endl;
    	}cout<<"les y"<<endl;
    for(int k=0;k<80;k++){
    	cout<<y[k]<<endl;
    	}
     
    	delete[]x;delete[]y; delete []ACoef; delete[] BCoef; delete [] ZI;
    }

  15. #35
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    La fonction calcul ne devrait pas initialiser les valeurs, et surtout pas celles-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float *ZI= new float[80]
    Ce sont les valeurs passées du filtre, sans initialisation, elles valent n'importe quoi, d'où les erreurs rencontrées.
    Il FAUT intiialiser à 0 ces valeurs et les conserver entre deux appels à la fonction calcul.

  16. #36
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    donc tout mon tru est bon et je doit rajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float *ZI= new float[80];
    	for( int j=0; j<80; j++){
    	(ZI[j])=0;
    	}
    car si c'est ca, ca ne va toujours pas :s

  17. #37
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    ? toujours pas de reponses...

  18. #38
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ben non, ton truc n'est pas bon, j'ai dit que les allocations ne doivent pas être dans ta fonction.

  19. #39
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    oki,on a resolu le probleme, mais on devra refiltrer dans l'autre sens le tableau (equivalent a filtfilt() en matlab), donc on va perdre les info des ZI.

    On a encore quelques problemes...

    on aimerais savoir si il existe une fonction qui lit au fichier .wav ( comme celle qui existe en matlab: wavread) afin de retourner une tableau avec les valeurs. On sait le faire en matlab, mais pas en c/c++... On trouve des truc en c sur le net, mais c'est pas trop ca...

    merci

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/02/2010, 09h53
  2. Lecture et analyse de fichiers PDF
    Par Aymeric00 dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 31/10/2009, 13h52
  3. Analyse du son de la carte son ?
    Par [ZiP] dans le forum Débuter
    Réponses: 3
    Dernier message: 29/08/2009, 09h20
  4. Lecture et analyse de fichier
    Par yanlou dans le forum C++
    Réponses: 4
    Dernier message: 07/07/2008, 17h11
  5. Lecture d'une carte son
    Par fatenov dans le forum Simulink
    Réponses: 0
    Dernier message: 21/05/2008, 21h56

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