Rigol DS1000E Waveform Examples

Scott Prahl

Mar 2026

[1]:
%config InlineBackend.figure_format = 'retina'

import numpy as np
import matplotlib.pyplot as plt
import imageio.v3 as iio

from RigolWFM import Wfm, DS1000E_scopes

repo = "https://raw.githubusercontent.com/scottprahl/RigolWFM/main/tests/files/"

Introduction

This notebook illustrates shows how to extract signals from a .wfm file created by a the Rigol DS1000E scope. It also validates that the process works by comparing with .csv and screenshots.

Two different .wfm files are examined one for the DS1052E scope and one for the DS1102E scope. The accompanying .csv files seem to have t=0 in the zero in the center of the waveform.

The list of Rigol scopes that should produce the same file format are:

[2]:
print(DS1000E_scopes[:])
['E', '1000E', 'DS1000E', 'DS1102E', 'DS1052E']

DS1052E

We will start with a .wfm file from a Rigol DS1052E scope. This test file accompanies wfm_view.exe a freeware program from http://www.hakasoft.com.au.
The waveform looks like

cf1664bdd68f4b91bb2982fdf0904a4d

Now let’s look at plot of the data from the corresponding .csv file created by wfm_view.exe

[3]:
csv_filename_52 = repo + "wfm/DS1052E.csv"

csv_data = np.genfromtxt(csv_filename_52, delimiter=",", skip_header=19, skip_footer=2, encoding="latin1").T

center_time = csv_data[0][-1] * 1e6 / 2

plt.subplot(211)
plt.plot(csv_data[0] * 1e6, csv_data[1], color="green")
plt.title("DS1052E from .csv file")
plt.ylabel("Volts (V)")
plt.xlim(center_time - 0.6, center_time + 0.6)
plt.xticks([])

plt.subplot(212)
plt.plot(csv_data[0] * 1e6, csv_data[2], color="red")
plt.xlabel("Time (µs)")
plt.ylabel("Volts (V)")
plt.xlim(center_time - 0.6, center_time + 0.6)

plt.show()
_images/Rigol-DS1000E_5_0.png

Now for the .wfm data

First a textual description.

[4]:
wfm_url = repo + "wfm/DS1052E.wfm?raw=true"
w = Wfm.from_url(wfm_url, "1000E")
description = w.describe()
print(description)
    General:
        File Model   = DS1000E
        User Model   = 1000E
        Parser Model = wfm1000e
        Firmware     = unknown
        Filename     = DS1052E.wfm
        Channels     = [1, 2]

    Trigger:
        Mode     = edge
        Source   = CH2
        Level    = 2.40  V
        Sweep    = AUTO
        Coupling = DC
        Derived Level     = 3.84  V

     Channel 1:
         Coupling =  unknown
            Scale =     1.00  V/div
           Offset =     2.00  V
            Probe =      10X
         Inverted =    False

        Time Base =  100.000 ns/div
           Offset =    0.000  s
            Delta =    2.000 ns/point
           Points =     8192

         Count    = [        1,        2,        3  ...      8191,     8192]
           Raw    = [       76,       76,       76  ...        76,       76]
           Times  = [-8.192 µs,-8.190 µs,-8.188 µs  ...  8.188 µs, 8.190 µs]
           Volts  = [-40.00 mV,-40.00 mV,-40.00 mV  ... -40.00 mV,-40.00 mV]

     Channel 2:
         Coupling =  unknown
            Scale =     2.00  V/div
           Offset =    -6.00  V
            Probe =       1X
         Inverted =    False

        Time Base =  100.000 ns/div
           Offset =    0.000  s
            Delta =    2.000 ns/point
           Points =     8192

         Count    = [        1,        2,        3  ...      8191,     8192]
           Raw    = [      203,      203,      203  ...       138,      138]
           Times  = [-8.192 µs,-8.190 µs,-8.188 µs  ...  8.188 µs, 8.190 µs]
           Volts  = [-240.00 mV,-240.00 mV,-240.00 mV  ...   4.96  V,  4.96  V]


downloading 'https://raw.githubusercontent.com/scottprahl/RigolWFM/main/tests/files/wfm/DS1052E.wfm?raw=true'
[5]:
ch = w.channels[0]
plt.subplot(211)
plt.plot(ch.times * 1e6, ch.volts, color="green")
plt.title("DS1052E from .wfm file")
plt.ylabel("Volts (V)")
plt.xlim(-0.6, 0.6)

plt.xticks([])

ch = w.channels[1]
plt.subplot(212)
plt.plot(ch.times * 1e6, ch.volts, color="red")
plt.xlabel("Time (ms)")
plt.ylabel("Volts (V)")
plt.xlim(-0.6, 0.6)

plt.show()
_images/Rigol-DS1000E_8_0.png

DS1102E-B

First the .csv data

This file only has one active channel. Let’s look at what the accompanying .csv data looks like.

[6]:
csv_filename = repo + "wfm/DS1102E-B.csv"

my_data = np.genfromtxt(csv_filename, delimiter=",", skip_header=2).T

plt.plot(my_data[0] * 1e6, my_data[1])
plt.xlabel("Time (µs)")
plt.ylabel("Volts (V)")
plt.title("DS1102E-B with a single trace")
plt.show()
_images/Rigol-DS1000E_10_0.png

Now for the wfm data

First let’s have look at the description of the internal file structure. We see that only channel 1 has been enabled.

[7]:
wfm_url = repo + "wfm/DS1102E-B.wfm?raw=true"
w = Wfm.from_url(wfm_url, "DS1102E")
description = w.describe()
print(description)
    General:
        File Model   = DS1000E
        User Model   = DS1102E
        Parser Model = wfm1000e
        Firmware     = unknown
        Filename     = DS1102E-B.wfm
        Channels     = [1]

    Trigger:
        Mode     = edge
        Source   = CH1
        Level    = -0.00  V
        Sweep    = AUTO
        Coupling = DC
        Derived Level     = 4.08  V

     Channel 1:
         Coupling =  unknown
            Scale =     2.00  V/div
           Offset =     0.00  V
            Probe =       1X
         Inverted =    False

        Time Base =    1.000 µs/div
           Offset =    0.000  s
            Delta =   10.000 ns/point
           Points =    16384

         Count    = [        1,        2,        3  ...     16383,    16384]
           Raw    = [      142,      141,      141  ...        70,       70]
           Times  = [-81.920 µs,-81.910 µs,-81.900 µs  ... 81.900 µs,81.910 µs]
           Volts  = [ -1.36  V, -1.28  V, -1.28  V  ...   4.40  V,  4.40  V]


downloading 'https://raw.githubusercontent.com/scottprahl/RigolWFM/main/tests/files/wfm/DS1102E-B.wfm?raw=true'
[8]:
w.plot()
plt.xlim(-6, 6)
plt.show()
_images/Rigol-DS1000E_13_0.png

DS1102E-E

[Contributed by @Stapelberg](https://github.com/scottprahl/RigolWFM/issues/11#issue-718562669)

This file uses a 10X probe. First let’s have look at the description of the internal file structure. We see that only channel 1 has been enabled and it has a 10X probe.

[9]:
wfm_url = repo + "wfm/DS1102E-E.wfm?raw=true"
w = Wfm.from_url(wfm_url, "DS1102E")
description = w.describe()
print(description)
downloading 'https://raw.githubusercontent.com/scottprahl/RigolWFM/main/tests/files/wfm/DS1102E-E.wfm?raw=true'
    General:
        File Model   = DS1000E
        User Model   = DS1102E
        Parser Model = wfm1000e
        Firmware     = unknown
        Filename     = DS1102E-E.wfm
        Channels     = [1]

    Trigger:
        Mode     = edge
        Source   = CH1
        Level    = 25.60  V
        Sweep    = SINGLE
        Coupling = DC
        Derived Level     = 24.00  V

     Channel 1:
         Coupling =  unknown
            Scale =    10.00  V/div
           Offset =   -30.80  V
            Probe =      10X
         Inverted =    False

        Time Base =    5.000 ms/div
           Offset =   12.800 ms
            Delta =  200.000 ns/point
           Points =  1048576

         Count    = [        1,        2,        3  ...   1048575,  1048576]
           Raw    = [      132,      132,      132  ...       134,      134]
           Times  = [-92.058 ms,-92.057 ms,-92.057 ms  ... 117.657 ms,117.657 ms]
           Volts  = [ 28.00  V, 28.00  V, 28.00  V  ...  27.20  V, 27.20  V]


[10]:
w.plot()
plt.xlim(-100, 100)
plt.show()
_images/Rigol-DS1000E_16_0.png
[ ]: