WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Binäre Zahlendarstellung aus .log-Datei auslesen

 

knorkwurst
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2014, 18:13     Titel: Binäre Zahlendarstellung aus .log-Datei auslesen
  Antworten mit Zitat      
Hallo Community,

ich habe ein Problem beim richtigen auslesen einer Datei. Ich habe eine "testaufnahme.log" Datei, in der nur Einsen und Nullen stehen. Jeweils 16 aufeinander folgende Zahlen sollen einen Messwert darstellen, die hintereinander in einem Vektor stehen sollen. Ich schaffe es nicht die Datei richtig auszulesen damit in jeder Vektorspalte die jeweiligen 16bit drin stehen(erster Eintrag=die ersten 16 Einsen und Nullen; zweiter Eintrag=die nächsten 16 Einsen und Nullen; usw.). Mit "bin2dec" kann ich diese danach ja einfach umwandeln. Ich habe schon das MathWorks: Documentation Center durchsucht und mit den Befehlen:
Code:

%angefangen mit fid=fopen('testaufnahme.log');
A=fread(fid)
A=textscan(fid)
A=Importsate('testaufnahme.log')
 

herumgespielt, aber noch nicht die richtige Lösung gefunden.
Kann mir jemand ein Codebespiel zeigen, in dem man sieht wie man Matlab sagt, dass es eine bestimmte Anzahl von Zahlen aus einer Datei in eine Vektorspalte schreibt?

Grüße Dennis
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.03.2014, 19:30     Titel:
  Antworten mit Zitat      
Hallo,

eine Beispieldatei wäre hilfreich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
knorkwurst
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2014, 20:38     Titel:
  Antworten mit Zitat      
Hallo Harald,

zum rumprobieren habe ich mir jetzt mal eine einfache "test.txt" Datei erstellt, mit den Zahlen von 0 bis 7 in Binärdarstellung (nur 8bit, noch nicht 16bit-Darstelllung).
Wenn ich den Befehl
Code:
A=importdata('test.txt',';')
benutze kann ich die Unterteilung ja einfach mit Satzzeichen wie ";" erreichen, wenn ich einfach nach jeder 8. Ziffer dieses einfüge. Das habe ich schon herausgefunden und der Vektor A hat dann in jeder Spalte die 8 Einsen und Nullen.
Meine Dateien die ich benutzen will haben diese Satzzeichen aber nicht.

Gruß
Dennis

test.txt
 Beschreibung:

Download
 Dateiname:  test.txt
 Dateigröße:  64 Bytes
 Heruntergeladen:  396 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.03.2014, 21:04     Titel:
  Antworten mit Zitat      
Hallo,

hier ginge es so:
Code:

fid = fopen('test.txt');
data = textscan(fid, '%8c'); % 8 bit
fclose(fid)
data = bin2dec(data{1});


Es ist gut möglich, dass es auch effizienter ginge. Das ist aber vor allem auf das Dateiformat zutreffend! Warum nicht die Datei als Binärdatei abspeichern statt als Datei, in der 0 und 1 als Text enthalten sind?!

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
knorkwurst
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2014, 21:41     Titel:
  Antworten mit Zitat      
Danke erstmal Smile

Ich beschäftige mich damit noch nicht so lange und habe daher noch nicht viel Erfahrung.
Wenn ich die Daten als Binärdatei speichere, kann ich den Befehl "fread(fid)" nehmen oder?
Hatte das schon ausprobiert, aber da gabs Probleme weil die Daten 2er Komplement sind und Matlab immer die Nullen weggelassen hat (z.B. wurde aus 00001100 immer 1100 und somit ein falscher Wert). Deswegen hatte ich es zum Testen einfach erstmal nur normal Binär geschrieben.

testaufnahme.zip
 Beschreibung:
nochmal ein kurzer Ausschnitt von Daten als RAW-Format

Download
 Dateiname:  testaufnahme.zip
 Dateigröße:  274 Bytes
 Heruntergeladen:  308 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.03.2014, 21:57     Titel:
  Antworten mit Zitat      
Hallo,

bei fread ist das entscheidende, dass die Daten im richtigen Format eingelesen werden. In der Doku findest du mehr dazu, welche Formate es gibt.

Welche Werte beinhaltet deine Datei denn?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
knorkwurst
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2014, 22:38     Titel:
  Antworten mit Zitat      
Hallo,

ein Messwert beinhaltet immer ein 8bit Low-Byte und ein 8bit Highbyte, die zusammen als 16bit 2er-Komplement ausgewertet werden müssen(die Werte liegen also zwischen −32768 und +32767).
Das Format pro Byte ist "unsigned char" (habe einen Mikrocontroller in C-Programmiert) und bei Matlab müsste es dann uint8 sein glaub ich. Das High und Low-Byte zusammen sollten am Ende ein "uint16" sein, was ich per
Code:

%zum Beispiel
b=mvl2dec(a,true);
in eine Decimal-Zahl umwandeln kann dachte ich mir.

Gruß
Dennis
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.03.2014, 22:52     Titel:
  Antworten mit Zitat      
Hallo,

ich komme nicht aus der Ecke und kann mit Beschreibungen wie 2er-Komplement nicht viel anfangen.

Hilfreich wäre wie gesagt die Information, welche Werte die Datei denn enthält - sprich, was die Nullen und Einsen im Klartext ergeben sollen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
knorkwurst
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2014, 23:25     Titel:
  Antworten mit Zitat      
Hallo,

die Nullen und Einsen ergeben einfach nur einen Wert, mit dem ich weiterrechnen muss und den ich später noch plotten möchte (z.B. 3 m/s oder 22°C, jenachdem was für einen Sensor ich anspreche). Mir gehts nur um den Befehl, mit dem ich quasi die Werte, die aus 16bit bestehen, aus der Datei in einen Vektor oder Matrix schreiben kann.
"fread(fid)" wird in der Documentation in Bezug auf Binärdarstellung immer benutzt, also dachte ich das muss ich auch benutzen, habe es nur noch nicht richtig hinbekommen.

Gruß
Dennis
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.03.2014, 23:37     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
die Nullen und Einsen ergeben einfach nur einen Wert,

und welche Werte sind das in deinem Beispiel? Ich habe fread mit verschiedenen Formaten auf deine Datei angewendet und würde dir gerne sagen, welches Format das richtige ist. Dazu müsste ich aber wissen, welche Zahlen bei dieser Beispieldatei denn herauskommen sollen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
knorkwurst
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2014, 00:03     Titel:
  Antworten mit Zitat      
Hallo,

habe nochmal schnell eine neue einfache Datei erstellt. Dort ist eine Temperaturmessung als Kommazahl enthalten (Messwert an sich wieder 16bit lag). Die ersten 8bit sind die Zahl vor dem Komma und sollten bei einem Wert von 23 sein. Die jeweils zweiten 8bit sind die Nachkommastellen und schwanken zwischen einem Wert von 80 und 100.

Gruß
Dennis

testaufnahme2.zip
 Beschreibung:

Download
 Dateiname:  testaufnahme2.zip
 Dateigröße:  221 Bytes
 Heruntergeladen:  332 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.04.2014, 09:31     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Die jeweils zweiten 8bit sind die Nachkommastellen und schwanken zwischen einem Wert von 80 und 100.

D.h. die Zahlen sollen insgesamt zwischen 23.8 und 24 schwanken, oder worauf beziehen sich die 80 und 100?

Hier ein erster Versuch:
Code:
fid = fopen('testaufnahme2.log');
rawdata = fread(fid, 'uint8');
fclose(fid);
data = rawdata(1:2:end) + 2^(-8)*rawdata(2:2:end)

Der Nachkommateil stimmt wohl noch nicht so ganz. Das bekommst du aber vielleicht besser hin als ich, weil du ja weißt, wie das interpretiert werden muss.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
knorkwurst
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2014, 09:41     Titel:
  Antworten mit Zitat      
Vielen Dank,

die 80 bis 100 beziehen sich auf den Binärwert den man direkt aus den Einsen und Nullen ablesen kann, die Umrechnung in den Temperaturwert hab ich noch nicht gemacht, aber das ist einfach.
Werde das gleich mal versuchen umzusetzten.

Gruß Dennis
Private Nachricht senden Benutzer-Profile anzeigen
 
knorkwurst
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2014, 13:15     Titel:
  Antworten mit Zitat      
Hallo,

es funktioniert nun wie ich es haben möchte. Aber jetzt tritteinanderes Problem auf. Wenn ich "bin2dec(a)" benutzen möchte, müssen die Werte von a als "binarystr" (z.B. a=['1011':'1101':'1110']) vorhanden sein. In meinem Modell sind die Werte in a aber nur binary (z.B. a=[1011:1101:1110]). Gibt es einen Befehl mit dem ich "binary" zu "binarystr" machen kann? (sowas wie "bin2binstr(a)" gibts ja nicht)

Gruß
Dennis
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.04.2014, 13:28     Titel:
  Antworten mit Zitat      
Hallo,

dieses a sieht merkwürdig aus. Bitte den Code posten, wie a zustandekommt. Das hilft nicht nur bei der Nachvollziehbarkeit, sondern kann auch für andere interessant sein, die ein ähnliches Problem haben.

num2str könnte helfen, aber wie gesagt: hängt davon ab, wie a genau aussieht.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.