Вложений: 3
Новая программа для работы PSK
Собственно, обратиться к этой теме меня сподвигли частые сообщения о том, что цифровые виды связи это дескать не более чем щелкание мышью по экрану. И так было понятно, что по сложности цифровые виды ничуть не проще аналоговых, однако возникла мысль, почему бы не провести первую связь в PSK из своей собственной программы :) В дальнейшем пришлось углубиться в теорию гораздо более значительно (некоторое неясно и до сих пор), да и программа уже вышла за рамки тестовой, и её можно представить на всеобщее обозрение.
Итак, кому интересно, вначале описание теоретических принципов, кому неинтересно, можно перейти сразу в конец к описанию софта.
Итак, Программное (де)кодирование сигналов PSK
1) Теоретические основы
PSK относится к семейству протоколов с фазовой манипуляцией - диапазон изменения фаз может принимать дискретные значения, для любительской связи лежащие в диапазоне от 2 до 4.
Например, для BPSK имеем две фазы:
f1(t) = cos(f*t)
f2(t) = cos(f*t + PI)
Более подробно написано в Википедии - http://ru.wikipedia.org/wiki/Фазовая_манипуляция
Более точно, модуляция BPSK является дифференциальной - сравнивая последующий и предыдущий сигналы, мы определяем "0" или "1" получаем на выходе.
Для преобразования сигналов в текстовую форму используется алфавит Varicode, в основе которого лежат два удачных решения - более популярным символам соответствуют более короткие коды, плюс два подряд идущих нуля означают конец символа. Длина символов не фиксирована, что теоретически позволяет расширять varicode новыми символами без потери совместимости.
Пример кодов:
1 - пробел
11 - e
101 - t
11011 - l
11011111 - x
и пр
2) Декодирование
Схема бинарного декодера приведена в аттаче. По сути она сводится к выделению фазы принятого и опорного сигнала за один период, и сравнению разности этой фазы с предыдущим сигналов.
Основная формула приведена на картинке, по её сути берется интеграл от произведения входного сигнала с опорным. Арктангенс разности двух таких ингегралов позволяет выделить фазу сигнала.
Более подробно все это описано в книге "Цифровая связь", 2003 год, изд-во "Вильямс".
В идеале один сигнал по фазе совпадает с опорным, другой отличается на 180 градусов. Если это не так, значит настройка неточная. Данные о фазах как раз и выводятся на фазовую плоскость в программе.
На практике есть одна сложность - мы не знаем точного момента начала передачи, чтобы привязаться к смене фаз. Однако в BPSK есть ещё и амплитудная модуляция - сигнал уменьшается до нуля в местах смены фаз, за счет этого приходится искать эту точку, поиском минимума или максимума сигналов за некий период.
3) Запись сигналов в Windows
Для чтения сигналов придется использовать звуковую карту, как ни удивительно :)
Программный интерфейс доступа к ней давно описан, ничего нового тут в принципе нет. Схема такова:
- открытие устройства функцией waveInOpen
- подготовка буферов функцией waveInAddBuffer
- активация записи фунцией waveInStart
После неё периодически (в зависимости от длины буфера, обычно раз в секунду) системой активируется callback-функция, в которую автоматически передается указатель на текущий записанный буфер.
Единственная сложность тут в том, что буферы приходят не синхронно с периодами PSK, так что сигнал надо накапливать в другом буфере бОльшего объема и обрабатывать по мере его наполнения.
4) Фильтрация
Все было бы проще, если б в один момент времени передавала только одна станция :) Однако на практике такого не бывает, и сигнал перед декодированием надо фильтровать полосовым фильтром.
Есть два принципиально разных способа:
- через быстрое преобразование Фурье. Поскольку БПФ дает разложение сигнала в спектр, то обнулив нужные части спектра, получаем искомый фильтр. Проблема в достаточной затратности этого метода и большом количестве вычислений.
- через КИХ/БИХ фильтры. Значительно более быстрый способ, позволяющий фильтровать сигнал с помощью полинома, зависящего от предыдущих значений сигнала. Основная сложность в предвартельном расчете коэффициентов этого самого фильтра.
Существуют разные методы подбора коэффициентов, соответствующие разным вариантам фильтров (Чеышева, Баттерворта и пр). Более подробно есть в Википедии.
Собственно, с теорией все, объединив эти 4 части в единое целое, получаем программу декодирования сигналов. Обратный процесс заметно проще, и состоит в формировании "несущей" на заданной частоте и изменением её амплитуды и фазы в соответствии с "0" или "1" в передаваемом сигнале.
Как выглядит сигнал в процессе передачи, можно видеть непосредственно в программе.