我想通过Android手机上的声波传输数据,我发现这个例子: https://github.com/JesseGu/SinVoice
这个项目工作正常, 当它传输数据时,我可以听到声音并传输数据成功。
问题是如何修改代码以传输数据,但我听不到声音?
如果使用高频声音,请告诉我们如何修改它,谢谢。
答案 0 :(得分: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;
}
第二种方式
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的范围内。
答案 1 :(得分:0)
这是一个Android implementation of Chirp,它将数据映射到声音频率。此外,为了减轻数据丢失,发送的数据帧由纠错符号支持。