dukmu / soundlink

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

+------------------------+
 soundlink 声波通信代码库 
+------------------------+

原理概述
--------

soundlink 是一个 C 语言实现的声波通信代码库,可以通过声波发送和接收数据。

将 8000KHz 采样率的音频作为载波,200 个采样点为一个声音片段,或者说一秒
钟的音频被分为了 40 等分,每份 200 个采样点,时长 25us.

对每一个声音片段进行频率调制编码,每个声音片段承载 4bit 的数据。接收端采
用了 128 点长度的 FFT 变换,在 64 个可分辨的频点中找到 16 个作为 4bit 数
据的编码频点,另外再找一个频点作为开始码的编码频点。因此总共需要 17 个可
编码的频点。


发送数据帧的定义为:
1 字节开始码 + 1 字节长度信息 + 最多 255 个字节的数据 + 2 字节的校验和


发送端的工作极为简单,只需要根据实际的字节数据,生成不同频率的音频片段即可。
接收端需要接收音频数据,分片段进行 FFT 变换,并分析每个音频片段的频率,分析
出开始码,然后解析出实际的数据帧,并检查校验和,如果一切正常,则认为接收到
正确的数据。


当前的设计,每秒可以发送 40 个声音片,每片承载 4bit 数据,也就是说理论的传
输速率为 20B/s. 实测在安静环境,或者 mic 靠近喇叭进行接收,成功率还算理想。
实际应用时可根据需求,修改采样率、音频片段长度、编码频点、增加纠错码等来优
化效果,增强抗干扰能力。



使用方法
--------

目前在 windows + msys2 编译通过,发送端支持生成的音频保存到文件或者播放到喇叭。
接收端支持从音频文件解析出数据帧,或者从 mic 录音实时接收数据帧。

发送:soundlink hello wavdev
将会发送 hello 到喇叭,wavdev 代表音频设备即喇叭和 MIC

发送:soundlink hello hello.wav
将会把音频保存到 hello.wav

接收:
运行 soundlink 后,敲入命令
recv_start wavdev
将会从 mic 实时接收数据帧

敲入命令
recv_start hello.wav
将会从 hello.wav 文件解析出数据帧



rockcarry
2021-6-4




About

License:GNU Lesser General Public License v3.0


Languages

Language:C 99.3%Language:Shell 0.7%