从网上看到了一个声波通信例子,但自己琢磨不透,不知道他的原理,不懂他是怎么将数字转变成一个声波穿出去的,也不懂怎么把他改成能传输11个0~9。求大神讲解。
 private final static int[] CODE_FREQUENCY = { 1422, 1575, 1764, 2004, 2321, 2940, 4410 };//是什么意思??
下面这个函数的意思
public void gen(int genRate, int duration) {
        if (STATE_START == mState) {
            mGenRate = genRate;
            mDuration = duration;            if (null != mListener) {
                mListener.onStartGen();
            }         // 定值16384  
            int n = mBits / 2;
            int totalCount = (mDuration * mSampleRate) / 1000;
            double per = (mGenRate / (double) mSampleRate) * 2 * Math.PI;
            double d = 0;            LogHelper.d(TAG, "genRate:" + genRate);
            if (null != mCallback) {
                mFilledSize = 0;
                // 获取要编码的数据  
                BufferData buffer = mCallback.getGenBuffer();
                if (null != buffer) {
                    for (int i = 0; i < totalCount; ++i) {
                        if (STATE_START == mState) {
                          // 算出不同点的正弦值 
                            int out = (int) (Math.sin(d) * n) + 128;                         // 如果填充数量超过了缓冲区的大小,就重置mFilledSize,释放bufferData  
                            if (mFilledSize >= mBufferSize - 1) {
                                // free buffer
                                buffer.setFilledSize(mFilledSize);
                                mCallback.freeGenBuffer(buffer);                                mFilledSize = 0;
                                buffer = mCallback.getGenBuffer();
                                if (null == buffer) {
                                    LogHelper.e(TAG, "get null buffer");
                                    break;
                                }
                            }                         // 转码为byte类型并保存,& 0xff是为了防止负数转换出现异常  
                            buffer.mData[mFilledSize++] = (byte) (out & 0xff);
                            if (BITS_16 == mBits) {
                                buffer.mData[mFilledSize++] = (byte) ((out >> 8) & 0xff);
                            }                            d += per;
                        } else {
                            LogHelper.d(TAG, "sin gen force stop");
                            break;
                        }
                    }
                } else {
                    LogHelper.e(TAG, "get null buffer");
                }                if (null != buffer) {
                    buffer.setFilledSize(mFilledSize);
                    mCallback.freeGenBuffer(buffer);
                }
                mFilledSize = 0;                if (null != mListener) {
                    mListener.onStopGen();
                }
            }

解决方案 »

  1.   

    这是一个发送端的代码,大体思路是将所要传输的数字 用一个单频声音信号来表示,比如,1对应2000HZ,而android可以使用AudioTrack来进行播放声音,所以就只需要产生对应频率的正弦波进行PCM编码,将编码后的数据放在byte[]数组中,再通过AudioTrack将这段数据发出去。你就听到声音了。声波识别真正难得是解码端
      

  2.   

    它采用的思路是dtmf,将定义不同的频率代表一个码值。然后接收端检测这些频率。参看:http://blog.csdn.net/erice/article/details/77833041