📜  Java| CDMA(码分多址)

📅  最后修改于: 2022-05-13 01:54:49.382000             🧑  作者: Mango

Java| CDMA(码分多址)

CDMA 是用于多路访问的信道化协议,其中信息可以通过单个通信信道上的多个发射机同时发送。

它通过以下步骤实现:

  • 产生一个在宽带宽上扩展的信号。
  • 执行此操作的代码称为扩频码。
  • 稍后,即使存在许多其他信号,也可以使用给定代码选择特定信号。

它主要用于2G和3G等移动网络。

CDMA是如何工作的?

要了解 CDMA 的工作原理,我们必须了解正交序列(也称为码片)。

令 N 为通过公共信道建立多址接入的站的数量。

那么正交序列的性质可以表述如下:

  1. 正交序列可以被认为是一个 1xN 矩阵。
    例如: [+1 -1 +1 -1] N = 4。
  2. 标量乘法和矩阵加法规则照常遵循。
    例如: 3 [+1 -1 +1 -1] = [+3 -3 +3 -3]

    例如: [+1 -1 +1 -1] + [-1 -1 -1 -1] = [0 -2 0 -2]

  3. 内积:通过将两个序列逐个元素相乘,然后将结果列表的所有元素相加来评估它。
    • 序列与自身的内积等于 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 表,如下所示:

  • 规则1:

        \[ W_1 =\begin{bmatrix} +1 \end{bmatrix} \]

  • 规则 2:

          \[ W_{2N} = \begin{bmatrix}  W_N {\:}{\:} W_N{\:}{\:}\\W_N {\:}{\:} \overline{W_N} \end{bmatrix} \]

    在哪里\overline{W_N} = 的补充W_N (将 +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 如果位 = 1
    • -1 如果位 = 0
    • 如果站空闲,则无信号(解释为 0)
  2. 每个站都分配有一个唯一的正交序列(代码),对于 N 个站,该序列长 N 比特
  3. 每个站对其编码的数据位和代码序列进行标量乘法。
  4. 然后将生成的序列放置在通道上。
  5. 由于通道是公共的,因此幅度相加,因此得到的通道序列是来自所有通道的序列的总和。
  6. 如果站 1 想听站 2,它将信道序列与站 S2 的代码相乘(内积)。
  7. 然后将内积除以 N 得到从站 2 传输的数据位。

示例:假设 4 个站 S1、S2、S3、S4。我们将使用 4×4 Walsh Table 为它们分配代码。

C1 = [+1 +1 +1 +1]
C2 = [+1 -1 +1 -1]
C3 = [+1 +1 -1 -1]
C4 = [+1 -1 -1 +1]

Let their data bits currently be: 
D1 = -1
D2 = -1
D3 = 0 (Silent)
D4 = +1

Resultant channel sequence = 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]

Now suppose station 1 wants to listen to station 2. 
Inner Product = [-1 -1 -3 +1] x C2
              = -1 + 1 - 3 - 1 = -4

Data bit that was sent = -4/4 = -1.

下面的程序说明了一个简单的 CDMA 信道的实现:

// Java code illustrating a simple implementation of 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[num_stations][num_stations];
        copy = new int[num_stations][num_stations];
  
        buildWalshTable(num_stations, 0, num_stations - 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++) {
                  
                // Making a copy of walsh table
                // to be used later
                copy[i][j] = wtable[i][j]; 
  
                // each row in table is code for one station. 
                // So we multiply each row with station data
                wtable[i][j] *= data[i];
            }
        }
  
        channel_sequence = new int[num_stations];
  
        for (int i = 0; i < num_stations; i++) {
  
            for (int j = 0; j < num_stations; j++) {
                // Adding all sequences to get channel sequence
                channel_sequence[i] += wtable[j][i]; 
            }
        }
    }
  
    public void listenTo(int sourceStation, int num_stations)
    {
        int innerProduct = 0;
          
        for (int i = 0; i < num_stations; i++) {
  
            // multiply channel sequence and source station code
            innerProduct += copy[sourceStation][i] * channel_sequence[i];
        }
          
        System.out.println("The data received is: " + 
                            (innerProduct / num_stations));
    }
  
    public int buildWalshTable(int len, int i1, int i2, int j1, 
                                            int j2, boolean isBar)
    {
        // len = size of matrix. (i1, j1), (i2, j2) are
        // starting and ending indices of wtable.
          
        // isBar represents whether we want to add simple entry
        // or complement(southeast submatrix) to wtable.
  
        if (len == 2) {
  
            if (!isBar) {
  
                wtable[i1][j1] = 1;
                wtable[i1][j2] = 1;
                wtable[i2][j1] = 1;
                wtable[i2][j2] = -1;
            }
            else {
  
                wtable[i1][j1] = -1;
                wtable[i1][j2] = -1;
                wtable[i2][j1] = -1;
                wtable[i2][j2] = +1;
            }
  
            return 0;
        }
          
        int midi = (i1 + i2) / 2;
        int midj = (j1 + j2) / 2;
  
        buildWalshTable(len / 2, i1, midi, j1, midj, isBar);
        buildWalshTable(len / 2, i1, midi, midj + 1, j2, isBar);
        buildWalshTable(len / 2, midi + 1, i2, j1, midj, isBar);
        buildWalshTable(len / 2, midi + 1, i2, midj + 1, j2, !isBar);
  
        return 0;
    }
  
    public void showWalshTable(int num_stations)
    {
  
        System.out.print("\n");
  
        for (int i = 0; i < num_stations; i++) {
            for (int j = 0; j < num_stations; j++) {
                System.out.print(wtable[i][j] + " ");
            }
            System.out.print("\n");
        }
        System.out.println("-------------------------");
        System.out.print("\n");
    }
      
    // Driver Code
    public static void main(String[] args)
    {
        int num_stations = 4;
          
        int[] data = new int[num_stations];
          
        //data bits corresponding to each station
        data[0] = -1;
        data[1] = -1;
        data[2] = 0;
        data[3] = 1;
          
        CDMA channel = new CDMA();
          
        channel.setUp(data, num_stations);
  
        // station you want to listen to
        int sourceStation = 3;
  
        channel.listenTo(sourceStation, num_stations);
    }
}

输出

1  1  1  1 
1 -1  1 -1 
1  1 -1 -1 
1 -1 -1  1 

The data received is: 1

CDMA 的优点:与 FDMA 或 TDMA 等基于频率或时隙划分信道的其他信道化方案不同,CDMA 允许所有站点在整个持续时间内访问信道的全部带宽。