Mapowanie na konstelacje- modulacja 16-QAM [C++]
Ostatnio zmodyfikowano 2016-12-02 00:36
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=0ahUKEwitoeLT5NPQAhXjAsAKHfPBA5UQ_AUICCgB&biw=1303&bih=917#imgrc=OfIrq_4kFwP6fM%3ANa 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 |
|
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). |
|
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ź :) |
|
jankowalski25 |
» 2016-12-01 23:29:38 Dlaczego (-3)? Przecież punkt 0010 ma współrzędne (-2;-2). I dlaczego punkt 0101 ma amplitudę równą 1, a nie sqrt(2)? |
|
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. |
|
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. |
|
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 :) |
|
« 1 » |