Hallo allerseits.
Ich bin gerade dabei, das "Waveform"-Dateiformat (.wfm) der
Rigol-Oszilloskope auseinanderzupflücken und bin damit eigentlich auch
schon recht weit gekommen (Das Projekt auf
http://wfmreader.sourceforge.net/ kenne ich, da fehlen allerdings noch
ein paar Sachen).
Allerdings fehlt mir eine entscheidende Information um die Daten
wirklich interpretieren zu können und da stehe ich gerade auf dem
Schlauch und zwar ist das die Samplerate der gespeicherten Daten.
Ich habe Testdaten mit einem Rigol DS1102CD aufgenommen, das ist ein
100MHz-Oszi mit 400MSa/s.
Ich habe vier Bytes im Header gefunden (ab Offset 0x64), in denen
höchstwahrscheinlich die Information zur Samplerate drin steht, kriege
die aber nicht interpretiert (die 8 Bytes danach geben die Länge eines
divs in Picosekunden an). Vielleicht hat hier ja eine Idee, wie die
Informationen da drin stecken:
Ich habe hier bei vier versch. Beispiele die abgedeckte Zeitspanne am
Oszilloskop abgelesen und kann daraus auf die Samplerate rückwärts
errechnen. Das würde ich mir gerne ersparen.
Alle folgenden Beispiele haben 524288 Samples
1 | time/div abgedeckte Zeitspanne Zeit/sample Samplerate Bytefolge
| 2 | 10ms -131.072 .. 131.0715ms 0.00050ms 2MHz 00 24 F4 49
| 3 | 1ms -13.107 .. 13.1071ms 0.00005ms 20MHz 80 96 98 4B
| 4 | 500us -5.243 .. 5.2430ms 0.00002ms 50MHz 20 BC 3E 4C
| 5 | 200us -2.622 .. 2.6140ms 0.00001ms 100MHz 20 BC BE 4C
|
Was ist der Zusammenhang zwischen der Bytefolge und entweder Samplerate
oder Zeit/Sample? Diese Angabe brauche ich, um einem Sample in den
gespeicherten Daten eine Zeit zuordnen zu können. Ich kann zwar lesen
wie groß ein div beim Sampeln war, das nutzt mir aber nix, weil ich ja
nicht weiß, wieviele divs die Aufzeichnung enthält...
Viele andere Zahlenangaben sind mit 2, 4 oder 8 Bytes gespeichert, und
dann mit Little-Endian. Allerdings komme ich mit diesem Ansatz auf
keinen grünen Zweig.
Fällt jemandem hier ein Zusammenhang auf?
Vielen Dank,
Simon
Und hier nochmal ein kompletter Header mit den daraus gelesenen
Informationen:
1 | waveform.wfm
| 2 | 0000 0000: A5 A5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
| 3 | 0000 0010: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 ........ ........
| 4 | 0000 0020: 05 00 00 00 A0 86 01 00 00 00 00 00 00 00 20 41 ........ ...... A
| 5 | 0000 0030: 00 00 00 00 A0 86 01 00 00 00 00 00 D0 07 00 00 ........ ........
| 6 | 0000 0040: 00 00 00 00 00 00 20 41 00 00 00 00 D0 07 00 00 ...... A ........
| 7 | 0000 0050: 00 00 00 00 00 C2 EB 0B 00 00 00 00 00 4A DD F2 ........ .....J..
| 8 | 0000 0060: 12 00 00 00 80 96 98 4A 00 F2 05 2A 01 00 00 00 .......J ...*....
| 9 | 0000 0070: 00 0A D5 A4 0D 00 00 00 01 06 7F 00 00 02 04 06 ........ ........
| 10 | 0000 0080: 08 0A 0C 07 08 09 0A 0B 0C 0D 0E 0F 0F 0F 00 00 ........ ........
| 11 | 0000 0090: 0B 00 02 00 00 00 80 3F 95 BF D6 33 48 00 00 00 .......? ...3H...
| 12 | 0000 00A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
| 13 | 0000 00B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
| 14 | 0000 00C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
| 15 | 0000 00D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
| 16 | 0000 00E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
| 17 | 0000 00F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
| 18 | 0000 0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
| 19 | [... hier folgen die Sampledaten ...]
|
Folgende Informationen kriege ich da raus:
1 | 'ch1_att': 10.0,
| 2 | 'ch1_inverted': 0,
| 3 | 'ch1_pos': 0.0,
| 4 | 'ch1_scale': 1.0,
| 5 | 'ch1_scale_view': 1.0,
| 6 | 'ch1_written': 0,
| 7 | 'ch2_att': 10.0,
| 8 | 'ch2_inverted': 0,
| 9 | 'ch2_pos': 0.0,
| 10 | 'ch2_scale': 0.02,
| 11 | 'ch2_scale_view': 0.02,
| 12 | 'ch2_written': 0,
| 13 | 'cur_channel': 5,
| 14 | 'disp_offset': 0.081384,
| 15 | 'disp_scale': 0.0002,
| 16 | 'have_data': 1,
| 17 | 'la_current': 6,
| 18 | 'la_enabled': (1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
| 19 | 'la_pos': (0, 2, 4, 6, 8, 10, 12, 7, 8, 9, 10, 11, 12, 13, 14, 15),
| 20 | 'la_scale0_7': 15,
| 21 | 'la_scale8_f': 15,
| 22 | 'la_written': 1,
| 23 | 'magic': '0xa5a5',
| 24 | 'no_datapoints': 524288,
| 25 | 'sampling_freq': 1251513984,
| 26 | 'sampling_offset': 0.0586,
| 27 | 'sampling_scale': 0.005,
| 28 | 'trigger_edge': 'rising',
| 29 | 'trigger_mode': 'Edge',
| 30 | 'trigger_src': 'D5',
| 31 | 'trigger_type': 2,
|
Viele Grüße,
Simon
Duh, das war ein dicker Schlauch.
Die 32 Bit sind schlicht und einfach single-prescision Floats, die die
Samplingrate darstellen - ein Freund hat mich da gerade mit der Nase
drauf gestoßen...
Danke fürs Problemanhören :-)
Viele Grüße,
Simon
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|