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

SL & STL C++ Discussion :

Transformer 4 unsigned char en 1 double


Sujet :

SL & STL C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut Transformer 4 unsigned char en 1 double
    Bonjour a tous,
    j'ai un programme dans lequel je récupère des octets dans un vector de unsigned char (la taille du vector est 1,2,3 ou 4) et j'aimerais bien si possible transformer ce vector en un double, cela est-il possible? j'ai essayé diverses manières, mais je n'ai pas trouvé!
    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Transformez le vector en double? ou transformez tes char en double?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut
    euh transformé les char en double, mais le problème, c'est que chaque char est une "partie" du double,c'est a dire que j'ai récupéré la variable octet par octet et je voudrais la re-transformer en double!

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut
    On avait eu exactement le même problème dans ce topic http://www.developpez.net/forums/d65...-vers-decimal/.

    Regardes mon dernier poste, il y a un code qui permet de faire ce que tu veux à quelques adaptations prêt.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut
    D'autre part l'encodage IEEE 754, définit les doubles sur 32, 64 ou 80 bits (soit 4, 8 ou 10 octets) donc ton vector ne devrait pas faire 1, 2 ou 3 octets comme tu le dis mais seulement 4, 8 ou 10 octets.

    Enfin, sur un PC, les "double" sont codés sur 8 octets et les "float" sur 4, donc je pense que tu cherches plutôt un "float" (si tu utilises ma fonction, penses à remplacer les "double" en "float"), mais peut-être utilises-tu une machine différente.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut
    salut, en fait je vais essayer d'adapter ton code, merci!
    En fait déjà je suis sur mac, et ce que j'essaye de faire c'est :
    A partir d'un fichier wav, je récupère le signal sous forme de valeurs les unes a la suite des autres, mais chaque valeur est codée sur (cela dépend des fichiers wav) 1,2,3 ou 4 octets, et donc j'ai récupéré chaque valeur dans un tableau de unsigned char et après, il faut que suivant que ça soit sur 1,2,3 ou 4 octets, je transforment ces 1-4 valeurs en une seule, la vraie valeur du signal (j'avais choisi en double, car cela pourrait aller pour le plus grand nombre d'octets!).
    Je ne sais pas si je suis très clair, mais merci de tes réponses!

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Quel est l'encodage de la valeur dans ton fichier wav? Entier, flottant IEEE 754, autre type de flottant? En fait, c'est ça qui va déterminer la façon dont tu vas convertir tes 4 octets en un double.

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    A moins que le format WAV n'est changé depuis quelques temps...
    Il me semble que le nombre de 'bit' de chaque sample est 8, 16 ou 24... pas 32 (mais c'est possible...). Ces valeurs sont des *entiers* toujours, et convertir en flottant n'a absoluement aucun interêt (sans compter la perte de données associée).

    Ensuite, en fonction du nombre de canaux utilisés, les samples sont "interleaved" (un sample pour chaque canal avant de passer au suivant).

    De plus... je ne sais pas ce que tu comptes faire de ces données par la suite, mais je ne suis pas sur qu'il soit interessant de lire dans un vecteur de char... autant le lire dans un vecteur de int (ca ne sera pas plus gros en mémoire d'ailleurs), voire même dans un buffer de int (éviter la partie "vector"), ou encore, le garder tel quel (histoire de pouvoir le jouer sans même toucher le moindre petit octet).

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut
    Bonjour, merci de vos réponses, en effet j'avais dit quelques abhérations dans mes postes précédent, j'en suis désolé... Mais mon problème était que je voulais récupérer ces entiers qui faisait un nombre "variable" d'octets, et que je pensais pas que pour récupérer un nombre de 4 octets, un double etait plus a proprié etc...

    nicroman, je ne sais pas si c'est récent ou pas pour les 32 bits par sample, et je ne dis pas si c'est vrai ou pas, mais c'est ce que j'avais trouvé sur le site qui m'a servi de base : http://www.sonicspot.com/guide/wavefiles.html
    Significant Bits Per Sample
    This value specifies the number of bits used to define each sample. This value is usually 8, 16, 24 or 32. If the number of bits is not byte aligned (a multiple of 8) then the number of bytes used per sample is rounded up to the nearest byte size and the unused bytes are set to 0 and ignored.


    Ne trouvant pas de vrai réponse, j'ai trouvé une solution, mauvaise je sais, car 1 elle n'est pas belle, 2 elle ne marche pas pour tous les cas, mais elle marche pour mes test, et cela suffisait pour l'instant pour pouvoir continuer mon travail : voici ce 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
     
    m_fichier->read(( char*)(&m_dataSize2),4);
     
    	m_nombreEchantillons = abs(8*m_dataSize2/m_bitsPerSample);
     
    	m_data.resize(m_nombreEchantillons);
     
    	if(m_bitsPerSample == 8) { 
    		int8_t donnee = 0;
    		for (int i = 0; i< m_nombreEchantillons ; i++) { 
    				m_fichier->read((char*)(&donnee),1);
    				m_data[i]=donnee;
     
    		}
     
    	}
    	else if(m_bitsPerSample == 16) { 
    		int16_t donnee = 0;
    		for (int i = 0; i< m_nombreEchantillons ; i++) { 
    				m_fichier->read((char*)(&donnee),2);
    				m_data[i]=donnee;
     
    		}
     
    	}
    	else if(m_bitsPerSample == 32) { 
    		int32_t donnee = 0; 
    		for (int i = 0; i< m_nombreEchantillons ; i++) { 
    				m_fichier->read((char*)(&donnee),4);
    				m_data[i]=donnee;
    		}
    	}
    	else { 
    		int donnee = 0;
    		for (int i = 0; i< m_nombreEchantillons ; i++) { 
    				m_fichier->read((char*)(&donnee),1);
    				m_data[i]=donnee;
    		}
    	}
    Dsl mais je ne sais pas vraiment ce qu'est un buffer, et ce que je veux faire ces données, c'est de faire de l'analyse (basique) du signal (genre tracer l'onde, Transformée de Fourier discrète etc...)

    Merci de vos aides, si vous avez un code mieux que le miens pour résoudre mon problème, n'hésitez pas!

Discussions similaires

  1. Transformer unsigned char [5] en std::string
    Par alex2746 dans le forum C++
    Réponses: 11
    Dernier message: 13/03/2012, 15h43
  2. Obtenir un double à partir d'un unsigned char
    Par vdumont dans le forum C++
    Réponses: 2
    Dernier message: 05/05/2006, 16h43
  3. Réponses: 19
    Dernier message: 28/04/2005, 15h36
  4. char et unsigned char
    Par jobherzt dans le forum C++
    Réponses: 8
    Dernier message: 11/02/2005, 00h24
  5. Transformer un champ CHAR en décimal
    Par ALLB dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 19/07/2004, 13h59

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