书接上回
既然有目标了 我们就开始写测试代码吧~~
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)。继续检查超声波。
运行结果