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


分类: IT C++   863人阅读  评论(2)  收藏  举报
支付宝 算法 ios fft 超声波

书接上回

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

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

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

[java]  view plain copy
  1. short out = (short) ((Math.sin(dl) *Math.sin(d))*mBits) ;  
这一段就是我们使用的调制算法 

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

[java]  view plain copy
  1. public void gen(int genRate, int duration) {  
  2.       if (STATE_START == mState) {  
  3.           mGenRate = genRate;  
  4.           mDuration = duration;  
  5.   
  6.           if (null != mListener) {  
  7.               mListener.onStartGen();  
  8.           }  
  9.   
  10.           int n =  mBits/2;  
  11.           //int totalCount = (mDuration * mSampleRate) / 1000;   
  12.           double perl = ( 2 * Math.PI * (double)50 / (double) mSampleRate) ;  
  13.           double per = ( 2 * Math.PI * (double)mGenRate / (double) mSampleRate) ;  
  14.           double dl = 0;  
  15.           double d =0;  
  16.           LogHelper.d(TAG, "genRate:" + genRate);  
  17.           if (null != mCallback) {  
  18.               mFilledSize = 0;  
  19.               BufferData buffer = mCallback.getGenBuffer();  
  20.               if (null != buffer) {  
  21.                   for (int i = 0; i < 440; ++i) {//每个数据用440个采样表示,也就是大约10ms  
  22.                       if (STATE_START == mState) {  
  23.                         short out = (short) ((Math.sin(dl) *Math.sin(d))*mBits) ;  
  24.                           if (mFilledSize >= mBufferSize - 1) {  
  25.                               // free buffer  
  26.                               buffer.setFilledSize(mFilledSize);  
  27.                               mCallback.freeGenBuffer(buffer);  
  28.   
  29.                               mFilledSize = 0;  
  30.                               buffer = mCallback.getGenBuffer();  
  31.                               if (null == buffer) {  
  32.                                   LogHelper.d(TAG, "get null buffer");  
  33.                                   break;  
  34.                               }  
  35.                           }  
  36.   
  37.                           buffer.mData[mFilledSize++] = (byte) (out & 0xff);  
  38.                           if (BITS_16 == mBits) {  
  39.                               buffer.mData[mFilledSize++] = (byte) ((out >> 8) & 0xff);  
  40.                           }  
  41.   
  42.                           dl += perl;  
  43.                           d +=per;  
  44.                       } else {  
  45.                           LogHelper.d(TAG, "sin gen force stop");  
  46.                           break;  
  47.                       }  
  48.                   }  
  49.               } else {  
  50.                   LogHelper.d(TAG, "get null buffer");  
  51.               }  
  52.   
  53.               if (null != buffer) {  
  54.                   buffer.setFilledSize(mFilledSize);  
  55.                   mCallback.freeGenBuffer(buffer);  
  56.               }  
  57.               mFilledSize = 0;  
  58.   
  59.               if (null != mListener) {  
  60.                   mListener.onStopGen();  
  61.               }  
  62.           }  
  63.       }  
  64.   }  

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

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


后面准写识别程序。

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

处理流程

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

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

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


运行结果

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


你可能感兴趣的:(C++,it)