ggwave:基于FSK调制的声音数据传输库项目

Tiny data-over-sound library

Branch4Tags18
FilesLast commitLast update
1 year ago
4 months ago
5 years ago
1 year ago
2 years ago
5 years ago
4 years ago
2 years ago
3 years ago
5 years ago
4 years ago
5 years ago
4 years ago
4 months ago
5 years ago
5 months ago
5 months ago

ggwave

Actions Status License: MIT ggwave badge pypi npm

小巧的数据声波传输库。

点击下方图片聆听实际音效:

https://user-images.githubusercontent.com/1991296/166411509-5e1b9bcb-3655-40b1-9dc3-9bec72889dcf.mp4

https://user-images.githubusercontent.com/1991296/168469004-aeb9b9fe-cf81-4db7-b602-62e4ae659341.mp4

详细说明

本库可让空气隔离的设备间通过声音传输少量数据。它实现了一种基于FSK的简单传输协议,便于集成到各类项目中。根据协议参数不同,带宽速率在8-16字节/秒之间。通过使用纠错码(ECC)提升了解调的稳健性。

本库仅用于生成和分析从音频设备(扬声器、麦克风等)播放和捕获的原始波形。您可自由选用任何音频后端(如PulseAudio、ALSA等),只需提供用于排队和出队音频样本的回调函数。

以下是ggwave的部分可能应用场景及示例:

体验一下

您可以通过免费的 waver 应用轻松测试该库,该应用支持以下平台:

Download on the App Store Get it on Google Play Get it from the Snap Store

浏览器演示

HTTP 服务

  # audible example
  curl -sS 'https://ggwave-to-file.ggerganov.com/?m=Hello%20world!' --output hello.wav

  # ultrasound example
  curl -sS 'https://ggwave-to-file.ggerganov.com/?m=Hello%20world!&p=4' --output hello.wav

技术细节

以下是 ggwave 用于将数据编码和解码为声音所采用的调制与解调算法的简要概述。

调制(发送端)

当前方法采用多频频移键控(FSK)调制方案。待传输的数据首先被分割为 4 位的块。在每个时间点,通过 6 个音调传输 3 字节的数据——每个 4 位块对应一个音调。这 6 个音调在 4.5kHz 的频率范围内发出,该范围被划分为 96 个等间隔的频率:

频率 [Hz] 值 [比特] 频率 [Hz] 值 [比特] ... 频率 [Hz] 值 [比特]
F0 + 00*dF 块 0: 0000 F0 + 16*dF 块 1: 0000 ... F0 + 80*dF 块 5: 0000
F0 + 01*dF 块 0: 0001 F0 + 17*dF 块 1: 0001 ... F0 + 81*dF 块 5: 0001
F0 + 02*dF 块 0: 0010 F0 + 18*dF 块 1: 0010 ... F0 + 82*dF 块 5: 0010
... ... ... ... ... ... ...
F0 + 14*dF 块 0: 1110 F0 + 30*dF 块 1: 1110 ... F0 + 94*dF 块 5: 1110
F0 + 15*dF 块 0: 1111 F0 + 31*dF 块 1: 1111 ... F0 + 95*dF 块 5: 1111

对于所有协议:dF = 46.875 Hz。对于非超声波协议:F0 = 1875.000 Hz。对于超声波协议:F0 = 15000.000 Hz

原始数据使用里德-所罗门纠错码进行编码。纠错码字节数根据原始数据的长度确定。经过编码后的数据才会被传输。

解调(接收端)

传输的开始和结束由特殊的声音标记标记(#13)。接收器监听这些标记,并记录标记之间的声音数据。然后对记录的数据进行傅里叶变换以获得频谱。检测到的频率按照与编码相同的方式被解码回二进制数据。

最后执行里德-所罗门解码以获取原始数据。

示例

examples 文件夹包含了该库的多个示例应用:

示例 描述 音频
ggtag 声音可编程电子纸徽章 PDM 麦克风
ggwave-rx 非常基础的仅接收程序 SDL
ggwave-cli 通过声音发送/接收数据的命令行工具 SDL
ggwave-wasm 用于 Web 应用的 WebAssembly 模块 SDL
ggwave-to-file 将生成的波形输出到未压缩的 WAV 文件 -
ggwave-from-file 从未压缩的 WAV 文件中解码波形 -
waver 通过声音发送/接收数据的 GUI 应用 SDL
ggwave-py Python 示例 PortAudio
ggwave-js JavaScript 示例 Web Audio API
spectrogram 频谱图工具 SDL
ggweb-spike 使用 WebViewggwave 包装成简单应用的 Android 示例 WebAudio
buttons 通过语音按钮录制和发送命令 Web Audio API
r2t2 通过 PC 扬声器传输数据 PC 扬声器
ggwave-objc 使用 ggwave 的极简 Objective-C iOS 应用 AudioToolbox
ggwave-java 使用 ggwave 的极简 Java Android 应用 android.media
ggwave-kmm 使用 ggwave 的 Kotlin 多平台项目 android.media, javax.sound.sampled
ggwave-fm 使用 HackRF 传输 ggwave 消息 无线电
esp32-rx 使用 ESP32 发送和接收消息 -
rp2040-rx 使用树莓派 Pico (RP2040) 发送和接收消息 -
arduino-rx 使用 Arduino RP2040 发送和接收消息 -
arduino-tx 使用 Arduino Uno 发送消息 -
arduino-rx-web 接收来自 Arduino Uno 的消息 Web Audio API

其他使用 ggwave 或其原型之一的项目:

  • wave-gui - 用于探索不同调制协议的 GUI
  • wave-share - 带有声音信令的 WebRTC 文件共享

构建

基于SDL的示例的依赖项

[Ubuntu] $ sudo apt install libsdl2-dev

[使用brew的Mac OS]
$ 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

本地 Debian 软件包

构建可复现的 libggwave-devpython3-ggwave Debian 软件包:

# Fetch source
git clone https://github.com/ggerganov/ggwave --recursive
cd ggwave

# Configure
cmake . -DGGWAVE_BUILD_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Release

# Build
make deb

# Install
sudo dpkg -i dist/*.deb

Emscripten

git clone https://github.com/ggerganov/ggwave --recursive
cd ggwave
mkdir build && cd build
emcmake cmake ..
make

Python

pip install ggwave

更多信息:https://pypi.org/project/ggwave/

Node.js

npm install ggwave

更多信息:https://www.npmjs.com/package/ggwave

iOS

可作为 Swift 包使用:https://github.com/ggerganov/ggwave-spm

安装 Waver 应用

从 Snap Store 获取

Linux

sudo snap install waver
sudo snap connect waver:audio-record :audio-record

Mac OS

  brew install ggerganov/ggerganov/waver

参考文献