wireless.rar

  • 新帆科技飞龙
    了解作者
  • C/C++
    开发工具
  • 6KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 2
    下载次数
  • 2018-10-10 10:58
    上传日期
BCH3121,标准的寻呼机模式的接收解析函数,内含纠错编码
wireless.rar
  • wireless
  • wireless
  • BCH3121.cpp
    7KB
  • BCHbase.cpp
    694B
  • BCH3121.h
    1.9KB
  • BCHbase.h
    139B
  • BCH2616.cpp
    8.1KB
  • BCH2616.h
    1.6KB
内容介绍
#include "memdebug.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #include "BCH2616.h" #include <stdio.h> #include <memory.h> #include "BCHbase.h" #define BCH_LENGTH_GENERATPLOY 11 // length of generator polynomial #define BCH_LENGTH_CODEWORD 26 #define BCH_LENGTH_INFO 16 #define BCH_LENGTH_CHECKCODE 10 #define BCH_CHECK_WRONG 0 #define BCH_CHECK_RIGTH 1 static char h[BCH_LENGTH_CODEWORD][BCH_LENGTH_CHECKCODE] = { {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 1, 1, 0, 1, 1, 1, 0, 0}, {0, 1, 0, 1, 1, 0, 1, 1, 1, 0}, {0, 0, 1, 0, 1, 1, 0, 1, 1, 1}, {1, 0, 1, 0, 0, 0, 0, 1, 1, 1}, {1, 1, 1, 0, 0, 1, 1, 1, 1, 1}, {1, 1, 0, 0, 0, 1, 0, 0, 1, 1}, {1, 1, 0, 1, 0, 1, 0, 1, 0, 1}, {1, 1, 0, 1, 1, 1, 0, 1, 1, 0}, {0, 1, 1, 0, 1, 1, 1, 0, 1, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 1, 1, 1, 0, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 0, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 0, 1, 1, 1}, {1, 0, 1, 0, 1, 0, 0, 1, 1, 1}, {1, 1, 1, 0, 0, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 0, 1, 1, 0, 1, 1} }; //--------------------------------------------------------- // // BCH产生校验码过程中对位进行异或去处的迭代处理过程 // -------------------------------------------- // 1110 1101 001 /0100 0011 0000 1100 0011 0000 0000 0000 // 数据1 // 1110 1101 001 // 数据2 // ------------------------------------------- // 0110 1011 001 // 数据3 // 数据是常量,用全局变量控制 // data : // 数据1的前面BCH_LENGTH_GENERATPLOY位的首地址 // ret : // 数据3的首地址 // //--------------------------------------------------------- void BCH2616Xor ( uchar* data, uchar* ret, uchar begin ) { char GeneraPloy[BCH_LENGTH_GENERATPLOY] = // BCH(26,16)的生成多项式 {1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1}; // g(x)=x10+x8+x7+x5+x4+x3+1 if ( *ret == 0 ) return; for ( int a = 0, i = 0; i < BCH_LENGTH_GENERATPLOY; i++ ) ret[i] ^= GeneraPloy[a++]; } //--------------------------------------------------------- // // 对原始数据的某连续的16个位进行编码 // source : // 最前面16位为需要进行编码的内容 // 应该是一个四字节大小的数据的首地址 // 返回 : // 最前面16位为参数传递的信息+10的BCH校验码 // //--------------------------------------------------------- ulong Bch2616Encode ( ulong da ) { int k = 0; ulong value = 0; // 返回值 uchar ret[BCH_LENGTH_CODEWORD+1]; // 每次迭代过程的校验结果 uchar data[BCH_LENGTH_CODEWORD+1]; // 将参数的位映射成字节便于引用 memset ( ret, 0, BCH_LENGTH_CODEWORD ); memset ( data, 0, BCH_LENGTH_CODEWORD ); Long2Bytes ( da, data ); // 构造与数据对应的32个值的字节型数组 memcpy ( ret, data, BCH_LENGTH_GENERATPLOY ); // 循环进行迭代求校验值的运算 for ( k = 0; k < BCH_LENGTH_INFO; k++ ) { BCH2616Xor ( data + k, ret + k, k ); ret[BCH_LENGTH_GENERATPLOY+k] = data[BCH_LENGTH_GENERATPLOY+k]; } for ( ; k < BCH_LENGTH_CODEWORD; k++ ) // 将校验值添加到原始数据末尾 data[k] = ret[k]; for ( k = 0; k < BCH_LENGTH_CODEWORD; k++ ) // 根据数组构造返回值 { if ( data[k] == 1 ) value |= 1 << ( 31 - k ); } return value; } //--------------------------------------------------------- // // 执行encode的逆向操作 // 此函数只执行数据是否出错的校验工作,而不对数据进行修正 // source : // 接收到的原始数据 // 应该是一个四字节大小的数据的首地址 // check : // 接收到的数据的伴随式 // 返回 : // 1 数据没有发生错误 // 0 数据发生了错误 //--------------------------------------------------------- static uchar Bch2616Check ( ulong da, uchar* check ) { uchar data[BCH_LENGTH_CODEWORD]; memset ( data, 0, BCH_LENGTH_CODEWORD ); memset ( check, 0, BCH_LENGTH_CHECKCODE ); Long2Bytes ( da, data ); int r; // 矩阵的行索引 int c; // 矩阵的列索引 for ( r = 0; r < BCH_LENGTH_CHECKCODE; r++ ) { for ( c = 0; c < BCH_LENGTH_CODEWORD; c++ ) check[r] ^= ( data[c] && h[c][r] ); } for ( c = 0; c < BCH_LENGTH_CHECKCODE; c++ ) if ( check[c] != 0 ) return FALSE; return TRUE; } //--------------------------------------------------------- // // 对接收到的数据进行译码 // source : // 应该是一个四字节大小的数据的首地址 // 返回 : // 修正以后的正确结果 // 最前面16位为参数传递的信息,后面的16位用'0'填充 // 如果数据含有超过两位的错误,则返回0xffffffff //--------------------------------------------------------- ulong Bch2616Decode ( ulong data ) { uchar c, r; uchar Erroroccur = FALSE; uchar check[BCH_LENGTH_CHECKCODE]; if ( TRUE == Bch2616Check ( data, check ) ) // data no error return data & 0xffff0000; // return the front 21 bits else // data with error { //return 0xffffffff; for ( c = 0; c < BCH_LENGTH_INFO; c++ ) // this loop will check one-bit error { for ( r = 0; r < BCH_LENGTH_CHECKCODE; r++ ) { if ( h[c][r] == check[r] ) Erroroccur = TRUE; else { Erroroccur = FALSE; break; } } if ( TRUE == Erroroccur ) // data just with one-bit error { RevBit ( data, ( 31 - c ) ); // reversal the wrong bit // printf ( "Error at %d(th) and resolved!\n", 31 - c ); data &= 0xffff0000; // return 21 data bits return data; } } for ( c = 0; c < BCH_LENGTH_INFO; c++ ) // data with 2 more errors { for ( r = c; r < BCH_LENGTH_INFO; r++ ) { for ( int e = 0; e < BCH_LENGTH_CHECKCODE; e++ ) { if ( check[e] == ( h[c][e] ^ h[r][e] ) ) Erroroccur = TRUE; else { Erroroccur = FALSE; break; } } if ( Erroroccur == TRUE ) // data with 2 errors { RevBit ( data, ( 31 - c ) ); RevBit ( data, ( 31 - r ) ); // printf ( "Error at %d(th)|%d(th) and resolved!\n", 31 - c, 31 - r ); data &= 0xffff0000; return data; } } } } // printf ( "----------check code error!----------\n" ); return 0xffffffff; // data with 2 more errors // we can't deal with this case } /*******计算CRC,多项式为G(x)=x16+x12+x5+1?, 按半子节计算**********/ ushort Yb_Crc(uchar *ptr,ushort len) { ushort CrcReturn=0; uchar da; uint crc_ta[16]={ 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef };
评论
    相关推荐
    • 3G_ProtocolStack_designe.rar
      3g手机协议栈设计方案,简述了用telelogic tau进行3g手机协议栈设计的过程;
    • phone_protocol.rar
      阐述了手机协议栈的原理及开发过程,给出了详细的文档
    • AT89C2051.rar
      AT89C2051单片机设计开发的ML99V4型传呼发码电路的功能、原理、编程及应用。
    • 寻呼机发码.rar
      开源!单片机源码和上位机源码都开源!讨厌那种一个单片机加个Si4463模块就卖你几百块的商家,虽然我知道写程序画板子也不容易,但是价格是成本的十倍着实太坑。
    • Mobile.rar
      手机电路中的常用英文缩写,可以给维修的人员带来查看方便.中英对照.
    • 单片机技术文档非常有用
      单片机技术文档非常有用单片机技术文档非常有用单片机技术文档非常有用单片机技术文档非常有用
    • WCDMA精品原理教材
      4.1 RAKE接收 4-1 4.2 CDMA射频和中频设计原理 4-4 4.2.1 CDMA射频和中频的总体结构 4-4 4.2.2 CDMA的射频设计性能和考虑 4-4 4.2.3 数字中频技术 4-5 4.3 分集接收原理 4-5 4.4 信道编码 4-7 4.4.1 卷积码 4-8 ...
    • 56657608.rar
      GSM的空中接口,对无线这一部分有详细的介绍
    • ZUXJECQ.rar
      GSM的空中接口,对无线这一部分有详细的介绍
    • qpopper2.53.tar.Z
      pop3 server