CDMA 是一种用于 多路访问 的信道协议,它允许多个发射机在单个通信信道上同时发送信息。
我们可以通过以下步骤来实现它:
- 生成一个覆盖宽频带的信号。
- 执行此操作的代码被称为扩频码。
- 随后,即使在存在许多其他信号的情况下,也可以通过给定的码选择特定的信号。
它主要用于移动网络,如 2G 和 3G。
CDMA 是如何工作的?
为了理解 CDMA 的工作原理,我们必须先了解正交序列(也称为码片)。
设 N 为在公共信道上建立多路访问的站点数量。
那么,正交序列的属性可以表述如下:
- 正交序列可以看作是一个 1xN 的矩阵。
示例: 对于 N = 4,序列为 [+1 -1 +1 -1]。
- 标量乘法和矩阵加法规则遵循常规运算。
示例: 3.[+1 -1 +1 -1] = [+3 -3 +3 -3]
示例: [+1 -1 +1 -1] + [-1 -1 -1 -1] = [0 -2 0 -2]
- 内积: 通过将两个序列逐元素相乘,然后将结果列表中的所有元素相加来计算。
- 序列与其自身的内积等于 N
[+1 -1 +1 -1].[+1 -1 +1 -1] = 1 + 1 + 1 + 1 = 4
- 两个不同序列的内积为零
[+1 -1 +1 -1].[+1 +1 +1 +1] = 1-1+1-1 = 0
要生成有效的正交序列,我们可以使用 沃尔什表 (Walsh Table),如下所示:
- 规则 1:
\[ W_1 =\begin{bmatrix} +1 \end{bmatrix} \]
- 规则 2:
\[ W{2N} = \begin{bmatrix} WN {:}{:} WN{:}{:}\\WN {:}{:} \overline{W_N} \end{bmatrix} \]
其中 \overline{WN} 表示 WN 的补码(将 +1 替换为 -1,将 -1 替换为 +1)
示例:
\[ W_2 = \begin{bmatrix}+1{:}+1{:}
\\+1{:}-1\\ \end{bmatrix}\]
\[ W_4 = \begin{bmatrix}+1{:}+1{:}+1{:}+1{:}
\\+1{:}-1{:}+1{:}-1{:}
\\+1{:}+1{:}-1{:}-1{:}
\\+1{:}-1{:}-1{:}+1{:}\\ \end{bmatrix}\]
矩阵的每一行代表一个正交序列。因此,我们可以为 N = 2^M 构造序列。现在让我们通过使用正交序列来看看 CDMA 是如何工作的。
步骤:
- 站点对其数据位进行编码,如下所示。
- 如果比特 = 1,则为 +1
- 如果比特 = 0,则为 -1
- 如果站点空闲,则无信号(解释为 0)
- 每个站点被分配一个唯一的正交序列(码),对于 N 个站点,该序列长度为 N 位。
- 每个站点将其编码的数据位与码序列进行标量乘法。
- 生成的序列随后被放置在信道上。
- 由于信道是公共的,振幅会叠加,因此结果信道序列是来自所有信道的序列之和。
- 如果站点 1 想要监听站点 2,它会将信道序列与站点 S2 的码进行乘法(内积)运算。
- 然后将内积除以 N,以获得从站点 2 传输的数据位。
示例: 假设有 4 个站点 S1, S2, S3, S4。我们将使用 4×4 沃尔什表为它们分配码。
C1 = [+1 +1 +1 +1]
C2 = [+1 -1 +1 -1]
C3 = [+1 +1 -1 -1]
C4 = [+1 -1 -1 +1]
**假设它们当前的数据位为:**
D1 = -1
D2 = -1
D3 = 0 (静默)
D4 = +1
**结果信道序列** = C1.D1 + C2.D2 + C3.D3 + C4.D4
= [-1 -1 -1 -1] + [-1 +1 -1 +1] + [0 0 0 0]
+ [+1 -1 -1 +1]
= [-1 -1 -3 +1]
现在假设站点 1 想要监听站点 2。
内积 = [-1 -1 -3 +1] x C2
= -1 + 1 - 3 - 1 = -4
发送的数据位 = -4/4 = -1.
下面的程序演示了简单 CDMA 信道的实现:
Java
“
// Java 代码演示 CDMA 的简单实现
import java.util.*;
public class CDMA {
private int[][] wtable;
private int[][] copy;
private int[] channel_sequence;
public void setUp(int[] data, int num_stations)
{
wtable = new int[numstations][numstations];
copy = new int[numstations][numstations];
buildWalshTable(numstations, 0, numstations – 1, 0,
num_stations – 1, false);
showWalshTable(num_stations);
for (int i = 0; i < num_stations; i++) {
for (int j = 0; j < num_stations; j++) {
// 制作沃尔什表的副本
// 供以后使用
copy[i][j] = wtable[i][j];
// 表中的每一行都是一个站点的码。
// 所以我们将每一行与站点数据相乘
wtable[i][j] *= data[i];
}
}
channelsequence = new int[numstations];
for (int i = 0; i < num_stations; i++) {
for (int j = 0; j < num_stations; j++) {
// 将所有序列相加以获得信道序列