Forum: Analoge Elektronik und Schaltungstechnik "Waveform" Dateiformat Rigol Oszilloskope


von Simon B. (nomis)


Lesenswert?

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

von Simon B. (nomis)


Lesenswert?

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

von Simon B. (nomis)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.