Java | CDMA (acceso múltiple por división de código)

CDMA es un protocolo de canalización para Acceso Múltiple , donde la información puede ser enviada simultáneamente a través de varios transmisores sobre un solo canal de comunicación.

Se logra en los siguientes pasos:

  • Se genera una señal que se extiende sobre un amplio ancho de banda.
  • El código que realiza esta acción se denomina código de difusión.
  • Posteriormente, se puede seleccionar una señal específica con un código dado incluso en presencia de muchas otras señales.

Se utiliza principalmente en redes móviles como 2G y 3G.

¿Cómo funciona CDMA?

Para ver cómo funciona CDMA, debemos entender las secuencias ortogonales (también conocidas como chips).

Sea N el número de estaciones que establecen acceso múltiple por un canal común.

Entonces las propiedades de las sucesiones ortogonales se pueden establecer de la siguiente manera:

  1. Se puede pensar en una secuencia ortogonal como una array 1xN.
    Por ejemplo: [+1 -1 +1 -1] para N = 4.
  2. Las reglas de multiplicación escalar y suma de arrays siguen como de costumbre.
    Por ejemplo: 3 . [+1 -1 +1 -1] = [+3 -3 +3 -3]

    Por ejemplo: [+1 -1 +1 -1] + [-1 -1 -1 -1] = [0 -2 0 -2]

  3. Producto Interno: Se evalúa multiplicando dos secuencias elemento por elemento y luego sumando todos los elementos de la lista resultante.
    • El Producto Interno de una sucesión consigo misma es igual a N
      [+1 -1 +1 -1] . [+1 -1 +1 -1] = 1 + 1 + 1 + 1 = 4
    • El producto interno de dos secuencias distintas es cero
      [+1 -1 +1 -1] . [+1 +1 +1 +1] = 1-1+1-1 = 0

Para generar secuencias ortogonales válidas, use una tabla de Walsh de la siguiente manera:

  • Regla 1:

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

  • Regla 2:

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

    Donde \overline{W_N}= Complemento de W_N(Reemplazar +1 por -1 y -1 por +1)

    Ejemplo:

     \[ 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}\]

    Cada fila de la array representa una secuencia ortogonal. Por lo tanto, podemos construir secuencias para N = 2^M. Ahora echemos un vistazo a cómo funciona CDMA usando secuencias ortogonales.

Procedimiento:

  1. La estación codifica su bit de datos de la siguiente manera.
    • +1 si bit = 1
    • -1 si bit = 0
    • sin señal (interpretado como 0) si la estación está inactiva
  2. A cada estación se le asigna una secuencia ortogonal única (código) que tiene una longitud de N bits para N estaciones
  3. Cada estación realiza una multiplicación escalar de su bit de datos codificado y secuencia de código.
  4. La secuencia resultante se coloca luego en el canal.
  5. Dado que el canal es común, las amplitudes se suman y, por lo tanto, la secuencia de canales resultante es la suma de las secuencias de todos los canales.
  6. Si la estación 1 quiere escuchar la estación 2, multiplica (producto interno) la secuencia de canales con el código de la estación S2.
  7. Luego, el producto interno se divide por N para obtener el bit de datos transmitido desde la estación 2.

Ejemplo: suponga 4 estaciones S1, S2, S3, S4. Usaremos la tabla Walsh de 4×4 para asignarles códigos.

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.

El siguiente programa ilustra la implementación de un canal CDMA simple:

// 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);
    }
}

Salida :

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

The data received is: 1

Ventajas de CDMA : a diferencia de otros esquemas de canalización como FDMA o TDMA que dividen el canal según la frecuencia o los intervalos de tiempo, CDMA permite que todas las estaciones tengan acceso al ancho de banda completo del canal durante toda la duración.

Publicación traducida automáticamente

Artículo escrito por green_dot y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *