我想在安卓手机上通过声波传输数据,我找到了这个例子:https://github.com/JesseGu/SinVoice
这个项目工作得很好,当它传输数据时,我可以听到声音并成功传输数据。
问题是如何修改它的代码传输数据,但我听不到声音?
如果使用的是高频声音,请告知如何修改,谢谢。
发布于 2014-01-17 11:56:00
对于iPhone来说,Chirp是一种解决难题的廉价方法。他们实际上上传了要在线发送的数据,"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的范围内。
发布于 2017-10-11 05:51:18
这是一个Android implementation of Chirp,它将数据映射到声音的频率。此外,为了减轻数据丢失,传输的数据帧由纠错符号支持。
https://stackoverflow.com/questions/21012618
复制相似问题