Android上的声波通信

Posted

技术标签:

【中文标题】Android上的声波通信【英文标题】:Sound wave communication on Android 【发布时间】:2014-01-09 05:57:14 【问题描述】:

我想在安卓手机上通过声波传输数据,我找到了这个例子: https://github.com/JesseGu/SinVoice

这个项目工作正常, 当它传输数据时,我可以听到声音并传输数据成功。

问题是如何修改代码以传输数据但我听不到声音? 如果用的是高频声音,请告诉如何修改,谢谢。

【问题讨论】:

这个问题很难以目前的形式回答,因为您没有提供任何修改后的代码。您似乎还要求其他用户为您编写代码,这不是 SO 的用途。 github.com/Katee/quietnet auselen,谢谢,我正在尝试解析到android,希望可以工作~ @HenryChuang 解析成功了吗? 发送正常,但接收失败 【参考方案1】:

用于 iPhone 的 Chirp 是解决难题的一种廉价方法。他们实际上上传要在线发送的数据,“啁啾”似乎只是一个独特的笔记序列,它索引在线数据库上上传的数据。话虽如此,我对真正的音频数据传输感兴趣已经有一段时间了。如果你打算做这个项目,你需要自己担心代码,我可以向你展示的是一堆你可能想要整合到你的设计中的技术。我的建议是从头开始,但如果你真的想的话,你可以尝试构建这个 Github 代码。

要检测和过滤声音,请使用 Goertzel 算法。对于输入声音,Goertzel 算法过滤输入声音样本流并生成输出值的复值流 (a+bi)。值的大小( sqrt((a^2)+(b^2)) )给出了给定时间点特定频率的强度。这些值的角度 ( atan2(b,a) ) 给出了该频率在给定时间点的相位。您可以选择要过滤的频率,尤其是使用 Goertzel 算法的多个实例来检测多个频率。

http://www.mstarlabs.com/dsp/goertzel/goertzel.html

您可以使用一种音调(打开或关闭)简单地播放模式,使用 Goertzel 算法过滤通过麦克风传入的声音,并使用它来检测播放的模式,从而恢复您发送的信息位。这种技术是一种简单的幅度调制形式,并且非常容易受到背景噪声的影响。您的数据传输速度会很慢。

https://www.princeton.edu/~achaney/tmve/wiki100k/docs/Amplitude_modulation.html

您可以过滤多个不同的音符,并让您的程序监听音符序列。这很可能是 Chirp 在内部的工作方式,并且非常可靠。您的数据传输率可能会有所提高。

您还可以使用频率调制或相位调制。使用 Goertzel 算法意味着相位调制比频率调制更容易一些。我没有对这种方法进行过广泛的测试,但它似乎非常可靠,并且比特率可能高于幅度调制。我曾经写过一个使用相位调制发送图片的程序。数据没有数字化,我只是按相位确定像素强度并扫描图像中的所有像素。即使播放响亮的音乐,画面也相当清晰。请注意,图像相当小,发送仍然需要几分钟,所有音频通信的比特率都将非常低。

http://www.circuitstoday.com/modulation

一个简短的建议。考虑这两种计算正弦波的方法来播放

double output[length];
double t=0;
double samplerate=44100.0;
double frequency=440.0;
double w=2*pi*frequency;
double time_increment=1.0/samplerate;
for(n=0;n<length;n++) 
    output[n]=sin(w*t);
    t+=time_increment;

第二种方式

double output[length];
double samplerate=44100.0;
double frequency=440.0;
double phase=0;
double phase_increment=2*pi*frequency/samplerate;
double tau=2*pi;
for(n=0;n<length;n++) 
    output[n]=sin(phase);
    phase=(phase+phase_increment)%tau;

对于第一种方式,当你有很大的 t 值时,sin 内的值会失去精度。本质上,你弹奏音符的时间越长,它听起来就越糟糕。没过多久,它开始听起来很不纯洁。

第二种方法通过将相位随时间积分并将其修改 (%) 2*pi (tau) 来避免此问题,将值保持在 0 到 2pi 的范围内。

【讨论】:

不客气!请记住坚持下去,我的前几个声音处理项目完全失败了! @BigEndian,很好的答案。可以分享示例项目吗? @BigEndian,很抱歉挖掘了旧的 cmets,但是您对对齐/开始音、使用均衡器(以减少干扰)或定时恢复(以确保对齐采样)有任何想法与波形)。我会对你发现的任何数据传输成功的事情感兴趣! 在这个答案和现在我已经参加了几个信号处理课程,毕业于 EE,并开始为一家制造捕获和分析无线电信号的仪器的公司工作......我学到了很多。使用此处描述的原始方法,带宽将非常小,因此 EQ 不会做太多事情。可以通过等待某个幅度的起始脉冲或通过找到位转换之间的边沿并与之对齐来恢复时序。 SO 是一个糟糕的分享对话的论坛,但我还有很多东西要分享。谷歌 QAM 和发送电子邮件至 micro.farad@protonmail.ch。【参考方案2】:

这是一个Android implementation of Chirp,它将数据映射到声音的频率。此外,为了减少数据丢失,传输的数据帧由纠错符号支持。

【讨论】:

以上是关于Android上的声波通信的主要内容,如果未能解决你的问题,请参考以下文章

我如何在android中使用超声波通过语音传输数据?

同一路由器上的Android wifi设备通信

android上的socket通信的开源框架都有哪些

声波传输声波通信原理和源码商用版本号

Android - 两台设备之间的通信

android 串口通信丢失数据原因