Java| CDMA(码分多址)
CDMA 是用于多路访问的信道化协议,其中信息可以通过单个通信信道上的多个发射机同时发送。
它通过以下步骤实现:
- 产生一个在宽带宽上扩展的信号。
- 执行此操作的代码称为扩频码。
- 稍后,即使存在许多其他信号,也可以使用给定代码选择特定信号。
它主要用于2G和3G等移动网络。
CDMA是如何工作的?
要了解 CDMA 的工作原理,我们必须了解正交序列(也称为码片)。
令 N 为通过公共信道建立多址接入的站的数量。
那么正交序列的性质可以表述如下:
- 正交序列可以被认为是一个 1xN 矩阵。
例如: [+1 -1 +1 -1] N = 4。 - 标量乘法和矩阵加法规则照常遵循。
例如: 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
- 序列与自身的内积等于 N
要生成有效的正交序列,请使用Walsh 表,如下所示:
- 规则1:
- 规则 2:
在哪里 = 的补充 (将 +1 替换为 -1,将 -1 替换为 +1)
例子:
矩阵的每一行代表一个正交序列。因此我们可以为 N = 构造序列 .现在让我们看看CDMA是如何使用正交序列工作的。
程序:
- 该站按如下方式对其数据位进行编码。
- +1 如果位 = 1
- -1 如果位 = 0
- 如果站空闲,则无信号(解释为 0)
- 每个站都分配有一个唯一的正交序列(代码),对于 N 个站,该序列长 N 比特
- 每个站对其编码的数据位和代码序列进行标量乘法。
- 然后将生成的序列放置在通道上。
- 由于通道是公共的,因此幅度相加,因此得到的通道序列是来自所有通道的序列的总和。
- 如果站 1 想听站 2,它将信道序列与站 S2 的代码相乘(内积)。
- 然后将内积除以 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 允许所有站点在整个持续时间内访问信道的全部带宽。