Chirp:用声音“传送”文件

来源:互联网 发布:阳明山周杰伦知乎 编辑:程序博客网 时间:2024/06/02 23:53

1 介绍

        一般我们在两台设备之间传送文件的方式有:1)通过网络直接传送,如通过QQ传送,这时需要对文件先进行编码,让后再发送,传送时间取决去你的网络信号强度和文件大小,比如wifi,2G,3G等,当文件较大时一般较慢;2)通过网络间接传送:如邮件和云盘,即一台设备先传送到云端,另一台设备到指定的云端下载,这种方式操作比较多;3)蓝牙:需要配对,且只能点到点传送;4)NFC近场通讯。

        Chirp是一款由美国创业公司Animal Systems发布的新奇的通过声音"传送"文件的应用。新奇支出在于:1)它是通过声音作为媒介传送的。我们大部分的手机都有扬声器(扬声器、喇叭、功放三者还是有差别的)和麦克风(麦克风和拾音器也是有差别的),所以这种传送方式无需额外的硬件模块支持,比如蓝牙模块;2)由于声音是全向传播的,所以一个设备播放声音,许多设备都能同时收到,因而无需配对;当然由于声音衰减,距离不能太远,噪声是另一指标;3)它本质上并不是直接传送文件,而是传送文件专属地址,同时将文件传到服务器,接受端收到声音后解码专属地址到服务器下载指定文件。

        当然Chirp目前支持传送图片,文字,URL网址,联系人等,这是因为它产生的声音约2秒,要达到妙传的效果,传送文件必定不能太大。整个传递过程其实分为3个步骤:1)发送端为文件产生一个专属地址并将文件传送到服务器;2)将专属地址编码成声音并播放;3)接收端录制到声音解码并从服务器下载指定专属地址的文件。由于文件较小,因而感觉像是秒传。很明显,第二个步骤可以离线完成,第一和第三步骤需要联网。

         

        Chirp 的使用场景:比如开会时,主持人只需用 Chirp 放一段音乐,参会的每个人就可以拿到会议所需的材料;或者你经过一家面包店被香味勾住了脚步,打开手机,店里的背景音乐就已经将最新的优惠券发过来了。所以主要是多人分享病毒式营销广告

2 编码

        Chirp能编码0-9,、a-v共32个字符,每个字符用一种频率的音高来表示,所以共有32个频率,0对应1760Hz,1对应1864Hz,...,v对应10.5kHz,相邻频率相差半音程,参考音乐音高对照表,0-v对应的就是A6调~E9调(http://people.virginia.edu/~pdr4h/pitch-freq.html)。

        Chirp产生的音频包含20个字符,每个字符用对应频率的正弦波产生,每个正弦波持续87.2ms,如果采样率位44.1kHz,那么每个字符大概3846个采样点,整个音频约20*87.2ms=1.744s,由于每个字符用不同频率表示,所以听起来像音乐似的。

        20个字符中,前两个固定为字符“hj”,表示编码开始,中间10位是要传输的字符串,最后8位是误差校正字符。要传输的字符串每个字符用5位表示,所以chirp的地址空间是5*10=50位。Chirp的产生很简单,只是在正确的时候产生字符对应频率的声音,但为了使声音听起来更像鸟叫,Chirp音频里填充了一些其他的东西,具体是什么,不知道。

3 解码

        首先,解码要能正确追踪到相应的频率;其次,追踪到频率后能根据规则翻译成相应的字符;最后,要有一定的错误校验能力,就是保证追踪到的频率是正确的。因为用于Android,还要考虑到Android的DSP能力。这里面错误校验,也就是抗噪是最难得,其次是频率追踪。

4 抗噪

       8位误差校正意味着Chirp能在噪声下传输,能校正超过25%的丢失或错误。Chirp用的是Reed-Solomon算法,跟CD、DVD、条形码、人造卫星和航天探测器中使用的错误校验方法一样。具体的算法较复杂,有时间仔细研究过再说。

5 Chirp音频

       我在一篇外国博客上下载了一个音频,听起来比国内的蛐蛐儿产生的音频是要平滑一些。其频谱图和波形图如下:

                          

        由上图可以清楚看出有20个频率端,跟上面分析的一致。然后分析它的频率,其傅里叶变换如下图:

                

        由上图可以看出这段音频共包含16种频率,但是它有20个字符,怎么只有16种频率呢?原因就是这20个字符中是可以重复的,注意到上图纵轴代表对应频率的能量,每个字符产生的能量是一样的,但第一个频率处的能量是第二个频率处的3倍,说明20个字符中包含3个第一个频率对一个的字符,我看了下,第一个频率就是1760Hz,也就是说包含3个0,同理,20个字符中分别包含2个第8个频率对应的字符和2个第15个频率对应的字符。根据频谱图大概就能看出这个音频的id。

        以上便是对Chirp的简单分析,目前试了编码和简单解码,产生的音频跟Chirp很相似,而且在噪声不大的情况下也能正常解码。目前暂时使用matlab写的,正在转成java用在Android上。待解决的两个问题时实时解码和抗噪声。

1 0