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

FMOD Discussion :

Extraction des données


Sujet :

FMOD

  1. #1
    Membre à l'essai
    Extraction des données
    Bonjour à tous,

    Je vien de commencer un nouveau projet perso qui utilise les signaux audio. Pour la recuperation du microphone j'utilise donc FMod, mais par la suite je cherche a recupere les données contenues dans le FMOD::Sound.

    Le probleme est que j'est essayé deja 2 méthode qui semble rependu sur le net (lock et readdata).
    - Pour ce qui est de readdata j'ais le retour FMOD_ERR_UNSUPPORTED (pour un sond wav).
    - et pour la methode utilisant la fonction lock, les données que j'obtien sont differente de celles que je peut obtenir avec le meme fichier sond sur matlab.

    Je poste cette derniere methode en esperant qu'une ame charitable pourra me venir en aide.

    Cordialement

    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
     
        FMOD_RESULT result;
        unsigned int lenbytes, len1, len2; 
        void *ptr1, *ptr2; 
     
        //recupretation de la taille
        Snd->getLength(&lenbytes, FMOD_TIMEUNIT_PCMBYTES);
     
        //lock
        result = Snd->lock(0, lenbytes, &ptr1, &ptr2, &len1, &len2);
     
        std::vector<double> buffer(len1);
        char* c = (char*)ptr1;
        for(int ii=0; ii<len1; ii++){
    	buffer[ii]=(double)*c ;
    	c++;
        } 
        //unlock
        Snd->unlock(ptr1, ptr2, len1, len2);

  2. #2
    Modérateur

    Bonsoir,

    As-tu commencé par regarder le nombre de bits sous lequel étaient stockées les données ?
    Avec FMod : Sound::getFormat(), 4ème paramètre.
    Sous MATLAB : 3ème sortie de wavread.

    Attention sous MATLAB que le type retourné par défaut est le type double dans l'intervalle [-1 1]. Tu as le paramètre 'native' pour éviter cela.
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).
    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Mes extensions FireDVP (Firefox), ChroDVP (Chrome) : suivi des nouveaux messages, boutons/raccourcis et bien plus !

  3. #3
    Membre à l'essai
    Bonjour,

    Merci de cette reponse, elle ma permie de m'interoger sur matlab et de regarder une peut plus profondement le fonctionnement des fonctions telque wavread().

    Le probleme venait principalement du cast en "char" et non en "unsigned char". Cette opperation ajouter au fait que selon le format wav il faut lire le ficher avec le principe "LSB MSB LSB MSB LSB ..."

    On optien alors une valeur binaire sur 4octets, que l'on passe sur 8octets pour avoir un double signé ^^

    ce qui nous donne :

    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
     
       Snd->getLength(&lenbytes, FMOD_TIMEUNIT_PCMBYTES);
        FMOD_SOUND_FORMAT format;
        FMOD_SOUND_TYPE type;
        int channel, bits;
        Snd->getFormat(&type, &format, &channel, &bits);
        FMOD_RESULT result;
        result = Snd->lock(0, lenbytes, &ptr1, &ptr2, &len1, &len2);
        //lecture du fichier hexa
        //le msb est en seconde position
        //si plusieur channels, les lsb sont ensemble, suivi des msb.
        std::vector<double> buffer;
        if(channel==1 && format == FMOD_SOUND_FORMAT_PCM16){ //si un seul channel et donnée sur 16bits
    	buffer.resize(lenbytes/2);//nombre données sur 16bits est 2 fois plus petit que le nombre de données sur 8bits
    	unsigned char* p = (unsigned char*)ptr1;
    	for(int ii=0; ii<lenbytes/2; ii++){
    	    //recuperation de la valeur binaire, et passage en double signée
    	    buffer[ii]=(double)(((unsigned char)(*(p+1))<<8 | (unsigned char)(*p) )<<16)/pow(2,16);
    	    //normalisation entre -1 et 1;
    	    buffer[ii]/=32768;
    	    p+=2;
    	} 
        }
        Snd->unlock(ptr1, ptr2, len1, len2);


    a+