Giter VIP home page Giter VIP logo

adder-codec-rs's Introduction

ADDER-codec-rs

Build Status Documentation codecov Crates.io Downloads

A unified framework for event-based video. Encoder/transcoder/decoder for ADΔER (Address, Decimation, Δt Event Representation) video streams. Includes a transcoder for casting framed video into an ADΔER representation in a manner which preserves the temporal synchronicity of the source, but enables many-frame intensity averaging on a per-pixel basis and extremely high dynamic range.

blender_output2_30_mid

To enable the use of source-modeled lossy compression (the only such scheme for event-based video, as far as I'm aware), install/import the relevant crates below with the compression feature enabled and the nightly toolchain. For example, install adder-viz as follows:

cargo +nightly install adder-viz -F "compression"

To transcode from an iniVation DVS/DAVIS camera (using an older method, not yet unified with the Prophesee transcoder), enable the open-cv feature:

cargo +nightly install adder-viz -F "compression open-cv"
Source 8-bit image frame with shadows boosted (source video) Frame reconstructed from ADΔER events, generated from 48 input frames, with shadows boosted. Note the greater dynamic range and temporal denoising in the shadows.

Included crates

  • adder-codec-rs: ADΔER transcoders [source] Crates.io
  • adder-codec-core: core library [source] Crates.io
  • adder-info: tool for reading metadata of a .adder file [source] Crates.io
  • adder-to-dvs: tool for quickly converting a .adder file to a reasonable DVS representation in a text format [source] Crates.io
  • adder-viz: GUI application for transcoding framed and event (DVS/DAVIS) video to ADΔER, playing back .adder files, and visualizing the many available ADΔER parameters [source] Crates.io

Other crates

  • davis-edi-rs: a super high-speed system for performing frame deblurring and framed reconstruction from DAVIS/DVS streams, forming the backbone for the event camera driver code in the ADΔER library [source] Crates.io
  • aedat-rs: a fast AEDAT 4 Rust reader. [source] Crates.io

More information

Read this paper and the wiki for background on ADΔER, how to use it, and what tools are included.

Contributing

Several open issues would greatly benefit from additional help! I've marked some as "good first issues" for new contributors. If you have any questions, please ask them on the issues page so others with similar questions can refer to our discussions. I will try to elucidate any confusing code or concepts with better documentation.

Cite this work

If you write a paper which references this software, we ask that you reference the following papers on which it is based. Citations are given in the BibTeX format.

An Open Software Suite for Event-Based Video

Note: The code associated with this paper was released in version 0.4.3.

@misc{freeman2024open,
      title={An Open Software Suite for Event-Based Video}, 
      author={Andrew C. Freeman},
      year={2024},
      eprint={2401.17151},
      archivePrefix={arXiv},
      primaryClass={cs.MM}
}

Accelerated Event-Based Feature Detection and Compression for Surveillance Video Systems

Note: The code associated with this paper was released in version 0.4.1. This paper has been accepted for publication at MMSys '24.

@misc{freeman2023accelerated,
      title={Accelerated Event-Based Feature Detection and Compression for Surveillance Video Systems}, 
      author={Andrew C. Freeman and Ketan Mayer-Patel and Montek Singh},
      year={2023},
      eprint={2312.08213},
      archivePrefix={arXiv},
      primaryClass={cs.MM}
}

An Asynchronous Intensity Representation for Framed and Event Video Sources

Note: The code associated with this paper was released in version 0.2.0

@inproceedings{10.1145/3587819.3590969,
author = {Freeman, Andrew C. and Singh, Montek and Mayer-Patel, Ketan},
title = {An Asynchronous Intensity Representation for Framed and Event Video Sources},
year = {2023},
isbn = {979-8-4007-0148-1/23/06},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
url = {https://doi.org/10.1145/3587819.3590969},
doi = {10.1145/3587819.3590969},
booktitle = {Proceedings of the 14th ACM Multimedia Systems Conference},
pages = {1–12},
numpages = {12},
location = {Vancouver, BC, Canada},
series = {MMSys '23}
}

The ADΔER Framework: Tools for Event Video Representations

@inproceedings{Freeman23-0,
  title = {The ADΔER Framework: Tools for Event Video Representations},
  author = {Andrew C. Freeman},
  year = {2023},
  doi = {10.1145/3587819.3593028},
  url = {https://doi.org/10.1145/3587819.3593028},
  researchr = {https://researchr.org/publication/Freeman23-0},
  cites = {0},
  citedby = {0},
  pages = {343-347},
  booktitle = {Proceedings of the 14th Conference on ACM Multimedia Systems, MMSys 2023, Vancouver, BC, Canada, June 7-10, 2023},
  publisher = {ACM},
}

Motion segmentation and tracking for integrating event cameras

@inproceedings{10.1145/3458305.3463373,
author = {Freeman, Andrew C. and Burgess, Chris and Mayer-Patel, Ketan},
title = {Motion Segmentation and Tracking for Integrating Event Cameras},
year = {2021},
isbn = {9781450384346},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
url = {https://doi.org/10.1145/3458305.3463373},
doi = {10.1145/3458305.3463373},
abstract = {Integrating event cameras are asynchronous sensors wherein incident light values may be measured directly through continuous integration, with individual pixels' light sensitivity being adjustable in real time, allowing for extremely high frame rate and high dynamic range video capture. This paper builds on lessons learned with previous attempts to compress event data and presents a new scheme for event compression that has many analogues to traditional framed video compression techniques. We show how traditional video can be transcoded to an event-based representation, and describe the direct encoding of motion data in our event-based representation. Finally, we present experimental results proving how our simple scheme already approaches the state-of-the-art compression performance for slow-motion object tracking. This system introduces an application "in the loop" framework, where the application dynamically informs the camera how sensitive each pixel should be, based on the efficacy of the most recent data received.},
booktitle = {Proceedings of the 12th ACM Multimedia Systems Conference},
pages = {1–11},
numpages = {11},
keywords = {HDR, spike compression, image reconstruction, simulation, event cameras, object tracking, entropy encoding, motion segmentation, asynchronous systems},
location = {Istanbul, Turkey},
series = {MMSys '21}
}

Integrating Event Camera Sensor Emulator

@inproceedings{10.1145/3394171.3414394,
author = {Freeman, Andrew C. and Mayer-Patel, Ketan},
title = {Integrating Event Camera Sensor Emulator},
year = {2020},
isbn = {9781450379885},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
url = {https://doi.org/10.1145/3394171.3414394},
doi = {10.1145/3394171.3414394},
abstract = {Event cameras are biologically-inspired sensors that upend the framed, synchronous nature of traditional cameras. Singh et al. proposed a novel sensor design wherein incident light values may be measured directly through continuous integration, with individual pixels' light sensitivity being adjustable in real time, allowing for extremely high frame rate and high dynamic range video capture. Arguing the potential usefulness of this sensor, this paper introduces a system for simulating the sensor's event outputs and pixel firing rate control from 3D-rendered input images.},
booktitle = {Proceedings of the 28th ACM International Conference on Multimedia},
pages = {4503–4505},
numpages = {3},
keywords = {asynchronous systems, image reconstruction, spike compression, event cameras, HDR, simulation},
location = {Seattle, WA, USA},
series = {MM '20}
}

adder-codec-rs's People

Contributors

ac-freeman avatar eric-unc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

adder-codec-rs's Issues

Improve the application interface

Improve the application interface so that adding a new application can be done generically and programmatically for all structs implementing some "Application" trait. Applications should be the same code regardless of if they're run during transcode or during playback.

The set_input_stream_position method can put the stream at a misaligned position for reading events

The stream.set_input_stream_position() method takes any byte value that is within the ADΔER file. However, most of these byte values are not aligned with the individual events, so running stream.decode_event() will give invalid events that have obviously wrong values (like x and y values that are much larger than the dimensions of the video).

Steps for reproduction:

  1. Load an ADΔER file into the stream.
  2. Call set_input_stream_position and give it an arbitrary byte value.
  3. Read the first event using stream.decode_event(). Unless the byte value given previously happened to be valid, the property values for the event should be invalid.

Build issues with OpenSSL

I did like one sudo apt upgrade and things broke. Maybe need to redirect this to the rust-openssl crate? (from cargo build on the main directory)

The following warnings were emitted during compilation:

warning: [email protected]: In file included from /usr/include/openssl/opensslv.h:109,
warning: [email protected]:                  from build/expando.c:1:
warning: [email protected]: /usr/include/openssl/macros.h:14:10: fatal error: openssl/opensslconf.h: No such file or directory
warning: [email protected]:    14 | #include <openssl/opensslconf.h>
warning: [email protected]:       |          ^~~~~~~~~~~~~~~~~~~~~~~
warning: [email protected]: compilation terminated.

error: failed to run custom build command for `openssl-sys v0.9.93`

Caused by:
  process didn't exit successfully: `/home/eric/git/adder-codec-rs/target/debug/build/openssl-sys-560d4e621b011429/build-script-main` (exit status: 101)
  --- stdout
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
  OPENSSL_LIB_DIR unset
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
  OPENSSL_INCLUDE_DIR unset
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_DIR
  OPENSSL_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_NO_PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG
  cargo:rerun-if-env-changed=OPENSSL_STATIC
  cargo:rerun-if-env-changed=OPENSSL_DYNAMIC
  cargo:rerun-if-env-changed=PKG_CONFIG_ALL_STATIC
  cargo:rerun-if-env-changed=PKG_CONFIG_ALL_DYNAMIC
  cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG_PATH
  cargo:rerun-if-env-changed=PKG_CONFIG_PATH
  cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG_LIBDIR
  cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG_SYSROOT_DIR
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
  cargo:rerun-if-env-changed=SYSROOT
  cargo:rerun-if-env-changed=OPENSSL_STATIC
  cargo:rerun-if-env-changed=OPENSSL_DYNAMIC
  cargo:rerun-if-env-changed=PKG_CONFIG_ALL_STATIC
  cargo:rerun-if-env-changed=PKG_CONFIG_ALL_DYNAMIC
  cargo:rustc-link-lib=ssl
  cargo:rustc-link-lib=crypto
  cargo:rerun-if-env-changed=PKG_CONFIG_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG
  cargo:rerun-if-env-changed=OPENSSL_STATIC
  cargo:rerun-if-env-changed=OPENSSL_DYNAMIC
  cargo:rerun-if-env-changed=PKG_CONFIG_ALL_STATIC
  cargo:rerun-if-env-changed=PKG_CONFIG_ALL_DYNAMIC
  cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG_PATH
  cargo:rerun-if-env-changed=PKG_CONFIG_PATH
  cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG_LIBDIR
  cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64-unknown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_gnu
  cargo:rerun-if-env-changed=HOST_PKG_CONFIG_SYSROOT_DIR
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
  cargo:rerun-if-changed=build/expando.c
  OPT_LEVEL = Some("3")
  TARGET = Some("x86_64-unknown-linux-gnu")
  HOST = Some("x86_64-unknown-linux-gnu")
  cargo:rerun-if-env-changed=CC_x86_64-unknown-linux-gnu
  CC_x86_64-unknown-linux-gnu = None
  cargo:rerun-if-env-changed=CC_x86_64_unknown_linux_gnu
  CC_x86_64_unknown_linux_gnu = None
  cargo:rerun-if-env-changed=HOST_CC
  HOST_CC = None
  cargo:rerun-if-env-changed=CC
  CC = None
  cargo:rerun-if-env-changed=CFLAGS_x86_64-unknown-linux-gnu
  CFLAGS_x86_64-unknown-linux-gnu = None
  cargo:rerun-if-env-changed=CFLAGS_x86_64_unknown_linux_gnu
  CFLAGS_x86_64_unknown_linux_gnu = None
  cargo:rerun-if-env-changed=HOST_CFLAGS
  HOST_CFLAGS = None
  cargo:rerun-if-env-changed=CFLAGS
  CFLAGS = None
  cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some("true")
  CARGO_CFG_TARGET_FEATURE = Some("fxsr,sse,sse2")
  running: "cc" "-O3" "-ffunction-sections" "-fdata-sections" "-fPIC" "-gdwarf-4" "-fno-omit-frame-pointer" "-m64" "-I" "/usr/include" "-Wall" "-Wextra" "-E" "build/expando.c"
  cargo:warning=In file included from /usr/include/openssl/opensslv.h:109,
  cargo:warning=                 from build/expando.c:1:
  cargo:warning=/usr/include/openssl/macros.h:14:10: fatal error: openssl/opensslconf.h: No such file or directory
  cargo:warning=   14 | #include <openssl/opensslconf.h>
  cargo:warning=      |          ^~~~~~~~~~~~~~~~~~~~~~~
  cargo:warning=compilation terminated.
  exit status: 1

  --- stderr
  thread 'main' panicked at /home/eric/.cargo/registry/src/index.crates.io-6f17d22bba15001f/openssl-sys-0.9.93/build/main.rs:171:13:

  Header expansion error:
  Error { kind: ToolExecError, message: "Command \"cc\" \"-O3\" \"-ffunction-sections\" \"-fdata-sections\" \"-fPIC\" \"-gdwarf-4\" \"-fno-omit-frame-pointer\" \"-m64\" \"-I\" \"/usr/include\" \"-Wall\" \"-Wextra\" \"-E\" \"build/expando.c\" with args \"cc\" did not execute successfully (status code exit status: 1)." }

  Failed to find OpenSSL development headers.

  You can try fixing this setting the `OPENSSL_DIR` environment variable
  pointing to your OpenSSL installation or installing OpenSSL headers package
  specific to your distribution:

      # On Ubuntu
      sudo apt-get install libssl-dev
      # On Arch Linux
      sudo pacman -S openssl
      # On Fedora
      sudo dnf install openssl-devel
      # On Alpine Linux
      apk add openssl-dev

  See rust-openssl documentation for more information:

      https://docs.rs/openssl

  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...

Error handling

  • Get rid of all use of .unwrap() in non-test code
  • Improve error message and handling for when the input video path is not found

Generic DVS transcoder

Make the DVS transcoder interface to multiple source data files, without relying on davis-edi-rs.

  • Prophesee .dat & .ext3, inivation .aedat4, .txt, and others
  • Modular drivers for reading the data to a common DVS struct
  • Use one DVS transcoder
  • Remove need for OpenCV dependency in all cases except when event+frame fusion is necessary (with davis-EDI-rs)

Remove Bevy dependency

It would be good to remove the Bevy dependency for adder-viz. It's too bloated for our purposes, and the entity component system is overly cumbersome for a simple UI. using the eframe framework would grant simpler access to modifying image textures in place, making the UI faster. Compilation times would also decrease dramatically, especially for release builds.

adder-to-dvs remains relient on opencv

I forget to report this before the end of the semester. The whole crate should either be config-ed out or fixed.

   Compiling adder-to-dvs v0.2.3 (/home/eric/git/adder-codec-rs/adder-to-dvs)
error[E0432]: unresolved import `adder_codec_rs::transcoder::source::video::show_display_force`
    --> adder-to-dvs/src/main.rs:2:5
     |
2    | use adder_codec_rs::transcoder::source::video::show_display_force;
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `show_display_force` in `transcoder::source::video`
     |
note: found an item that was configured out
    --> /home/eric/git/adder-codec-rs/adder-codec-rs/src/transcoder/source/video.rs:1242:8
     |
1242 | pub fn show_display_force(window_name: &str, mat: &Mat, wait: i32) -> opencv::Result<()> {
     |        ^^^^^^^^^^^^^^^^^^
     = note: the item is gated behind the `open-cv` feature

error[E0432]: unresolved import `adder_codec_rs::utils::viz::write_frame_to_video`
  --> adder-to-dvs/src/main.rs:3:55
   |
3  | use adder_codec_rs::utils::viz::{encode_video_ffmpeg, write_frame_to_video};
   |                                                       ^^^^^^^^^^^^^^^^^^^^ no `write_frame_to_video` in `utils::viz`
   |
note: found an item that was configured out
  --> /home/eric/git/adder-codec-rs/adder-codec-rs/src/utils/viz.rs:24:8
   |
24 | pub fn write_frame_to_video(
   |        ^^^^^^^^^^^^^^^^^^^^
   = note: the item is gated behind the `open-cv` feature

For more information about this error, try `rustc --explain E0432`.
error: could not compile `adder-to-dvs` (bin "adder-to-dvs") due to 2 previous errors

adder_viz installation issues

I am geeting the following error while trying to install adder-viz in my macOS.

=== Detected OpenCV module header dir at: /usr/local/opt/opencv/include/opencv4/opencv2
=== Found OpenCV version: 4.8.1 in headers located at: /usr/local/opt/opencv/include/opencv4
=== Generating code in: /var/folders/tw/n21pcsbx47n6991w75ctly340000gp/T/cargo-install2rNRjr/release/build/opencv-1248bca4b42eb4aa/out
=== Placing generated bindings into: /var/folders/tw/n21pcsbx47n6991w75ctly340000gp/T/cargo-install2rNRjr/release/build/opencv-1248bca4b42eb4aa/out/opencv
=== Using OpenCV headers from: /usr/local/opt/opencv/include/opencv4
thread 'main' panicked at /Users/arghasen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/clang-sys-1.6.1/src/lib.rs:1735:1:
a libclang shared library is not loaded on this thread
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
error: failed to compile adder-viz v0.2.4, intermediate artifacts can be found at /var/folders/tw/n21pcsbx47n6991w75ctly340000gp/T/cargo-install2rNRjr.
To reuse those artifacts with a future compilation, set the environment variable CARGO_TARGET_DIR to that path.

Can you help me on how to debug this?

adder-viz: player crash when changing transcode resolution

To reproduce:

  • start a transcode to a saved file
  • start a playback of that file in the play tab
  • go back to transcode tab, with the writer still open
  • change the video being transcoded to one with a different resolution
  • go back to play tab

Will crash, because the player didn't reset when the transcoder did.

Project roadmap

  • Implement mixed-time representation
  • Implement ADΔER re-coding ("transcode" an ADΔER stream again with different choices of D)
  • Develop lossless compression techniques. Encode with arithmetic-coding
  • Develop lossy compression techniques
  • Be able to go from raw ADΔER -> lossy compressed ADΔER -> decoded stream -> display in video player
  • Enable streaming with Real-time Transport Protocol
  • Create a vision-type application which operates on ADΔER directly
  • Support AbsoluteT mode in video player binary
  • Link application with live compression for application-directed loss
  • Link application with live transcode (from framed and/or DAVIS source) for application-directed loss

adder-info for compressed files

This won't be very much work, but need to add a compression feature for adder-info, so that accurate event counts and dynamic range can be calculated for compressed ADDER files.

Non-max suppression for feature detection

Add support for non-maximum suppression of detected FAST features. Would need a feature "scoring" mechanism, such as the number of consecutive pixels in the threshold arc.

Player looping

Adder-viz player looping doesn't work correctly for compressed adder files.

Remove adder-info debug output

See the following output:

Dimensions
	Width: 640
	Height: 360
	Color channels: 1
Source camera: FramedU8
ADΔER transcoder parameters
	Codec version: 2
	Time mode: AbsoluteT
	Ticks per second: 7650
	Reference ticks per source interval: 255
	Δt_max: 30600
File metadata
	File size: 83831246
	Header size: 33
	ADΔER event count: 9084179
	Events per pixel channel: 39
Calculating dynamic range...15%20336 0
25370 20336
27928 25370
28227 27928
28531 28227
28764 28531
Calculating dynamic range...16%28955 28764
Calculating dynamic range...20%31494 28955
32795 31494
33183 32795
33689 33183
Calculating dynamic range...21%34233 33689
Calculating dynamic range...23%35555 34233
35981 35555
36433 35981
Calculating dynamic range...29%40902 36433
42143 40902
42602 42143
42985 42602
43546 42985
Calculating dynamic range...30%43799 43546
44064 43799
Calculating dynamic range...32%44960 44064
45305 44960
Calculating dynamic range...33%45900 45305
46155 45900
46369 46155
Calculating dynamic range...34%46864 46369
47129 46864
47374 47129
Calculating dynamic range...43%51695 47374
52313 51695
52666 52313
52984 52666
53171 52984
Calculating dynamic range...44%53546 53171
53831 53546
Calculating dynamic range...47%55454 53831
Calculating dynamic range...49%55969 55454
Calculating dynamic range...54%56657 55969
Calculating dynamic range...55%57064 56657
Calculating dynamic range...73%66280 57064
68740 66280
69155 68740
Calculating dynamic range...77%69686 69155
Calculating dynamic range...79%70125 69686
71145 70125
71301 71145
Calculating dynamic range...81%72225 71301
72796 72225
Calculating dynamic range...83%73533 72796
73831 73533
Calculating dynamic range...86%74954 73831
75472 74954
Calculating dynamic range...88%75697 75472
Calculating dynamic range...90%75884 75697
Calculating dynamic range...96%78105 75884
79390 78105
80125 79390
Dynamic range                       
	Theoretical range:
		427.1653 dB (power)
		141.9012 bits
	Realized range:
		30.2141 dB (power)
		10.0369 bits

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.