如何理解CDMA?

推荐参考大神文章 https://blog.csdn.net/dog250/article/details/6420427

(码分多址(CDMA)的本质-正交之美)

首先我们先看《计算机网络(第七版)》(谢希仁)第57页关于CDMA的有关介绍

……

为了不让码片序列不会造成互相干扰,需要让码片序列对应的码片向量相互正交

那什么是正交?

从概念上来讲,两个向量的对应元素乘积总和为 0,则这两个向量正交。

如果换成”垂直“两个字也许会更好理解一点。

在二维平面中,x轴和y轴相互正交。

在三维平面中,x轴、y轴、z轴相互正交。

那么正交会给我们带来什么样的性质呢?

抛开码片序列不谈,我们可以考虑下面的例子

现有两个用户x轴和y轴,我们要给x发送1,给y发送2

于是,我们将两个数据进行合成,变为 [1,2]

显然,它能够被x和y准确的识别,因为x、y只关心属于他们的“特征”,或者说“分量”。对于x轴来说,只需简单的用数据data · x轴单位向量即可识别出自己所需要的数据为1。

这个例子虽然和CDMA有一些小区别,但是道理很相似。

个人觉得正交的最大好处就在于互不影响

实例

这里我们先不关心码片序列是如何编码的,我们看真正的一个例子

首先我们需要明白两个式子:

对于任何码片向量S,我们有规格化内积为1,即\(\frac{1}{m}S\cdot S=1\)

对于任何两个不同的码片向量S、T,它们正交,即\(S\cdot T=0\)

假设我们已经知道了A、B的码片序列分别为

A:00001111

B:01011010

则它们对应的码片向量为

A:-1 -1 -1 -1 1 1 1 1

B:-1 1 -1 1 1 -1 1 -1

假设向用户A发送数据010

向用户B发送数据011

则用户A的数据经过用户A的码片序列编码后为

-A A -A

用户B的数据经过用户B的码片序列编码后为

-B B B

二者叠加后数据为

-A-B A+B -A+B

对于用户A来说,要解析这一串数据,只需用数据内积自己的码片向量,即data·A

(-A-B)·A = -A·A - B·A = -8 - 0 = -8,规格化之后就是 -1,对应的比特位为0。

同理 (A+B)·A = A·A + B·A = 8 + 0 = 8,规格化之后就是 1,对应的比特位为1。

(-A+B)·A = -A·A + B·A = -8 + 0 = -8,规格化之后就是 -1,对应的比特位为0。

即,用户A成功解析出了数据为010。

python代码实现


import numpy as np
# 定义码片序列,转为码片向量
A = np.array([-1,-1,-1,-1,1,1,1,1])
B = np.array([-1,1,-1,1,-1,1,-1,1])
C = np.array([-1,-1,1,1,1,1,-1,-1]) # 用seq给数据编码
def encode(data,seq):
c = None
for i in data:
if int(i):
if c is not None:
c = np.vstack([c,seq])
else: c = seq
else:
if c is not None:
c = np.vstack([c,-seq])
else: c = -seq
return c # 用seq给数据解码
def decode(data,seq):
d = data @ seq / seq.size
d[d<0] = 0
d = d.astype(int)
return "".join([str(x) for x in d.tolist()]) EA = encode('01110',A)
EB = encode('01001',B)
EC = encode('11100',C) data = EA + EB + EC
print("合成数据为:",data,sep='\n') print(decode(data,A))
print(decode(data,B))
print(decode(data,C))

运行结果:

如何理解码分复用中的码分多址CDMA?的更多相关文章

  1. 如何理解javaSript中函数的参数是按值传递

    本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人 ...

  2. 怎么理解js中的事件委托

    怎么理解js中的事件委托 时间 2015-01-15 00:59:59  SegmentFault 原文  http://segmentfault.com/blog/sunchengli/119000 ...

  3. 如何理解T-SQL中Merge语句(二)

    写在前面的话:上一篇写了如何理解T-SQL中Merge语句,基本把Merge语句要讲的给讲了,在文章的后面,抛出了几个结,当时没有想明白怎么去用文字表达,这一篇就来解答一下这几个结,又是一篇“天马行空 ...

  4. 如何理解T-SQL中Merge语句

    写在前面的话:之前看过Merge语句,感觉没什么用,完全可以用其他的方式来替代,最近又看了看Merge语句,确实挺好用,可以少写很多代码,看起来也很紧凑,当然也有别的优点. ====正文开始===== ...

  5. 深入理解JDK中的I/O

    深入理解JDK中的I/O 目 录 java内存模型GCHTTP协议事务隔离级并发多线程设计模式清楚redis.memcache并且知道区别mysql分表分库有接口幂等性了解jdk8稍微了解一下特性 j ...

  6. 深度理解Jquery 中 offset() 方法

    参考原文:深度理解Jquery 中 offset() 方法

  7. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  8. 深入理解CSS中的层叠上下文和层叠顺序(转)

    by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=5115 零.世间的道 ...

  9. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

随机推荐

  1. Redis详细使用及结合SpringBoot

    今天咱来聊一下Redis五种数据类型的详细用法以及在代码中如何使用.废话不多说,开始! Redis五种数据类型: string:字符串对象 list:列表对象 hash:散列 set:集合 zset: ...

  2. Netty之ChannelOption的各种参数

    ChannelOption.SO_BACKLOG, 1024 BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最 ...

  3. 并发编程(二)Java中的多线程

    一.创建多线程 创建多线程有以下几种方法: 继承Thread,重写run方法 实现Runnable接口,重写run方法[无返回值] 实现Callable接口,重写call方法[有返回值] 继承Thre ...

  4. [网鼎杯 2018]Comment

    [网鼎杯 2018]Comment 又遇到了一道有意思的题目,还是比较综合的,考的跟之前有一道很相像,用的还是二次注入. 因为找不到登陆点的sql注入,所以扫了一下源码,发现是存在git泄露的. [2 ...

  5. vue项目中视频播放结束返回首页出现1秒左右的白屏问题

    vue项目的性能优化问题,一直以来都是大家比较关注的. 近日负责的项目中,使用了SignalR实时通讯,客户端中点击发起播放视频的请求到服务器,服务器接到请求后再调用前端的播放视频方法,以此来达到播放 ...

  6. C++实现职工管理系统(中)

    C++实现职工管理系统(中) 大家好,今天是在博客园的第九天,博主今天给大家带来的是职工管理系统(C++)(中) 这次的随笔记录是实现(上)结语处说的几个功能 目录 C++实现职工管理系统(中) 1. ...

  7. RESTful API 编写规范

    RESTful API 编写规范 在一个RESTful系统里,客户端向服务端发起索取资源的操作只能通过HTTP协议语义来进行交互.最常用的HTTP协议语义有以下5个: GET GET:发送一条或者多条 ...

  8. Go gin框架 使用swagger生成API文档

    swaggos 是一个golang版本的swagger文档生成器,提供了native code包装器,并且支持主流的web框架包裹器 github 地址:https://github.com/swag ...

  9. 日志分析平台ELK之搜索引擎Elasticsearch集群

    一.简介 什么是ELK?ELK是Elasticsearch.Logstash.Kibana这三个软件的首字母缩写:其中elasticsearch是用来做数据的存储和搜索的搜索引擎:logstash是数 ...

  10. SpringBoot整合SpringDataJPA,今天没啥事情就看了一下springboot整合springdataJPA,实在是香啊,SQL语句都不用写了

    SpringBoot整合SpringDataJPA 1.JPA概念 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映 ...