Giter Club home page Giter Club logo

vlc-work's Introduction

VLC-work

可见光通信 + 声波通信
网络系统课程实验 大四课程

文件结构

sound/下是声音相关的源码,包括录音,转WAV等功能的android程序(PCMSample)和matlab对声音的加解码程序。
VLC_rece/和VLC_trans/下分别是VLC实验的接受和发送端,因为我android编程是现学现卖的,代码可能有点丑陋,而且程序可能会有一些问题。我实验用了android7和android4,所以在大部分手机上应该能够跑起来。

VLC通信实验

1. 实验概述
实验设备:小米5、HTC。小米5手机作为发射端,展示图片的同时,将信息编码进入图片。HTC作为接收端,解出图片中的信息。
开发IDE:android studio
2. 系统设计
参考文献: (Mobisys15)Real-Time Screen-Camera Communication Behind Any Scene
将二进制串信息编码进入图片,利用图片明暗分别编码0,1。在图片的上层增加一个信息传输层,初始状态为全透明黑色,因此不影响图片的显示。接下来,改变信息传输层的透明度的值,从而影响图片的亮度显示,如下:

我们简化的做法是不划分网格,而是将整个图片进行渲染,利用时间上的黑亮编码1、0值,可类比闪光灯。
对于编码,我们自定义编码1 – 01, 0 – 001。这样做一是通过冗余码在一定程度上进行纠错,另一个用处是判断传输完成,连续的0或1的出现即为结束。
同时,我们在每次传输的串前加入11序列标识传输的开始。发送端会等待2秒才开始传输,在这两秒内接收端接受到的为亮图片,即一系列的0串。
3. 系统实现
发送端:增加一个communication layer,从而可以通过改变其透明度从而影响显示亮度。将layer划分为6格(也就是将手机屏幕分为6格),第一格和最后一格,透明度改变20%,中间四格改变10%。这样透明度为0时,图片亮,代表0 ,透明度为20%(2),10%(4)时,图片黑,代表1。
接收端:我们使用RGB总和作为评判亮黑的值,同时维护两帧的窗口以及记录上次的解码值(0或者1),当计算得到两帧差值大于一个阈值且第一帧大,解出1,否则解出0,若两帧相差不多,则以记录的上一个解码值为结果。滑动一格,继续解码,直到出现连续的0或1值结束。
注意:我们给出的实时解码结果不是原始串,而是原始串经过加码后的串。比如原始串为“110”,我们解出结果如00{110101001}111111。{}内为加码后的串。前面为捕获2秒亮帧带来的连续0串(500ms采样最多4个),后面为结束串(理应为连续的1串,但是如果手抖了一下,可能出现连续的0串)。
4.系统评估
对图片的显示影响:我们尽量将编码对图片的影响减到最小,当然不同人有不同的判断
实验响应:我们做的是实时解码显示,故而必须在接收端处理一帧完成后才能采集下一帧。实验发现,最快能够到达200ms完成每帧处理完全。我们展示和实验均采用500ms采集一帧,同时发送端也是500ms更新每帧。
一些简单的实验结论:同光照下,传输正确率随着距离增大而减小,同距离下,传输正确率随光照效果变差而减小。这些都符合我们的预期和常识。一般来说,距离越大,拍到的屏幕占比越小,噪声增加,所以传输正确率就会减小。同时可以看出光照对相机拍的图像影响很大。
我们实现的系统受距离和光的因素影响都很大,我觉得是因为要做到图片影响小,那么图片明暗两帧差距自然就比较小,并且我们没有做screen detect,所以就会比较易受到影响。所以对准与否和手抖均会对解码造成影响。但是一般10cm左右准确率还是挺高的。

声波通信实验

1. 实验概述
实验设备:利用HTC手机播放加码后的音频,小米录音(并转wav),得到传输后的加码音频。
加解码:线下matlab进行。
2. 系统设计和实现
采用Impulse coding方法(详情自己搜索资料),编码如下:
00 – 400 01 – 800 10 – 1200 11 – 1600
至于解码部分,中心**就是滤波去噪后FFT变化,再找波的中心,最后求出距离,根据编码规则解码。
传输过程,就是将编码的音频通过电脑传到HTC手机端,然后利用自带的音频软件进行播放,同时小米手机打开app进行录音及转为wav,最后传到电脑上用matlab进行解码。
3. 系统评估
我尝试过传过不同长度的字符串,从小串’Tsinghua’到最大173字节的文本,这之中有两个问题。第一个问题在于随着文本增加,音频大小增加很快,这个可以通过减少间隔进行优化。第二个问题在于解码部分,整个加码,传输,解码流程,对于小文本,最容易错的在于解码,而解码的难处在于找到正确的峰值位置。不同的文本大小导致不同的音频大小,不同的音频以及不同次的传输会导致每次峰值查找并不是都顺利。
经过我的调试,可以成功传输一些小的文本,比如’Tsinghua’串,比如173字节的文本,但是他们并不是同一参数成功的。这一过程我也发现,文件越大越容易出问题,而且一旦出问题,之后的所有数据均会出错。

结语

这仅仅是一次实验,代码缺陷以及实现过程肯定有许多缺陷。但是在整个过程中,感觉自己学习到的东西还是很多的。

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.