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 !