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 :
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.
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...
Voici mon code fonctionnel :
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.
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);
J'espère avoir été suffisamment clair.
Merci !
Partager