Zasada działania CDMA

Rozwinięcie skrótu CDMA to Code Division Multiple Access. W odróżnieniu od FDMA (gdzie mamy podział na częstotliwości) i TDMA (gdzie mamy naprzemienność czasową) w CDMA wszyscy nadają naraz i to w pełnym spektrum częstotliwości. Takie rozwiązanie jest stosowane współcześnie – w telefonii 3G. Jednak, ten artykuł nie jest o telefonii – CDMA może być przydatne programistom, gdyż technika ta pozwala na pewien specyficzny sposób przesyłania sobie danych. Dowolną ilość N komunikatów o długości L możemy sobie zsumować (dosłownie zsumować operacją arytmetycznego dodawania) i przesłać do odbiorców tak jakby to był jeden komunikat (długość L się nie zmiania). Każdy odbiorca przy pomocy swojego kodu odczytuje z takiej przesyłki to co miało do niego dotrzeć. Zaskakujące jest to, że w każdym momencie transmisji, kolejny nadawca może dodać do transmitowanego komunikatu swoje dane niezaburzając komunikacji i nie wydłużając przesyłki, a związany z nim odbiorca sobie odczyta przeznaczony dla niego komuniakt.

Wszystko opiera się o pojęcie ortogonalności (jest to pewna „magiczna” własność w świecie matematycznym). Jeżeli kilka funkcji jest względem siebie ortogonalne to możemy te funkcje dowolnie ze sobą mnożyć, a i tak nie zatracimy informacji i możemy później taki zmieszany sygnał wrócić do postaci sprzed mnożenia. Zobaczmy na poniższy rysunek.

CDMA - funkcje ortogonalne

Funkcje te są przykładami funkcji nawzajem ortogonalnych. Skąd to wiadomo? Matematyk by powiedział, że całka z iloczynu każdej z dwóch tych funkcji wynosi zero. Ale nie każdy musi pamiętać, co to całka. Chodzi w tym o to, że gdy weźmiemy dowolne 2 z tych i będziemy pokolei mnożyć wartości odpowiadających sobie segmentów i dodawać do już zebranej sumy to w efekcie zawsze otrzymamy zero. Np. dla funkcji 1szej i 2giej mamy: (1 * 1)+(1 * 1)+(1 * -1)+(1 * -1) = 1 + 1 – 1 – 1 = 0.

I teraz, żeby zobaczyć, że po przemnożeniu nie tracimy informacji, zobaczmy na poniższy rysunek. Na górze mamy iloczyn funkcji 2giej i 3ciej z poprzedniego rysunku. Gdy taki iloczyn przemnoższymy znowu prze 2gą funkcję otrzymamy spowrotem 3cią funkcję, a gdy przemnożymu iloczyn przez 3cią funkcję to otrzymamy spowrotem 2gą funkcję.

CDMA - mul

Albo inny przykład, gdzie mamy iloczyn 3 funkcji i po przemnożeniu tego iloczyny przez daną funkcję otrzymujemy właśnie tą funkcję.

CDMA - mul2

Jednak w prawdziwym CDMA działa to minimalnie inaczej. Każdy nadawca N koduje ciąg danych D przy użyciu swojego klucza K. Klucze są ortogonalne względem siebie. Zaodowane dane są sumowane algebraicznie i wysyłane do odbiorców. Odbiorcy otrzymują taki zakodowany przekaz. Teraz każdy odbiorca przy pomocy swojego klucza K (tego samego co u odpowiedniego nadawcy) odczytuje zakodowaną w przekazie wiadomość. Pokaże to na przykładzie.

Nadawca 1.:
DANE1: (1, 0, 1, 1)
KLUCZ1: (1, -1)

Nadawca 2.:
DANE2: (0, 0, 1, 1)
KLUCZ2: (1, 1)

Dla pierwszego nadawcy mamy:

  • Najpierw skalujemy dane tak, aby wartości nie były od 0 do 1 tylko od -1 do 1:
    SYGNAL1A = 2 * DANE1 – 1 = 2 * (1, 0, 1, 1) – (1, 1, 1, 1) = (2, 0, 2, 2) – (1, 1, 1, 1) = (1, -1, 1, 1)

  • Teraz wykonamy prostą operację, która się nazywa iloczynem Kroneckera. Będziemy brać po kolei każdy element z pierwszego czynnika i przemnażać z każdym elementem drugiego czynnika, z tym, że zrobimy najpierw wszystkie mnożenia dla pierwszego elementu pierwszego czynnika, pozniej drugiego elementu, trzeciego, etc. Mamy więc:
    SYGNAL1B = SYGNAL1A x KLUCZ1 = (1, -1, 1, 1) x (1, -1) = (1, -1, -1, 1, 1 -1, 1, -1)

Dla drugiego nadawcy mamy:

  • SYGNAL2A = 2 * DANE2 – 1 = 2 * (0, 0, 1, 1) – (1, 1, 1, 1) = (0, 0, 2, 2) – (1, 1, 1, 1) = (-1, -1, 1, 1)

  • SYGNAL2B = SYGNAL2A x KLUCZ2 = (-1, -1, 1, 1) x (1, 1) = (-1, -1, -1, -1, 1 1, 1, 1)

Kodowanie zakończone, więc możemy dodać oba otrzymane sygnały:
(1, ?1, ?1, 1, 1, ?1, 1, ?1) + (?1, ?1, ?1, ?1, 1, 1, 1, 1) = (0, ?2, ?2, 0, 2, 0, 2, 0)

Dekodowanie wygląda tak:
DANA OTRZYMANA: (0, ?2, ?2, 0, 2, 0, 2, 0)
KLUCZ1: (1, -1)

  • Grupujemy elementy otrzymane parami: ((0, ?2), (?2, 0), (2, 0), (2, 0))

  • Wykonujemy mnożenie każdej pary z kluczem. Nie jest to już jednak iloczyn Kroneckera. Po prostu pierwszy element pary mnożymy z pierwszym elementem klucza. Drugi z drugim. Tak robimy dla każdej pary. Później elementy w każdej parze dodajemy do siebie. Mamy więc:
    ((0, ?2), (?2, 0), (2, 0), (2, 0)) * (1, ?1) = ((0 + 2), (?2 + 0), (2 + 0), (2 + 0)) = (2, -2, 2, 2)

  • Otrzymany wynik (2, -2, 2, 2) odpowiada (1, 0, 1, 1) czyli naszej DANEJ1.

Jeżeli tylko jeden nadawca by nadał komunikat, to inni odbiorcy otrzymaliby w efekcie (0, 0, 0, 0).