CDMA 通信模拟(基于Android平台)

      最近通信课作业要在Android上模拟出支持105信道同时通信的CDMA系统。我负责CDMA核心编解码部分,好久没用java,真的生疏了-_-! 作业还要写文档,所以趁热先弄些图出来:

image

CDMA编码过程(限定用java搞的,没法)

cdma_decode

CDMA解码过程

  • 关键实现代码
/*!
UserKey类的编码方法
\return byte[] 编码后的字节序列(4字节,末尾4位未使用)
*/
public byte[] encode() {
    byte[] result = new byte[4];                    ///< 4 × 8 = 32bit > 28bit    
    final int mask = 15;                            ///< 0x0000000F
        
    for(int i = 0; i < size/* key length */; ++i) {
        if(i % 2 == 0)
            result[i / 2] |= (mask & key[i]) << 4;  ///  写入byte高位
        else
            result[i / 2] |= (mask & key[i]);       ///  写入byte低位
    }
        
    return result;
}
 
/*!
UserKey类的解码方法
\param byte[] 多用户混合编码1个位的字节序列
\return int 本key与混合编码字节序列点乘后的和
*/
public int decode(final byte[] main) {
    int result = 0;
        
    for(int i = 0; i < size/* key length */; ++i) {
        int decoded;
            
        if(i % 2 == 0)
            /* 解析byte高位到decoded,有符号位移 */
            decoded = ((main[i / 2] & 0xF0) << 24) >> 28;
        else
            /* 解析byte低位到decoded,有符号位移 */
            decoded = ((main[i / 2] & 0xF) << 28) >> 28;
                
        result += decoded * key[i];                 ///  点乘相加
    }
        
    return result;
}
  • 技术难点

1、同时支持105信道通信

      本实验选用的是7位的用户码,共7个,理论上只CDMA的话仅能支持7个信道。所以要在CDMA基础上加入TDMA,其中TDMA需要一帧分为15时隙,这样15×7=105信道。

2、同时进行105信道混合编码

      我们如果支持105信道,其中需要同时把105个用户的数据进行混合编码。更细节的,同时把105用户的数据的第1位混合成15个长度为4byte的字节序。0-6信道使用CDMA把各自(各选用1个用户码)数据的第1位的编码进行混合,成为1个4byte,占用1个TDMA帧的第1个时隙;依次类推7-13信道使用CDMA混合编码第1位后占用第2个时隙。

3、从105信道中解码

      依次使用key对相应时隙的字节流进行全解码,每解码一遍,解出1个信道的所有数据。

4、数据对齐

      本CDMA编解码恒定提供105信道,没有空信道。因此对于实验用字符串数据,可以在短数据编码完毕后(此时至少存在1个信道,其数据仍未编码完毕),恒定使用位0编码。这样在解出字符串数据后,简单的使用trim操作即可还原原始字符串。

posted @ 2011-04-28 20:18  紫红的泪  阅读(877)  评论(0编辑  收藏  举报