码迷,mamicode.com
首页 > 其他好文 > 详细

支付宝中当面付的通过音频传输数据的研究-实现部分(2)

时间:2014-08-21 15:03:54      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:支付宝   算法   ios   fft   超声波   

书接上回

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

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();
                }
            }
        }
    }

bubuko.com,布布扣

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


后面准写识别程序。

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

处理流程

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

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

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


运行结果

bubuko.com,布布扣


支付宝中当面付的通过音频传输数据的研究-实现部分(2),布布扣,bubuko.com

支付宝中当面付的通过音频传输数据的研究-实现部分(2)

标签:支付宝   算法   ios   fft   超声波   

原文地址:http://blog.csdn.net/zblue78/article/details/38728853

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!