Доброго времени суток!
Процесс кодирования WSPR хорошо описан радиолюбителем Andy Talbot G4JNT,
ссылка на оригинал документа.
Моя реализация данного процесса на Delphi, во вложении. Этот же алгоритм и используется в маяке, я не стал МК маячка нагружать процессом кодирования WSPR передачи, в память маячка просто записывается уже закодированная последовательность WSPR передачи.
Если начать с простого, то для процесса кодирования WSPR передачи придерживаемся заявленными автором протокола правилами:
1. Позывной должен состоять из максимум шести символов и может содержать буквенные символы A-Z, цифры 0-9.
2. Четырех значный QTH локатор - например - NO66.
3. Выходную мощность в dBm - 0-60.
Первым делом переводим все символы в верхний регистр, т.е. из "a" в "A" и так далее...
Выполняем кодирование (бит- упаковку) позывного - кодирование позывного в N
n1 := ch1;
n2 := n1*36+ch2;
n3 := n2*10+ch3;
n4 := 27*n3+(ch4-10);
n5 := 27*n4+(ch5-10);
n6 := 27*n5+(ch6-10);}
если до цифры в позывном 1 символ то n1 = 36 иначе n1 = порядковый номер символа.
Выполняем кодирование QTH локатора в m1
m1 = (179-10*[loc1]-[loc3])*180+10*[loc2]+[loc4]
loc1 и loc2 порядковый номер символа из массива QTH_Sym
loc3 и loc4 непосредственно указанная цифра
Выполняем кодирование уровня выходной мощности в M
M = m1 * 128 + [PwrValue] + 64
где PwrValue значение уровня выходной мощности в dBm.
Выполняем бит упаковку N и M в массив Bit_Packed.
Выполняем сверточное кодирование (Convolutional Encoding)
WSPR сообщения для K=32, r=1/2 кода
бит упакованные, N & M = 259047992 & 2896997 = $F70C238B0D1940
Выполняем чередование (Interleaving).
В данном процессе мы получаем следующую картину:
{кодированное WSPR сообщение "K1ABC FN42 37" в бит последовательности для 4-FSK
Source-encoded message (50 bits, hex): F70C238B0D1940
Data symbols:
1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 0
1 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 1 1 0
1 1 0 1 1 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 1 0 0 1
1 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0
1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1
1 1 1 1 1 0 0 1 0 1 1 1
Sync symbols:
1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 1
1 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1
1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1
0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0
1 0 1 1 0 0 0 1 1 0 0 0
Channel symbols:
3 3 0 0 2 0 0 0 1 0 2 0 1 3 1 2 2 2 1 0 0 3 2 3 1 3 3 2 2 0
2 0 0 0 3 2 0 1 2 3 2 2 0 0 2 2 3 2 1 1 0 2 3 3 2 1 0 2 2 1
3 2 1 2 2 2 0 3 3 0 3 0 3 0 1 2 1 0 2 1 2 0 3 2 1 3 2 0 0 3
3 2 3 0 3 2 2 0 3 0 2 0 2 0 1 0 2 3 0 2 1 1 1 2 3 3 0 2 3 1
2 1 2 2 2 1 3 3 2 0 0 0 0 1 0 3 2 0 1 3 2 2 2 2 2 0 2 3 3 2
3 2 3 3 2 0 0 3 1 2 2 2 }
Как выше писал, для модуляции нас интересует последний блок цифр от 0 до 3 (Channel symbols), это и есть последовательность перехода частоты манипуляции.
Если будут вопросы, постараюсь ответить!
73!