

Github GitHub - ggerganov/ggwave: Tiny data-over-sound library
source link: https://github.com/ggerganov/ggwave
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

ggwave
Tiny data-over-sound library.
Click on the images below to hear what it sounds like:
Details
This library allows you to communicate small amounts of data between air-gapped devices using sound. It implements a simple FSK-based transmission protocol that can be easily integrated in various projects. The bandwidth rate is between 8-16 bytes/sec depending on the protocol parameters. Error correction codes (ECC) are used to improve demodulation robustness.
This library is used only to generate and analyze the RAW waveforms that are played and captured from your audio devices (speakers, microphones, etc.). You are free to use any audio backend (e.g. PulseAudio, ALSA, etc.) as long as you provide callbacks for queuing and dequeuing audio samples.
Possible applications:
- Serverless, one-to-many broadcast
- Device pairing
- Authorization
- Internet of Things
- Audio QR codes
Try it out
You can easily test the library using the free waver application which is available on the following platforms:
Browser demos
HTTP service
# audible example curl -sS 'https://ggwave-to-file.ggerganov.com/?m=Hello world!' --output hello.wav # ultrasound example curl -sS 'https://ggwave-to-file.ggerganov.com/?m=Hello world!&p=4' --output hello.wav
Technical details
Below is a short summary of the modulation and demodulation algorithm used in ggwave
for encoding and decoding data into sound.
Modulation (Tx)
The current approach uses a multi-frequency Frequency-Shift Keying (FSK) modulation scheme. The data to be transmitted is first split into 4-bit chunks. At each moment of time, 3 bytes are transmitted using 6 tones - one tone for each 4-bit chunk. The 6 tones are emitted in a 4.5kHz range divided in 96 equally-spaced frequencies:
Freq, [Hz] Value, [bits] Freq, [Hz] Value, [bits] ... Freq, [Hz] Value, [bits]F0 + 00*dF
Chunk 0: 0000
F0 + 16*dF
Chunk 1: 0000
...
F0 + 80*dF
Chunk 5: 0000
F0 + 01*dF
Chunk 0: 0001
F0 + 17*dF
Chunk 1: 0001
...
F0 + 81*dF
Chunk 5: 0001
F0 + 02*dF
Chunk 0: 0010
F0 + 18*dF
Chunk 1: 0010
...
F0 + 82*dF
Chunk 5: 0010
...
...
...
...
...
...
...
F0 + 14*dF
Chunk 0: 1110
F0 + 30*dF
Chunk 1: 1110
...
F0 + 94*dF
Chunk 5: 1110
F0 + 15*dF
Chunk 0: 1111
F0 + 31*dF
Chunk 1: 1111
...
F0 + 95*dF
Chunk 5: 1111
For all protocols: dF = 46.875 Hz
. For non-ultrasonic protocols: F0 = 1875.000 Hz
. For ultrasonic protocols: F0 = 15000.000 Hz
.
The original data is encoded using Reed-Solomon error codes. The number of ECC bytes is determined based on the length of the original data. The encoded data is the one being transmitted.
Demodulation (Rx)
Beginning and ending of the transmission are marked with special sound markers (#13). The receiver listens for these markers and records the in-between sound data. The recorded data is then Fourier transformed to obtain a frequency spectrum. The detected frequencies are decoded back to binary data in the same way they were encoded.
Reed-Solomon decoding is finally performed to obtain the original data.
Examples
The examples folder contains several sample applications of the library:
Example Description Audio ggwave-rx Very basic receive-only program SDL ggwave-cli Command line tool for sending/receiving data through sound SDL ggwave-wasm WebAssembly module for web applications SDL ggwave-to-file Output a generated waveform to an uncompressed WAV file - waver GUI application for sending/receiving data through sound SDL ggwave-py Python examples PortAudio ggwave-js Javascript example Web Audio API spectrogram Spectrogram tool SDLOther projects using ggwave or one of its prototypes:
- wave-gui - a GUI for exploring different modulation protocols
- wave-share - WebRTC file sharing with sound signaling
Building
Dependencies for SDL-based examples
[Ubuntu]
$ sudo apt install libsdl2-dev
[Mac OS with brew]
$ brew install sdl2
[MSYS2]
$ pacman -S git cmake make mingw-w64-x86_64-dlfcn mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2
Linux, Mac, Windows (MSYS2)
# build git clone https://github.com/ggerganov/ggwave --recursive cd ggwave && mkdir build && cd build cmake .. make # running ./bin/ggwave-cli
Emscripten
git clone https://github.com/ggerganov/ggwave --recursive cd ggwave mkdir build && cd build emcmake cmake .. make
Python
pip install ggwave
More info: https://pypi.org/project/ggwave/
Node.js
npm install ggwave
More info: https://www.npmjs.com/package/ggwave
Available as a Swift Package: https://github.com/ggerganov/ggwave-spm
Installing the Waver application
Linux
sudo snap install waver sudo snap connect waver:audio-record :audio-record
Mac OS
brew install ggerganov/ggerganov/waver
Recommend
-
54
README.md kbd-audio Description This is a collection of command-line and GUI tools for capturing and analyzing audio data. The most interestin...
-
28
Serializer++ Small, light and easy to understand data serialization library for C++. This is an extract from the live source of Bvckup 2 . It's not meant to be an unive...
-
37
README.md imtui ImTui is an immediate mode text-based user interface library. Supports 256 ANSI colors and mouse/keyboard input.
-
16
README.md Tra...
-
10
eemit eemit is a Java event emitter library Install Maven: <dependency> <groupId>com.github.jafarlihi</groupId> <artifactId>eemit</artifactId> <version>0.1.0&l...
-
7
-
13
Conversation Collaborator This...
-
10
MicroMarkup A simple library for easily defining HTML in Javascript. At version 0.0.1, it is only ~3.1 KB (minified & gziped). The basics MicroMarkup exports several functions. Here's them all microMarku...
-
11
Sponsor Collaborator
-
4
Summary 🟥 - benchmark data missing 🟨 - benchmark data partial ✅ - benchmark data available PP means "prompt processing" (bs = 512), TG means "t...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK