# Why is CDMA so complicated, wouldn't this simpler solution work?

I am now reading about Code Division Multiple Access method (CDMA), which is used for multiple hosts to send data at the same time.

The main idea behind it is to use orthogonal vector basis to encode multiple bit streams into one, send the joined stream across the link, then decode the stream differently for every separate message.

What confuses me is that in digital logic negative numbers are introduced, as well as 0 indicating no signal.

When I first heard that such encoding exists, my first idea of how it should work was different from the original and it looks way simpler.

Outline of my solution

I take n orthogonal vectors (where xor is the addition operation in my vector space), each vector corresponding to one chip code. I then encode every bit as a chip code if it is 1, as 0 otherwise. Finally, I xor all bit sequences together and send the joined result. At the other end, recipient can decompose the bit stream into unique components and read the message of every host.

Solution in more details

1. Assumptions

• There are n hosts (numbered from 0 up to n - 1), and all of them want to send b bits at the same time using the same link.

• The receiver gets a joined bit stream, but is interested in reading the message of only one host (WLOG the message sent from the 0-th host).

2. Problem: create a protocol that would satisfy the assumptions.

3. My solution

• For i-th host, assign a chip code to him of the form 2^i (power not xor here) written in binary. Call this chip code c(i). For example:

Chip code 1000..00 would be given to host 0
Chip code 0100..00 would be given to host 1
...
Chip code 0000..01 would be given to host n-1.

• Every single bit will be encoded using n bits.

if (host i wants to send 0) {
encode it as 0000...00  // n zeroes
} else {
encode it as c(i)
}

• For host i wishing to send j-th bit, call the encoded bit as e(i, j). For example:

if (host i wants to send a bit stream, such that j-th bit is 1) {
e(i, j) = c(i)
} else {
e(i, j) = 0;
}

• For every j, compute

d(j) = e(0, j) ^ e(1, j) ^ ... ^ e(n - 1, j)  // xor operation here

• Concatenate d(0), d(1), ... d(n - 1) and send these n * b bits through the link. This will be the joined stream that the recipient at the other end should receive.

• The recipient wishing to read the data sent by host 0 can look at (0-th, n-th, 2n-th, ..., b(n-1)-th) bits to see what the first host has sent.

• The solution is simpler than original, because it uses only xor operation for encoding, and digits are only binary (i.e. no -2, +3 when doing vector addition). QED.

Does this solution work? If yes, why is it not used? The best reason I could guess is that we want to distinguish between hosts sending something and nothing. Are there other reasons?

Aside question: what are "nearly orthogonal" vectors in the context of CDMA?

• You seem to be re-inventing a form of FDM (or OFDM?), which has various strengths and weaknesses compared to CDMA already documented in various communications textbooks. Jan 27, 2016 at 15:37
• @hotpaw2 How is this (O)FDM (as opposed to TDM)?
– divB
Apr 18, 2020 at 6:07

Your solution works, and it is known by the name "time division multiple access" (TDMA). Basically, you assign time slots to each transmitter.

CDMA has several advantages compared to TDMA, but it also has its own disadvantages. Both schemes are inferior to more modern techniques such as OFDMA.

• With data rate constant, the time slices become narrower as the number of transmitters increases. This means that the bandwidth also increases. With CDMA, you can increase the number of transmitters without increasing the bandwidth, by adding orthogonal code words.

• TDMA requires very precise synchronization between transmitters. It is very hard to keep a large number of mobile units synchronized so that they won't transmit during the time slot of another unit. This may be solved using guardbands, but that decreases efficiency.

A couple of advantages of CDMA:

• More resistance to fading and multipath. CDMA reflections are orthogonal to each other, so they cancel out.

• If the codes are private, then there's a measure of inherent privacy.

• Ok, I agree that my solution actually implements TDMA (thx for pointing that). I still have a question regarding your post: "With CDMA, you can increase [...], by adding orthogonal code words." How can you add new code words if there are at most n orthogonal code words at the same time (unless you add something called "nearly orthogonal", which I am not sure what that is)? Jan 27, 2016 at 16:18
• What I mean is this: say (for example) you have 10 users and 20 codes available. You can grow your network to 20 users without increasing the bandwidth. Or, if you get more than 20 users, you can increase the code length and get more than 20 orthogonal codes. All this without increasing the bandwidth. Codes that are nearly orthogonal have non-zero (but very small) correlation, so that the different data streams can't be perfectly separated. In practice, however, the correlation is low enough that these codes can still be used.
– MBaz
Jan 27, 2016 at 17:00
• Ok, but wouldn't the same work with my method? I.E.: If I have 10 users and 20 codes available, each code being 20bit long. Then 10 of the codes are not used yet, so I can allocate them for new user. For me my method seems just to use a different vector space, but the rest is the same, and I thought that the original vector space is too complicated for such task... Jan 27, 2016 at 17:53
• Yes, but think in terms of bandwidth. Your method uses more. For example, if you have 20 time slots available but only 10 users, you're wasting half of your bandwidth.
– MBaz
Jan 27, 2016 at 19:02
• Sorry, I still don't get this. Yes, in my method, if I want to have 20 codes available, I need 20 bits to encode each of them, so I need 20 time "intervals", hence I would waste 10 of them just having 10 users. (continuation on next comment) Jan 27, 2016 at 23:17