Java | CDMA (码分多址)

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++) {

// 将所有序列相加以获得信道序列

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/44313.html
点赞
0.00 平均评分 (0% 分数) - 0