{"id":22572327,"url":"https://github.com/scottprahl/rigolwfm","last_synced_at":"2026-04-06T02:14:00.076Z","repository":{"id":47668471,"uuid":"244228290","full_name":"scottprahl/RigolWFM","owner":"scottprahl","description":"Parsers for .wfm binary files created by a wide range of Rigol oscilloscopes","archived":false,"fork":false,"pushed_at":"2024-06-01T15:47:38.000Z","size":46683,"stargazers_count":46,"open_issues_count":8,"forks_count":6,"subscribers_count":5,"default_branch":"main","last_synced_at":"2024-11-11T06:24:52.109Z","etag":null,"topics":["kaitai-struct","oscilloscope","parser","rigol"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/scottprahl.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-03-01T21:42:39.000Z","updated_at":"2024-11-06T15:58:06.000Z","dependencies_parsed_at":"2023-02-01T02:16:02.935Z","dependency_job_id":"c57e4fec-de87-42c0-8cf6-446d955ede2c","html_url":"https://github.com/scottprahl/RigolWFM","commit_stats":{"total_commits":448,"total_committers":8,"mean_commits":56.0,"dds":0.1450892857142857,"last_synced_commit":"38c9b161054157d36cddf714b82cf8e91ee60ed4"},"previous_names":[],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottprahl%2FRigolWFM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottprahl%2FRigolWFM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottprahl%2FRigolWFM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottprahl%2FRigolWFM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scottprahl","download_url":"https://codeload.github.com/scottprahl/RigolWFM/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228679039,"owners_count":17955980,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kaitai-struct","oscilloscope","parser","rigol"],"created_at":"2024-12-08T02:08:52.388Z","updated_at":"2026-04-06T02:14:00.070Z","avatar_url":"https://github.com/scottprahl.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":".. |pypi-badge| image:: https://img.shields.io/pypi/v/RigolWFM?color=68CA66\n   :target: https://pypi.org/project/RigolWFM/\n   :alt: pypi\n\n.. |github-badge| image:: https://img.shields.io/github/v/tag/scottprahl/RigolWFM?label=github\u0026color=68CA66\n   :target: https://github.com/scottprahl/RigolWFM\n   :alt: github\n\n.. |conda-badge| image:: https://img.shields.io/conda/vn/conda-forge/RigolWFM?label=conda\u0026color=68CA66\n   :target: https://github.com/conda-forge/RigolWFM-feedstock\n   :alt: conda\n\n.. |kaitaistruct| image:: https://img.shields.io/badge/kaitai-struct-68CA66\n   :target: https://ide.kaitai.io\n   :alt: kaitai-struct\n\n.. |zenodo-badge| image:: https://zenodo.org/badge/244228290.svg\n   :target: https://zenodo.org/badge/latestdoi/244228290\n   :alt: doi\n\n.. |license-badge| image:: https://img.shields.io/github/license/scottprahl/RigolWFM?color=68CA66\n   :target: https://github.com/scottprahl/RigolWFM/blob/main/LICENSE.txt\n   :alt: License\n\n.. |test-badge| image:: https://github.com/scottprahl/RigolWFM/actions/workflows/test.yaml/badge.svg\n   :target: https://github.com/scottprahl/RigolWFM/actions/workflows/test.yaml\n   :alt: Testing\n\n.. |docs-badge| image:: https://readthedocs.org/projects/rigolwfm/badge?color=68CA66\n   :target: https://rigolwfm.readthedocs.io\n   :alt: Docs\n\n.. |downloads-badge| image:: https://img.shields.io/pypi/dm/RigolWFM?color=68CA66\n   :target: https://pypi.org/project/RigolWFM/\n   :alt: Downloads\n\n.. |view| image:: https://img.shields.io/badge/view-scope_file-68CA66\n   :target: https://scottprahl.github.io/RigolWFM/\n   :alt: Oscilloscope Web Viewer\n\nRigolWFM\n=========\n\nby Scott Prahl\n\nA utility to process oscilloscope waveform files\n------------------------------------------------\n\n|pypi-badge| |github-badge| |conda-badge| |kaitaistruct| |zenodo-badge|\n\n|license-badge| |test-badge| |docs-badge| |downloads-badge|\n\n|view|\n\nThis project started as a resource for interpreting the proprietary ``.wfm``\nfiles created by Rigol oscilloscopes.  It now also includes parsers for\nTektronix, LeCroy, Agilent / Keysight, Siglent, Yokogawa, and Rohde \u0026\nSchwarz waveform files.\nOpen source tools that can parse or convert these binary oscilloscope formats\nare often balkanized: each program tends to support a single oscilloscope\ngroup.  I have gathered a bunch together here.\n\nThis project leverages the domain specific language at\n\u003chttps://doc.kaitai.io\u003e to describe binary files.  Once a format has been\ndescribed in this text form, parsers can be generated for a wide range of\nlanguages.\n\nInstallation\n---------------\n\nYou can install locally using pip::\n    \n    pip install RigolWFM\n\nor ``conda``::\n\n    conda install -c conda-forge RigolWFM\n\nor just open \u003chttps://scottprahl.github.io/RigolWFM/\u003e and try the web version.\n\nUsage\n-----\n\nOnce ``RigolWFM`` is installed, you can plot signals from supported waveform\nfiles by::\n\n   import matplotlib.pyplot as plt\n   from RigolWFM import Wfm\n\n   w = Wfm.from_file(\"example.wfm\")\n   w.plot()\n   plt.show()\n\n``Wfm.from_file()`` will autodetect the file family for supported formats, so\nthe same call works for Rigol ``.wfm`` / ``.bin`` files, Tektronix ``.wfm`` /\n``.isf`` files, LeCroy ``.trc`` files, Agilent / Keysight ``AGxx`` ``.bin``\nfiles, supported Siglent ``.bin`` revisions, Yokogawa ``.wfm`` files, and\nRohde \u0026 Schwarz RTP XML ``.bin`` files with companion ``.Wfm.bin`` payloads.\n\n\nAlternatively, ``wfmconvert`` can be used from the command line.  For example, the following should convert all the DS1000E files in the current directory to the ``.csv`` format::\n\n   prompt\u003e wfmconvert csv *.wfm\n\nIf you just wanted to convert channel 1 from a single file to ``.csv`` then::\n\n   prompt\u003e wfmconvert --channel 1 csv DS1102E.wfm\n\nIf you wanted to a signal `.wav` file using the second channel waveform (for use with LTspice) then:: \n\n   prompt\u003e wfmconvert --channel 2 wav *.wfm\n\nIf you want to create a ``.wav`` file with channels one and four as signals (using the default auto scaling for Audacity or Sigrok Pulseview)::\n\n   prompt\u003e wfmconvert --channel 14 wav *.wfm\n\nThe project also includes a browser-based viewer at\n\u003chttps://scottprahl.github.io/RigolWFM/\u003e.  The current web app supports Rigol\n``.wfm`` / ``.bin`` files, Tektronix ``.wfm`` / ``.isf`` files, LeCroy\n``.trc`` files, Agilent / Keysight ``AGxx`` ``.bin`` files, Rohde \u0026\nSchwarz RTP XML ``.bin`` files plus their companion ``.Wfm.bin`` payloads,\nand supported Siglent ``.bin`` revisions.\n\nStatus\n------\n\nThere are binary file descriptions and normalized adapters for waveform files\ncreated by the following oscilloscopes.  Most of these work directly through\n``Wfm.from_file()``; rows with special limitations are called out in the notes.\n\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Family             | Models           | Format            | Notes                                         |\n+====================+==================+===================+===============================================+\n| Rigol DS1000B      | DS1074/1104/     | ``.wfm``          | tested                                        |\n|                    | 1204B            |                   |                                               |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rigol DS1000C      | DS1042/1102/     | ``.wfm``          | tested (limited files)                        |\n|                    | 1202CA           |                   |                                               |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rigol DS1000D      | DS1052/1102D     | ``.wfm``          | tested (limited files)                        |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rigol DS1000E      | DS1052/1102E     | ``.wfm``          | tested                                        |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rigol DS1000Z      | DS1054Z,         | ``.wfm``          | tested                                        |\n|                    | MSO1054Z, etc.   |                   |                                               |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rigol DS2000       | DS2072A,         | ``.wfm``          | tested                                        |\n|                    | MSO2102A, etc.   |                   |                                               |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rigol DS4000       | DS4012-DS4054,   | ``.wfm``          | tested                                        |\n|                    | MSO4012-MSO4054  |                   |                                               |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rigol DS6000       | DS6062-DS6104    | ``.wfm``          | untested                                      |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rigol MSO5000      | MSO5354, etc.    | ``.bin``          | tested                                        |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rigol MSO7000 /    | DS7000, MSO7000, | ``.bin``          | tested                                        |\n| MSO8000            | MSO8000, DS8000  |                   |                                               |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rigol DHO800 /     | DHO800, DHO1000  | ``.bin``          | tested; calibrated float32 samples, official  |\n| DHO1000            |                  | ``.wfm``          | ``.bin`` and proprietary ``.wfm`` support     |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Tektronix WFM      | modern DPO/DSA   | ``.wfm``          | supports ``WFM#001``/``WFM#002``/``WFM#003``; |\n|                    | families         |                   | legacy ``LLWFM`` also supported               |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Tektronix ISF      | many Tek scopes  | ``.isf``          | tested                                        |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| LeCroy             | many WaveRunner/ | ``.trc``          | tested; handles SCPI-prefixed ``WAVEDESC``    |\n|                    | WaveSurfer/etc.  |                   | files                                         |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Agilent /          | InfiniiVision /  | ``.bin``          | supports ``AG01``/``AG03``/``AG10`` analog    |\n| Keysight           | Infiniium        |                   | captures; low-level parser preserves segments |\n|                    |                  |                   | and multi-buffer metadata                     |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Rohde \u0026 Schwarz    | RTP / RTO / RTM  | ``.bin`` +        | normalized single-acquisition analog exports; |\n| RTP export         | families         | ``.Wfm.bin``      | history / multi-acquisition captures reject   |\n|                    |                  |                   | explicitly                                    |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Siglent            | documented       | ``.bin``          | supports documented V0.1-V6 revisions; old    |\n|                    | ``.bin``         |                   | platform files are detectable via low-level   |\n|                    | families         |                   | parsers but not normalized yet                |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n| Yokogawa           | ASCII-header     | ``.wfm``          | tested single-file import path                |\n|                    | waveform exports |                   |                                               |\n+--------------------+------------------+-------------------+-----------------------------------------------+\n\nResources\n---------\n\nThis has been a bit of an adventure.  In the process of nailing down the basic formats, I have gleaned information from a wide range of projects started by others.\n\n* Shein's \u003chttps://sourceforge.net/projects/wfmreader\u003e\n* Wagenaars's \u003chttps://www.mathworks.com/matlabcentral/fileexchange/18999-read-binary-rigol-waveforms\u003e\n* Steele's \u003chttp://nsweb.tn.tudelft.nl/~gsteele/rigol2dat\u003e\n* Blaicher's \u003chttps://github.com/mabl/pyRigolWFM\u003e\n* Szkutnik's \u003chttps://github.com/michal-szkutnik/pyRigolWfm1000Z\u003e\n* Cat-Ion's \u003chttps://github.com/Cat-Ion/rigol-ds4000-wfm\u003e\n* Šolc's \u003chttps://www.tablix.org/~avian/blog/archives/2019/08/quick_and_ugly_wfm_data_export_for_rigol_ds2072a/\u003e\n* Contributions from \u003chttp://www.hakasoft.com.au/wfm_viewer\u003e\n* Rigol's documentation of the 1000E, 1000Z, 2000, and 6000 file formats.\n* Rigol's documentation of the ``.bin`` formats for the 1000, 5000, and 8000\n* Lathe's \u003chttps://github.com/Lathe26/WFM_for_Rigol_DHO800_900\u003e\n* Nezarati's \u003chttps://nezarati.github.io/waveform-viewer/index.html\u003e\n* Wavebin's \u003chttps://github.com/eyalroz/wavebin\u003e Agilent / Keysight parsers and samples\n* Agilent / Keysight ``.bin`` reference readers and programming guides\n* Siglent's waveform format PDF and vendor reference parsers\n* SMASH toolbox vendor importers for Tektronix, LeCroy, and Yokogawa formats\n\nLicense\n-------\n    BSD 3-clause -- see the file ``LICENSE`` for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscottprahl%2Frigolwfm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscottprahl%2Frigolwfm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscottprahl%2Frigolwfm/lists"}