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.
Could someone check and add comments to my method? WHY is it not used instead of ORIGINAL CDMA?
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
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).
Problem: create a protocol that would satisfy the assumptions.
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?