Bonjour,
Je me demandais si il était possible et si oui, comment faire une routine sous matlab pour transformer beaucoup de fichiers binaires (.pro) en fichiers ASCII.
Merci d'avance
Version imprimable
Bonjour,
Je me demandais si il était possible et si oui, comment faire une routine sous matlab pour transformer beaucoup de fichiers binaires (.pro) en fichiers ASCII.
Merci d'avance
C'est quoi un fichier ".pro" ?
Quel logiciel produit ces fichiers ?
As-tu une documentation expliquant leur encodage ?
Désolé un peu de temps pour répondre.
Non aucune doc sur leur encodage. Une personne de mon bureau a cependant déchiffrée le .pro :
http://img12.imageshack.us/img12/4192/projwm.jpg
J'aimerais bien avoir la valeur de la fréquence d'échantillonnage (offset 324) et toutes les valeurs de 2 voies (exemple 2 et 3), en réalité je cherche les valeurs des voies 1 et 2 mais je trouve pas les valeurs de la voie 1...
Merci
Bon en faite voilà, il faut que je le lise dans l'entête du fichier 3 valeurs :
"Durrée avant" codé sur 4 octets de 312 à 315
"Durée après" codé sur 4 octets de 316 à 319
"Fréquence" codé sur 4 octets de 324 à 327
Ensuite je dois calculer la position de la 1ere mesure de la voie 1 et de la deuxième de la voie 2. Comme elles sont identique j'aurais la taille (toujours en octet de chaque mesure). Et je pourrais ainsi, aussi les lire.
Alors j'ai regardé un peu fread pour lire en binaire
Donc par exemple pour extraire la "durée avant", un truc du genre
Durée_avant = fread(fid, [312 315], single);
ferait il l'affaire pensez vous?
(je ne peux pas tester en ce moment)
Et ensuite comment faire pour le transformer en valeur décimal?
Merci
Essaye plutôt ceci :
Code:
1
2
3
4 fid = fopen('data.pro','r'); fseek(fid,312); Duree_avant = fread(fid,1,'single'); fclose(fid);
Merci ! mais il aime pas ça..
retourneCode:
1
2
3
4 fid = fopen('080131_17195564.pro','r'); fseek(fid,312) Duree_avant = fread(fid,1,'single') fclose(fid);
?Citation:
??? Error using ==> fseek
Not enough input arguments.
Error in ==> Test_ouvert_binaire at 2
fseek(fid,312)
PS : oui maintenant je peux tester
OK ok il manquait juste le 3eme argument de fseek :'cof' je suppose..
merciCode:
1
2
3
4 fid = fopen('080131_17195564.pro','r'); fseek(fid,312,'cof') Duree_avant = fread(fid,1,'single') fclose(fid);
ca ne marche que si je ferme le fid à chaque fois.. pas moyen de le laisser ouvert?Code:
1
2
3
4
5
6
7
8
9
10
11
12 fid = fopen('080131_17195564.pro','r'); fseek(fid,312,'cof') duree_avant = fread(fid,1,'single') fclose(fid); fid = fopen('080131_17195564.pro','r'); fseek(fid,316,'cof') duree_apres = fread(fid,1,'single') fclose(fid); fid = fopen('080131_17195564.pro','r'); fseek(fid,324,'cof') freq_ech = fread(fid,1,'single') fclose(fid);
Merci
Désolé pour la réponse incomplète :oops:
Soit
Soit :Code:
1
2
3
4
5
6
7
8
9 fid = fopen('080131_17195564.pro','r'); fseek(fid,312,'bof') duree_avant = fread(fid,1,'single') fseek(fid,316,'bof') duree_apres = fread(fid,1,'single') fseek(fid,324,'bof') freq_ech = fread(fid,1,'single') fclose(fid);
Code:
1
2
3
4
5
6
7
8 fid = fopen('080131_17195564.pro','r'); fseek(fid,312,'bof') duree_avant = fread(fid,1,'single') fseek(fid,4,'cof') duree_apres = fread(fid,1,'single') fseek(fid,8,'cof') freq_ech = fread(fid,1,'single') fclose(fid);
Ha parfait merci et last question of the day :
maintenant grâce a un calcul laborieux je sais que la première mesure de la voie1 commence à l'octet 1011 et que la dernière, à l'octet 9998 en considérant qu'une mesure est toujours sur 2 octets.
Comme faire pour les prendre?
Alors je pensais à la même chose :
Mais justement, je ne comprends pas bien le 2ème argument de fread. Ca devrait être la taille? alors pourquoi mets-tu 1 et non 2 (pour deux octets)?Code:
1
2
3 fseek(fid,1011,'bof') voie1 = fread(fid,4999,'single') fclose(fid);
Et donc est ce que ma commande juste en haut est bonne?
Merci
Non, ce paramètre précise le nombre d'élément à lire avec le format donné juste après (pas la taille de l'élément à lire).
Dans le cas ci-dessus, on veut bien lire 1 éléments de classe Single.
Donc 4 octets... d'où le fait de passer de la position 312 à 316 depuis le début du fichier
Dernière précision, le troisième argument de FSEEK signifie :
- 'bof' : depuis le début du fichier
- 'cof' : depuis la position courante dans le fichier
- 'eof' : depuis la fin du fichier (donc décalage négatif)
OK merci pour ces précisions !
Donc normalement pour prendre les valeurs de la voie1, la commande que j'ai mis dans mon message précédent est bonne? Si je demande c'est parce qu'il me retourne pas les valeurs voulues mais cela peut être à cause de ma formule pour calculer le 1011...
Merci
Edit : en même temps tu peux pas savoir..je vai voir, merci
Franchement, le plus simple pour t'habituer avec les fonction FREAD et FSEEK et d'essayer de lire toutes les données en entête du fichier. Ce sont les seules que tu pourras aisément vérifier.
Une fois l'entête décodée terme à terme, tu ne devrais plus avoir de problème pour lire le reste...