Комментарии 32
Для передачи цифры из простых оказалась самой надежной CW + кодирование Хемминга.
Если посмотреть стандарт LTE (4G), то он занимает около 10 000 страниц.
В случае передачи по воздуху работает принцип Неуловимого Джо — готовых протоколов передачи нет, т.к. применимость в общем-то отсутствует.
Но в качестве головоломки и развлечения, почему бы и не поэкспериментировать, тема вполне интересная.
сигнал проигрывается на ПК, и записывается смартфоном в другом конце квартирыМногочисленные переотражения в квартире и относительно большая скорость передачи — большие потери как результат.
Еще может влиять то, что записываете на смартфон, в нем могут быть различные алгоритмы обработки звука которые мешают. Попробуйте на комьютер необработанный сигнал записать.
При использовании фазовой модуляции можно формировать прямоугольный сигнал, высшие гармоники срезаются естественным образом. Проще писать демодулятор — детектор фазы (если потребуется переносить проект на микроконтроллер, например).
Вот пример с детектора фазы. Приемник генерирует свою опорную частоту и старается подстроить под принятый сигнал, передатчик меняет фазу на +-120 градусов (а приемник старается обеспечивать максимальную корреляцию входного и внутреннего сигнала). Из бонусов троичное кодирование, нулевое изменение +1 и -1. Можно передавать чуть более 1 бита за один раз. На картинке отклонение фазы на каждый отсчет квантования по времени. При изменении фазы входного сигнала внутренний генератор начинает подстраивать фазу на +-0.004 радиана.
Около 100 строк на Питоне, достаточно просто. Из математики поиск корреляции перемножением амплитуды сигналов. Хотя тут нужно еще нормализацию входного сигнала продумать, чтобы его амплитуда не влияла.
Как итог эксперимента отмечу, что передавать данные через воздух не сложно. Сложности начинаются при передачи данных на большой скорости или слабом соотношении сигнал/шум, для декодирования требуется уже более сложная обработка сигнала.
Вот эксперименты с частотной модуляцией, интервал 10 мс
интервал 28 мс
интервал 77 мс
При медленной передачи частоты видны «невооруженным глазом» на спектрограмме, при высокой скорости передачи всё сливается в кашу. И видно завал аудиотракта свыше 3300 Гц, многие устройства считают что передавать звуки на такой частоте не нужно и режут спектр ))
Из программ использовал Питон и Sound Forge (любой аудиоредактор что может спектрограммы строить).
Затухание сигнала, начатое на 3.3 кГц, где-то выше по частоте может и прекратиться.
Чтобы проверить возможности канала (источник+среда+приёмник), можно сделать запись тестового сигнала и посмотреть на его спектрограмму.
Вот для примера спектры моего тестового сигнала:
Если кому тоже интересно попробовать: cloud.mail.ru/public/2dYZ/oKVSi9ea6
Помимо типа модуляции, на качество приёма влияет выбор несущей частоты, битрейта, громкости, фильтров. Даже от положения динамика и микрофона многое зависит.
Качество оборудования тоже важно. Если микрофон плохой, то для его успешного использования придётся хорошо постараться, настраивая алгоритмы обработки.
Как раз задачу принять и обработать сигнал с плохим оборудованием я как-то себе поставил. Относительно надёжно удалось принять сигнал на скорости 2600 бит/сек, микрофон от наушников находился на расстоянии нескольких сантиметров.
Если увеличивать расстояние, то, конечно, нужно понижать битрейт. Вдруг кто захочет проверить мой вариант алгоритмов кодирования/декодирования — я выложил его на Github — Vort / SoundTransceiver (версия 0.0.2 в релизах, ветка develop), код написан на C#, проверял только под Windows.
По поводу тестирования — короткие сообщения — не лучший выбор. Точнее, их тоже надо проверять. Но на длинных вылазят такие проблемы, которые на коротких не заметишь. Чтобы проверить побольше разнообразных комбинаций бит, можно использовать алгоритм PRBS. Для теста передачи по звуку мне хорошо подошли варианты PRBS9 (63 байта) и PRBS11 (251 байт).
Да, это амплитудная модуляция. Только амплитуда меняется не от 0 к 1, а от -1 к 1. Умножение же на -1 эквивалентно сдвигу фазы на 180°. То есть, выходит, это и фазовая модуляция тоже.
Могу только приблизительно пояснить. Если жёстко умножать на -1 или 1, то график сигнала будет часто "разрываться", из-за чего сигнал будет занимать всю доступную полосу частот. Поэтому сигнал перед отправкой (да и после приёма тоже) фильтруют. То есть, изменение от -1 до 1 происходит плавно, проходя через ноль. Можно вместо амплитуды менять непосредственно фазу, тогда "провалов" не будет. Но, как я понимаю, это не так удобно.
Удивила картинка BPSK, у него же амплитуда должна быть постоянная?
В режиме фазовой модуляции добавляют изменение амплитуды, чтобы момент смены фаз проходил на нулевом уровне сигнала, это уменьшает помехи.
Интересно такое же, но с fm модулятором провернуть. Фм радио пока есть в каждом смартфоне
Да, в теории это очень правильно. Но когда я попробовал реализовать эквализацию в своей программе, то столкнулся с проблемой "курицы и яйца". Для создания корректирующего фильтра нужно знать хотя бы часть корректно демодулированной последовательности. Но чтобы её получить в плохих условиях приёма, нужен корректирующий фильтр. Можно, конечно, добавить к сигналу известную последовательность бит и попробовать потом найти её (к примеру, корреляцией), но тратить биты данных жалко да и корреляция может не сработать по множеству причин. Усложнять интерфейс программы (добавлением процедуры тестирования канала) или лишаться возможности одностороннего обмена данными (чтобы экземпляры программы могли договориться о фильтре без участия пользователя) тоже не хотелось. Так что желающим реализовать у себя такой подход придётся хорошенько над ним подумать.
Можно, конечно, добавить к сигналу известную последовательность бит и попробовать потом найти её (к примеру, корреляцией), но тратить биты данных жалкоКогда обычный телефонный модем начинает соединение, то он тестирует линию на эхо-сигнал (на Хабре по-моему где то была статья про описание всех шагов при соединении), так и тут можно попробовать сделать «step response»(или что то подобное) импульсной характеристики комнаты.
а) именно для таких условий она и придумана,
б) равномерно заполняет всю доступную полосу частот.
При должной фантазии, контур котика наверное можно угадать
А что вы передавали? JPG? Если так, то понятно почему изображение такое вырвиглазное. Думаю BMP должно быть на порядок лучше.
Чем развлечься в самоизоляции, или передаем данные с помощью звуковой карты