zoukankan      html  css  js  c++  java
  • 支付宝中当面付的通过音频传输数据的研究-实现部分(2)

    书接上回

    既然有目标了 我们就开始写测试代码吧~~ 

    1)使用超声波17500, 17700, 17900, 18100, 18300, 18500, 18700 分别表示0-6(为什么是0-6呢 嘿嘿 本人比较懒,SinVoice使用了6段频率,我也懒得修改代码了,就使用了同样的六段频率)其中0表示开始 6表示结束。真正的数据段就只有个1-5

    2)修改SinVoice的正弦波生成类生成类

    short out = (short) ((Math.sin(dl) *Math.sin(d))*mBits) ;
    这一段就是我们使用的调制算法 

    下面是我的修改结果 没有什么变化吧

      public void gen(int genRate, int duration) {
            if (STATE_START == mState) {
                mGenRate = genRate;
                mDuration = duration;
    
                if (null != mListener) {
                    mListener.onStartGen();
                }
    
                int n =  mBits/2;
                //int totalCount = (mDuration * mSampleRate) / 1000; 
                double perl = ( 2 * Math.PI * (double)50 / (double) mSampleRate) ;
                double per = ( 2 * Math.PI * (double)mGenRate / (double) mSampleRate) ;
                double dl = 0;
                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 < 440; ++i) {//每个数据用440个采样表示,也就是大约10ms
                            if (STATE_START == mState) {
                            	short out = (short) ((Math.sin(dl) *Math.sin(d))*mBits) ;
                                if (mFilledSize >= mBufferSize - 1) {
                                    // free buffer
                                    buffer.setFilledSize(mFilledSize);
                                    mCallback.freeGenBuffer(buffer);
    
                                    mFilledSize = 0;
                                    buffer = mCallback.getGenBuffer();
                                    if (null == buffer) {
                                        LogHelper.d(TAG, "get null buffer");
                                        break;
                                    }
                                }
    
                                buffer.mData[mFilledSize++] = (byte) (out & 0xff);
                                if (BITS_16 == mBits) {
                                    buffer.mData[mFilledSize++] = (byte) ((out >> 8) & 0xff);
                                }
    
                                dl += perl;
                                d +=per;
                            } else {
                                LogHelper.d(TAG, "sin gen force stop");
                                break;
                            }
                        }
                    } else {
                        LogHelper.d(TAG, "get null buffer");
                    }
    
                    if (null != buffer) {
                        buffer.setFilledSize(mFilledSize);
                        mCallback.freeGenBuffer(buffer);
                    }
                    mFilledSize = 0;
    
                    if (null != mListener) {
                        mListener.onStopGen();
                    }
                }
            }
        }


    这张图就是最后的录音结果。


    后面准写识别程序。

    我在识别程序中使用了https://code.google.com/p/tspl/中的快速傅里叶处理库。C++的 很容易移植到iOS 中。。。

    处理流程

    1)循环使用44个采样 进行傅里叶编码,来判断是否有超声波存在。

    2)检查到超声波存在后 就开始使用440个采样来判断数据。

    3)超声波消失后,就转到1)。继续检查超声波。


    运行结果



  • 相关阅读:
    main函数的一些特性
    确保函数的操作不超出数组实参的边界
    今天学习了一点sed
    libevent 与事件驱动
    mvc3 action验证失败后的自定义处理
    使用spring.net+nibernate时如何用aspnet_regiis加密数据库连接字符串
    C# 中 IList IEnumable 转换成 List类型
    Nhibernate 过长的字符串报错 dehydration property
    小论接口(interface)和抽象类(abstract class)的区别
    C# 语言在函数参数列表中出现this关键词的作用
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6204788.html
Copyright © 2011-2022 走看看