Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Mapowanie na konstelacje- modulacja 16-QAM [C++]

Ostatnio zmodyfikowano 2016-12-02 00:36
Autor Wiadomość
piotrmaceluch
Temat założony przez niniejszego użytkownika
Mapowanie na konstelacje- modulacja 16-QAM [C++]
» 2016-12-01 21:57:33
Witam.
Postaram się opisać problem jak najdokładniej :)
Chętnie odpowiem na pytania.

Oto problem z którym przyszło mi się zmierzyć.

Staram się napisać program, mapujący konstelacje.
Sposób działania przedstawiony jest w linku:

https://www.google.co.uk​/search?q=16+qam&source=lnms​&tbm=isch&sa=X​&ved=0ahUKEwitoeLT5NPQAhXjAsAKH​fPBA5UQ_AUICCgB​&biw=1303​&bih=917#imgrc=OfIrq_4kFwP6fM%3A

Na początku mam ciąg danych bitowych, np: [0101001001110101]

Chcę, by każde kolejne 4 bity, zostały zmapowane.
Na wyjściu każdego takiego symbolu, powinienem dostać amplitudę oraz fazę.
Przykładowo dla obrazka:
pierwsze 4 bity 0101-> amplituda 1
                       faza 135

następne 4 bity 0010-> amplituda~3.41
                       faza 225

itp.

Czy da się to zrobić jakoś ładniej, niż za pomocą 'if'-ów?
Korzystam z biblioteki complex, ale chodzi mi uproszczenie kodu.
Przesuwając wskaźnik czy coś w ten deseń :)

Serdecznie pozdrawiam
P-154384
jankowalski25
» 2016-12-01 23:09:44
pierwsze 4 bity 0101-> amplituda 1
                       faza 135

następne 4 bity 0010-> amplituda~3.41
                       faza 225
Faza się zgadza, ale mam wątpliwości co do amplitudy. Z jakiego wzoru ją obliczasz?
Czy da się to zrobić jakoś ładniej, niż za pomocą 'if'-ów?
1. Przyjmujesz środek układu współrzędnych jako (0;0).
2. Dla każdej wartości wyznaczasz współrzędne (wyliczasz prostym wzorem, nie trzeba żadnych ifów), na przykład punkt 0101 znajduje się na pozycji (-1;1).
3. Kąt to po prostu arcus tangens ilorazu współrzędnych, czyli dla 0101 otrzymujesz atan(y/x)=atan(1/-1)=atan(-1)=3*(M_PI/4) (135 stopni).
P-154389
piotrmaceluch
Temat założony przez niniejszego użytkownika
Odp:
» 2016-12-01 23:19:09
amplitudę obliczam jako pierwiastek z sumy kwadratów.
W tym przypadku sqrt(-3^2 + -3^2)=sqrt(18)=4.24 :P

Bardzo dziękuję za odpowiedź :)
P-154390
jankowalski25
» 2016-12-01 23:29:38
sqrt(-3^2 + -3^2)
Dlaczego (-3)? Przecież punkt 0010 ma współrzędne (-2;-2). I dlaczego punkt 0101 ma amplitudę równą 1, a nie sqrt(2)?
P-154391
piotrmaceluch
Temat założony przez niniejszego użytkownika
» 2016-12-01 23:38:25
Punkty na konstelacji rozłożone są co 2, czyli  -3 -1  1  3 dzięki temu są rozłożone równomiernie.

Nie potrafię podejść konceptualnie do tego układu współrzędnych oraz do tego 'prostego wzoru'.
Proszę o naprowadzenie :)

O ile za same amplitudy i fazy odpowiedzialna będzie biblioteka complex, to nie potrafię napisać funkcji, która w zależności od ciągu bitów, przyjęłaby odpowiednie współrzędne.
P-154392
jankowalski25
» 2016-12-01 23:45:36
Dla czterech bitów pierwsze dwa oznaczają współrzędną x, a kolejne dwa współrzędną y. Korzystając z kodu Graya:
x            y
00 0 -2 -3   00 0  2  3
01 1 -1 -1   01 1  1  1
---środek układu współrzędnych---
11 2  1  1   11 2 -1 -1
10 3  2  3   10 3 -2 -3
Dla ośmiu bitów wzór jest lepiej widoczny:
x                y
0000  0 -8 -15   0000  0  8  15
0001  1 -7 -13   0001  1  7  13
0011  2 -6 -11   0011  2  6  11
0010  3 -5  -9   0010  3  5   9
0110  4 -4  -7   0110  4  4   7
0111  5 -3  -5   0111  5  3   5
0101  6 -2  -3   0101  6  2   3
0100  7 -1  -1   0100  7  1   1
---środek układu współrzędnych---
1100  8  1   1   1100  8 -1  -1
1101  9  2   3   1101  9 -2  -3
1111 10  3   5   1111 10 -3  -5
1110 11  4   7   1110 11 -4  -7
1010 12  5   9   1010 12 -5  -9
1011 13  6  11   1011 13 -6 -11
1001 14  7  13   1001 14 -7 -13
1000 15  8  15   1000 15 -8 -15
A stąd już blisko do wzoru na 2*n bitów.
P-154393
piotrmaceluch
Temat założony przez niniejszego użytkownika
Odp:
» 2016-12-02 00:36:00
Bardzo dziękuję za odpowiedź, a zarazem rozwiązanie mojego problemu :)
P-154394
« 1 »
  Strona 1 z 1