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

MATLAB Discussion :

manipulation de données binaires (optimisation)


Sujet :

MATLAB

  1. #1
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut manipulation de données binaires (optimisation)
    Bonjour
    je manipule des données binaires et je suis parvenu à un code fonctionnel mais pas efficace.
    Voici mon problème : dans un fichier binaire, j'ai des blocs de 2048 données utiles codées sur 32bits. mais dont seuls les 3 premiers octets doivent être interprétés. Chaque bloc est précédé de 4 octets inintéressants. Voici un extrait du fichier en hexadécimal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    08 04 00 00 70 F4 15 01 00 00 00 00 00 00 00 00  %inintéressant
    DA FF FF 00 DA FF FF 00 E1 FF FF 00 DB FF FF 00 %données : pour les 4 premiers octets, la valeur est en fait DA FF FF codée en little endian soit 0xFFFFDA et ainsi de suite
    D8 FF FF 00 D9 FF FF 00 D3 FF FF 00 D8 FF FF 00 
    E1 FF FF 00 DD FF FF 00 DA FF FF 00 D9 FF FF 00 
    DC FF FF 00 DC FF FF 00 DA FF FF 00 E1 FF FF 00 
    E0 FF FF 00 E4 FF FF 00 E6 FF FF 00 D8 FF FF 00 
    DB FF FF 00 E0 FF FF 00 DD FF FF 00 DD FF FF 00...
    Si ja'i 2 voies (variable nbvoies dans le code ci-dessous), je dois ensuite entrelacer 24bits du premier bloc avec 24 du second 2048 fois (longueur des blocs) puis passer aux blocs 3 et 4 et ainsi de suite. Les 24bits représentant une valeur interprétable, je leur applique éventuellement un facteur multiplicatif.
    Voici mon code fonctionnel :
    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
        fid=fopen(filepath,'r');
        % lecture et remise en ordre données audio en vue d'écriture fichier
        % wav
        wavdata=zeros(1,nbentrees*nbvoies*2048);
        for i=0:1:nbvoies*nbentrees-1
            fread(fid,16);
            start_ind=fix(i/2)*nbvoies*2048+mod(i,nbvoies)+1;
            for j=1:2048
                wavdata(1,start_ind+nbvoies*(j-1))=fread(fid,1,'bit24');
                fread(fid,1,'bit8');
            end
        end
        % GAIN
        wavdata=wavdata*2^pow;
        fclose(fid);
     
        %écriture des données dans un nouveau fichier
        fid2=fopen(filepath2,'w');
        fwrite(fid2,wavdata,'bit24');
        fclose(fid2);
    Je me demande s'il n'y aurait pas une manière plus efficace, par exemple en récupérant chacun des octets dans une matrice, en réorganisant cette matrice et en interprétant les valeurs effectives codées en 24 bits seulement ensuite mais je ne sais pas trop comment m'y prendre.
    J'espère avoir été suffisamment clair.
    Merci !

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Essaie ceci :

    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
    C = {'08' '04' '00' '00' '70' 'F4' '15' '01' '00' '00' '00' '00' '00' '00' '00' '00'
    'DA' 'FF' 'FF' '00' 'DA' 'FF' 'FF' '00' 'E1' 'FF' 'FF' '00' 'DB' 'FF' 'FF' '00'
    'D8' 'FF' 'FF' '00' 'D9' 'FF' 'FF' '00' 'D3' 'FF' 'FF' '00' 'D8' 'FF' 'FF' '00' 
    'E1' 'FF' 'FF' '00' 'DD' 'FF' 'FF' '00' 'DA' 'FF' 'FF' '00' 'D9' 'FF' 'FF' '00' 
    'DC' 'FF' 'FF' '00' 'DC' 'FF' 'FF' '00' 'DA' 'FF' 'FF' '00' 'E1' 'FF' 'FF' '00' 
    'E0' 'FF' 'FF' '00' 'E4' 'FF' 'FF' '00' 'E6' 'FF' 'FF' '00' 'D8' 'FF' 'FF' '00' 
    'DB' 'FF' 'FF' '00' 'E0' 'FF' 'FF' '00' 'DD' 'FF' 'FF' '00' 'DD' 'FF' 'FF' '00'
    '08' '04' '00' '00' '70' 'F4' '15' '01' '00' '00' '00' '00' '00' '00' '00' '00'
    'DA' 'FF' 'FF' '00' 'DA' 'FF' 'FF' '00' 'E1' 'FF' 'FF' '00' 'DB' 'FF' 'FF' '00'
    'D8' 'FF' 'FF' '00' 'D9' 'FF' 'FF' '00' 'D3' 'FF' 'FF' '00' 'D8' 'FF' 'FF' '00' 
    'E1' 'FF' 'FF' '00' 'DD' 'FF' 'FF' '00' 'DA' 'FF' 'FF' '00' 'D9' 'FF' 'FF' '00' 
    'DC' 'FF' 'FF' '00' 'DC' 'FF' 'FF' '00' 'DA' 'FF' 'FF' '00' 'E1' 'FF' 'FF' '00' 
    'E0' 'FF' 'FF' '00' 'E4' 'FF' 'FF' '00' 'E6' 'FF' 'FF' '00' 'D8' 'FF' 'FF' '00' 
    'DB' 'FF' 'FF' '00' 'E0' 'FF' 'FF' '00' 'DD' 'FF' 'FF' '00' 'DD' 'FF' 'FF' '00'
    '08' '04' '00' '00' '70' 'F4' '15' '01' '00' '00' '00' '00' '00' '00' '00' '00'
    'DA' 'FF' 'FF' '00' 'DA' 'FF' 'FF' '00' 'E1' 'FF' 'FF' '00' 'DB' 'FF' 'FF' '00'
    'D8' 'FF' 'FF' '00' 'D9' 'FF' 'FF' '00' 'D3' 'FF' 'FF' '00' 'D8' 'FF' 'FF' '00' 
    'E1' 'FF' 'FF' '00' 'DD' 'FF' 'FF' '00' 'DA' 'FF' 'FF' '00' 'D9' 'FF' 'FF' '00' 
    'DC' 'FF' 'FF' '00' 'DC' 'FF' 'FF' '00' 'DA' 'FF' 'FF' '00' 'E1' 'FF' 'FF' '00' 
    'E0' 'FF' 'FF' '00' 'E4' 'FF' 'FF' '00' 'E6' 'FF' 'FF' '00' 'D8' 'FF' 'FF' '00' 
    'DB' 'FF' 'FF' '00' 'E0' 'FF' 'FF' '00' 'DD' 'FF' 'FF' '00' 'DD' 'FF' 'FF' '00'};
     
    X = cellfun(@hex2dec,C);
     
    fid = fopen('data.bin','w');
        fwrite(fid,X.','uint8');   
    fclose(fid);
     
    n = 1;
    fid = fopen('data.bin','r');
    while ~feof(fid)
        s = fseek(fid,16,'cof');
        if s==-1
            break
        end
        wavdata{n} = fread(fid,[4,6],'ubit24',8).';
        n = n+1;
    end
    fclose(fid);
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    Bonjour,
    merci pour la réponse . En fait c'est l'argument SKIP de la fonction FREAD que je n'avais pas compris. Par contre la prochaine fois évitez de me faire une frayeur en remplaçant mon 'bit24' par un 'ubit24' (c'est un peu ce qui posait problème car en fait le quatrième octet est toujours nul donc si j'avais été en non signé, j'aurais pu l'interpréter comme un 'ubit32').
    Pour les curieux voici le nouveau code (en rouge les lignes qui ont changé)
    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
        fid=fopen(filepath,'r');
        % lecture et remise en ordre données audio en vue d'écriture fichier
        % wav
        wavdata=zeros(1,nbentrees*nbvoies*2048);
        for i=0:1:nbvoies*nbentrees-1
            s = fseek(fid,16,'cof');
                if s==-1
                break
            end
            start_ind=fix(i/2)*nbvoies*2048+mod(i,nbvoies)+1;
            wavdata(1,start_ind:nbvoies:start_ind+2047*nbvoies) = fread(fid,2048,'bit24',8).';
        end
        % GAIN
        wavdata=wavdata*2^pow;
        fclose(fid);
    Connaissant le nombre d’occurrences dans mon fichier, j'ai pensé qu'il était préférable de conserver ma boucle for à la boucle while qui ajoute un test.Pour être tout à fait complet, en faisant la moyenne du temps d'exécution de la boucle sur 15 exécutions je passe de 14,5s avec la première méthode à 0,5s avec la seconde.

    PS : une petite question comme je reprends MATLAB après quelques temps d'interruption, je ne me rappelle plus la différence entre et ?

    Encore merci.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    Merci...

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Dans ce cas, la ligne avec FREAD se simplifie en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wavdata(1,start_ind:nbvoies:start_ind+2047*nbvoies) = fread(fid,[1,2048],'bit24',8);
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. manipulation de données binaires
    Par zobsystem dans le forum Langage
    Réponses: 1
    Dernier message: 22/03/2007, 01h49
  2. Manipulation de données binaires
    Par Defre87 dans le forum Général Python
    Réponses: 3
    Dernier message: 28/09/2005, 16h16
  3. Problème avec les données binaire
    Par Lachessis dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/08/2005, 17h38
  4. Données ASCII et données binaires
    Par chourmo dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2005, 12h19
  5. [xml]manipuler des données xml sous Oracle9i
    Par crazy dans le forum SQL
    Réponses: 7
    Dernier message: 28/02/2004, 11h40

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