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. #1
    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 Lecture et analyse d'echantillon de la carte son.
    Bonjour,

    j'ai un gros probleme, Je dois aller chercher un son venant de ma carte son( venant d'un micro), le decomposer en echantillons,analyser leurs frequences, et avoir ces frenquence en temp que parametre dans mon programme en C++.

    voila donc mon systeme: un son est capturé en temps réél par mon micro, et en fonction de ce son, je doit avoir un parametre de frequence dans mon code...

    pouvez vous m'aider, c'est tres important...

    merci

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    bonjour et bienvenu sur le forum.
    Ou est ton problème?

  3. #3
    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
    A l'aide d'un micro bancher sur ma carte son, je dois recolter le bruit en provenant, et en trouver la frequence. Je doit ensuite recuperer cette frequence dans mon programme: genre une fonction GetFrequence().

    Mon programme, aura pour but, que un patient soufle dans un appareil medical, ce qui fera vibrer une bille, Un micro etant brancher sur cet appareil, je recolterai le bruit. De ce bruit, je doit analyser et recuperer sa frequence. En gros, lorsque le patient souffle, cela produit une acceleration d'une voiture par exemple, dans mon programme.

    merci

  4. #4
    Membre expérimenté Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Par défaut
    1. Voir les fonctions spécifiques à ton OS pour l'acquisition d'un signal audio
    2. Voir les transformées de Fourier pour récupérer la fondamentale d'un signal

    Il n'y a pas de question sur le C++ dans ton post.
    Bon courage.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    essaye de voir les librairies externes

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Par définition, le "bruit" n'a pas de fréquence fondamentale.. car il contient toutes les fréquences de manière plus ou moins réparties selon le type de bruit.

    Sinon tu es sous windows ? Pour acquérir le son, tu peux te servir de l'api WaveInOpen, WaveInStart etc., que tu trouveras là : http://msdn2.microsoft.com/en-us/lib...36(VS.85).aspx

    Ensuite -> fourrier pour passer de temporel en fréquentiel.

  7. #7
    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
    Merci,
    ca doit certainement etre dans ce genre la, mais je ne comprend pas du tout les argument ques les fonctions prennent. Je dois pouvoir lire en temps réel "la frequence du bruit" car le bruit sera, le bruit ambiant + le systeme que j'analyse; une bille d'acier qui vient frapper mon systeme en plastique sur lequel est fixé mon micro.

    En fonction de cela, j'aimerai bien que mon programme me donne une pseudo frequence afin de mettre dans mon programme

    //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
    void movecursor(POINT pt, int ch){
        int flow;
        milieu(pt);
        cout<<"pour quitter, pressez escape"<<endl;
    	const SHORT Mask = 32768;
    	bool a=TRUE;
    	while(a==true)  {
    		  if (GetKeyState(VK_ESCAPE) & Mask)
                   a = FALSE;
    int flow=0;
     
    if(frequence>freqSeuil && frequence<freqMax)
    flow=1;
    /*ou freqSeuil et freqMax sont definis. par contre je connais pas le type des 3 frequence,Et surtout je ne sais pas si c'est vraiment realisable*/
     
    GetCursorPos(&pt);
              SetCursorPos(pt.x,pt.y-flow);
    		  Sleep(10);
    }

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Qu'est ce que tu ne comprends pas ? Lis déjà ceci et fait des tests, dis nous où tu bloques. Tout commence par WaveInGetNumDev pour choper la device de ton microphone. Ensuite waveinopen etc.
    http://msdn2.microsoft.com/en-us/lib...25(VS.85).aspx

  9. #9
    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, j'ai chercher et je suis tomber sur la librairie PORTAUDIO. le probleme c'eqt que je n'arrive meme pas a la charger afin de pouvoir tester les differentes fonctions. J'ai ajouter la libraire " portaudio.h" et j'ai inserer les liens, mais j'ai encore des messages d'erreurs. J'ai pourtant respecter la maniere de suivre qui etait fournie avec le zip, et je l'ai tester avec un de ses exemple, mais rien n'y fait. j'ai soit des message disant qu'il ne trouve pas la librairie, soit il ne reconnais pas les fonctions....

    je joint le zip avec librairie, exemple, et aide, pour ceux qui en aurait besoin pour m'aider.

    je travail sous winodows, et j'ai besoin du mode le plus general.

    merci
    Fichiers attachés Fichiers attachés

  10. #10
    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 : 43
    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
    Tu dois faire deux choses, commence par la première : l'acquisition du signal.

    Port Audio, c'est bien, mais c'est surdimensionné pour toi : elle est destinée au traitement en temps réel du son, donc pas du tout ce que tu cherches.

  11. #11
    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
    Je fait bel et bien ne aquisition du signal en temps réel. Je suis aller voir un chercheur qui travail sur port audio, et on a bien avancé, car on a reussi l'acquisition du signal. Nous avons donc reussi a obtenir des echantillonages du son. Il nous reste donc la partie FFT, si quelqu'un a deja un code pour obtenir une frequence a partir d'un echantillonage du son par fft, ca serais cool de me le faire parvenir.

    Et aussi, je suis a la recherche du code pour tracer le graph sur base d'un echantillon.

    merci

  12. #12
    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 : 43
    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
    Faut être chercheur pour travailler avec portaudio me rappelle pas que ce soit si difficile

    Regarde FFTW pour créer la FFT : http://humbert-florent.developpez.co...aitement/fftw/
    Et pour l'affichage, ça va dépendre de la GUI que tu vas prendre

  13. #13
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Faut être chercheur pour travailler avec portaudio me rappelle pas que ce soit si difficile

    Regarde FFTW pour créer la FFT : http://humbert-florent.developpez.co...aitement/fftw/
    Et pour l'affichage, ça va dépendre de la GUI que tu vas prendre
    Par contre, le cours là va que pour le traitement de signaux en 2D et pas en 1D.

  14. #14
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Faut être chercheur pour travailler avec portaudio
    cad ? je suis pas sûr de comprendre.

  15. #15
    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 : 43
    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
    C'était une boutade par rapport à ta phrase sur le fait d'avoir demandé à un chercheur de te montrer comment utiliser portaudio

  16. #16
    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
    non, pas du tout.

    Je suis etudaint a la polytechnique, et il n'y a que quelques personnes qui connaissaient portaudio, dont lui qui est chercheur. Donc on a du aller le voir, mais on a eu plein de probleme avec portaudio, il ne voulais pas compiler a cause de lien externe non resolu...

  17. #17
    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 : 43
    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
    A cause de l'ASIO SDK, au hasard ?

  18. #18
    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 du rajouer " PA_NO_ASIO;PA_NO_DS;" dans les options du projet, pour que ca veuille compiler. Mais quesque ca a desactive au fait? es ce que ca reduit la compatibilité du programme? ( du moment que ce marche avec un maximum de opc windows, ca me va!)

    et j'ai aussi une question; en combien de bit est-ce que PaInt16 enregistre le son et s'il es signé ou pas? Pour savoir si on doit le lire avec un short, int, double, etc.. ?

    merci

  19. #19
    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 : 43
    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
    Je me doutais pour l'ASIO. Tu as désactivé des manières de récupérer les échantillons. Le standard ASIO est la meilleure norme actuelle à ce niveau, mais elle a une licence incompatible avec les binaires GPL.
    DS, c'est Direct Sound.

    Je te conseille de récupérer des flottants si possible, en général, c'est cela qui est fourni par les API, mais ce que tu as est signé, naturellement Et c'est du 16bits, donc short normalement.

  20. #20
    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 j'ai encore un probleme, dans mon code si dessous, je vais calculer ma frequence du son, dans la fonction CaptureDuSon(). Le probleme c'est que j'aurai besoin que cette valeur me soit accessible dans mon main. Je ne peux pas declarer une variable globale, et je ne sais pas comment faire passer cette donnée en parametre de ma fonction CaptureDuSon(). de plus j'aurais aussi besoin de stocker mes frequences calculée dans un vector, afin d'avoir un historique des frqnce, pour chaque appel de la fct portaudio de mon main, et je ne peux pas le faire aussi passer comme parametre...

    merci de m'éclaircir


    voila mon 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
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    #include <iostream>
    #include "portaudio.h"
    #include <vector>
    #include<windows.h>
    using namespace std;
     
     
    struct pilote_parameters{
    PaStream *stream;
    unsigned long framesPerBuffer;
    PaTime timestart;
    int compteur;
     
    };
     
     
     
    #define SAMPLE_RATE 8000     //frequence d'echantillonage
    #define SAMPLE_TYPE paInt16		//Type de codage de l'echantillon paInt16 16bit
    #define FRAMES_PER_BUFFER 8 //8 pour tes avec la somme
     
     
     
     
     
     
    static int CaptureDuSon( const void *inputBuffer, void *outputBuffer,unsigned long framesPerBuffer,
    						  const PaStreamCallbackTimeInfo* timeInfo,
    						  PaStreamCallbackFlags statusFlags, void *userData ){
     
    	PaTime a=0;
     
    	static int pass=1;
    	short int *t=(short int*)inputBuffer; // short int = lecture en 16 bit 
    	pilote_parameters *param=(pilote_parameters*)userData;
     
    	for(int i=0; i<8;i++)
    		cout<<"tab"<<i+1<<" : "<<t[i]<<endl;
     
    	//ici je ferais ma fonction qui calcule, la frequence
     
     
    	return 0; // 0=paContinue: keeping processing
     
    	}
     
     
     
    void portaudio()
    {	
    	PaError err;
    	PaStreamParameters inputParameters;
    	pilote_parameters param;
    	param.framesPerBuffer=FRAMES_PER_BUFFER;
    	param.compteur=0;
     
     
     
     
     
     
    	err = Pa_Initialize();
    	if( err != paNoError )
        printf("PortAudio error: %s\n", Pa_GetErrorText( err ) );
     
    	inputParameters.channelCount = 1;
        inputParameters.device = Pa_GetDefaultInputDevice();
        inputParameters.hostApiSpecificStreamInfo = NULL;
        inputParameters.sampleFormat = SAMPLE_TYPE;
        inputParameters.suggestedLatency = Pa_GetDeviceInfo(Pa_GetDefaultInputDevice())->defaultLowInputLatency ;
     
    	// Ouverture du canal du port audio    Open an audio I/O stream.
    	err = Pa_OpenStream( &(param.stream),
                             &inputParameters,          // input 
    						 NULL,						// no output 
    						 SAMPLE_RATE,
    						 param.framesPerBuffer,
    					     paNoFlag,
                             CaptureDuSon, /* this is your callback function */
                             &param); /*This is a pointer that will be passed to
                                                       your callback*/
        if( err != paNoError )
        printf(  "PortAudio error: %s\n", Pa_GetErrorText( err ) );
     
    	//param.timestart=Pa_GetStreamTime(param.stream);
     
    	printf("\ncommencer l'acquistion");
     
    	fflush(stdin);
    	err = Pa_StartStream( param.stream );
    	if( err != paNoError )
    	printf(  "PortAudio error: %s\n", Pa_GetErrorText( err ) );
    Sleep(100);
     
    	printf("\narreter l'acquistion");
    	err = Pa_StopStream( param.stream );
    	if( err != paNoError )
    	printf(  "PortAudio error: %s\n", Pa_GetErrorText( err ) );
     
     
    	err = Pa_CloseStream( param.stream );
    	if( err != paNoError )
        printf(  "PortAudio error: %s\n", Pa_GetErrorText( err ) );
     
    	err = Pa_Terminate();
    	if( err != paNoError )
        printf(  "PortAudio error: %s\n", Pa_GetErrorText( err ) );
    }
     
    void main(){
     
    portaudio();//ira calculer la frequence obtenue.
     
    }

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