Android上的声波通信

Hen*_*ang 2 audio android

我想通过Android手机上的声波传输数据,我发现这个例子:https: //github.com/JesseGu/SinVoice

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

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

Voi*_*tar 11

用于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;
}
Run Code Online (Sandbox Code Playgroud)

第二种方式

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;
}
Run Code Online (Sandbox Code Playgroud)

对于第一种方式,当你有大的t值时,sin内的值将失去精度.从本质上讲,你演奏音符的时间越长,听起来就越糟糕.不久之后,它开始听起来非常不纯净.

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