Чем развлечься в самоизоляции, или передаем данные с помощью звуковой карты

    Привет Хабр.

    После недавней публикации про передачу OFDM, стало интересно проверить, каким способом эффективнее всего передавать данные по воздуху. Мы попробуем разные виды модуляции, и посмотрим какие из них лучше подойдут для передачи данных из одного конца квартиры или офиса в другой. Для тестов будет достаточно ноутбука, смартфона и программы MultiPSK.



    Для тех кому интересно как это работает, продолжение под катом.

    Для тестов мы воспользуемся программой MultiPSK, которая удобна тем, что поддерживает огромное количество разных стандартов связи, как любительских (они доступны как на прием, так и на передачу), так и профессиональных (доступен только прием). Разумеется, чтобы не делать статью гигантской, я выберу лишь наиболее популярные виды модуляции, и мы посмотрим что из этого получится. Изначально MultiPSK предназначена для радиосвязи, для чего звуковая карта должна подключаться к приемнику или передатчику, но ничего не запрещает воспроизводить сигнал прямо из колонок. Тест будет будет довольно простым — простой текст «1234567890» кодируется разными способами, сигнал проигрывается на ПК, и записывается смартфоном в другом конце квартиры. Разумеется, повторить нижеописанные опыты может любой желающий, никакого специального оборудования для этого не требуется.

    Let's get started.

    Частотная модуляция (FSK, Frequency Shift Keying)


    Как нетрудно догадаться из названия, суть модуляции заключается в изменении частоты сигнала. Простейший способ, доступный в MultiPSK, это RTTY. В данном случае мы передаем данные с помощью переключения между двумя частотами с определенной скоростью. На спектре это видно весьма наглядно. Посмотрим, что происходит с сигналом при его передаче по воздуху. Сверху исходный сигнал, снизу принятый:



    Помимо очевидного затухания, есть более неочевидное изменение амплитуды — сигнал стал «рваным», на выходе получилось что-то вроде биений. Интересно то, что проявляются они в моменты смены частоты, в моменты когда частота не меняется, изменения амплитуды минимальны. С чем это связано, сказать сложно.

    Кстати о спектре, он исказился, хотя в принципе, форму сигнала угадать можно:



    Посмотрим, сможет ли MultiPSK декодировать записанный звук. Увы, нет, на выходе лишь «мусор». Разные попытки нормализации и фильтрации к успеху также не привели:



    Следующий сигнал, который интересно попробовать — MFSK, частотная модуляция, в которой количество частот больше 2х. Картинка «до» и «после» передачи примерно похожа на предыдущий результат.



    Мы также видим биения амплитуды, возникающие вероятно, в процессе переотражения звука. Но есть заметный плюс — при большем количестве частот, декодирование сигнала происходит гораздо увереннее. За исключением «мусора» в паузе между сигналами, сами данные принимаются без ошибок.



    Возможно, это также связано со скоростью передачи или другим алгоритмом декодирования, но результат довольно-таки интересен.

    Фазовая модуляция (PSK, Phase Shift Keying)


    Следующий вид модуляции — фазовая, при которой передается синусоидальный сигнал, а информация кодируется изменением фазы.



    Сигнал BPSK «до» и «после» передачи:



    Результат распознавания: определилось где-то 20-40% символов, из строки 1234567890, как можно видеть, можно различить 3, 4, 7 и 9.



    Спектр не показан, т.к. для фазовой модуляции BPSK он представляет собой практически прямую линию.

    Общая идея, я думаю, понятна, и более сложные виды сигналов рассматривать смысла нет — понятно что устойчивого декодирования не будет. Однако, чисто для «спортивного интереса», рассмотрим аналоговый сигнал.

    SSTV (Slow Scan Television)


    Этот режим по своей сути напоминает факс, и изменение частоты здесь кодирует яркость или цвет картинки во времени. Интересно посмотреть, насколько исказится изображение после передачи, и останется ли оно читабельным.

    Сигнал «до» и «после»:



    Картинка с котиком, и попытка её приема:



    При должной фантазии, контур котика наверное можно угадать. Хотя если передавать что-нибудь попроще, типа «черного квадрата», наверное распознать изображение будет легче. Кстати, в этом один из плюсов аналоговой передачи данных перед цифровой — там где «цифра» уже перестанет работать, в аналоге, среди шумов, человеческий глаз или ухо вполне может уловить полезный сигнал.

    Дополнение: частотная и временная характеристики


    Кстати об аналоговом сигнале, как подсказали в комментариях, проверить амплитудно-частотную характеристику «канала передачи» можно, если воспроизвести белый шум и изменяющийся по высоте тон. Такой сигнал несложно сгенерировать в любом аудио-редакторе. Для теста файл был проигран в одном конце квартиры, а запись сделана в другом. Результат довольно интересен, как интересно и то, что высокие частоты не слышны вообще (в моем случае граница где-то 14КГц), а передача данных на них в принципе еще возможна:



    И наконец, не менее интересный результат получается, если сгенерировать короткий звуковой импульс:



    При подаче импульса длиной 0.01с, «эхо» длится практически в 10 раз дольше. Разумеется, это также должно учитываться при выборе скорости передачи данных.

    Заключение


    Как можно видеть, передача звука по воздуху (как наверное и через воду), это не так уж просто, из-за переотражений, затуханий и прочих эффектов. Несмотря на кажущуюся «несерьезность» задачи, надежно передать данные даже на 10 метров не так-то просто из-за искажений сигнала. Метод частотной модуляции MFSK оказался самым стабильным. И похоже, аналогичные опыты проводил не только я, статья о протоколе активации Яндекс-станции говорит о том, что в ней используется такой же способ передачи данных. Ну а в целом, чем проще модуляция и меньше скорость, тем больше шансов, что данные будут приняты без ошибок.

    Желающие могут дальше поэскпериментировать самостоятельно, программу MultiPSK легко найти в интернете, количество поддерживаемых ею стандартов передачи довольно велико.

    Всем удачных экспериментов.

    Средняя зарплата в IT

    110 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 8 431 анкеты, за 2-ое пол. 2020 года Узнать свою зарплату
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 32

      +2
      В точности повторены мои эксперименты и такие же результаты…
      Для передачи цифры из простых оказалась самой надежной CW + кодирование Хемминга.
        0
        Да, я хотел еще дописать про модуляцию OOK, по сути тот же CW, но в MultiPSK её нет, а делать через GNU Radio не хотелось.
        –9
        Передача данных по воздуху осуществляется немного сложнее. Если посмотреть стандарт LTE (4G), то он занимает около 10 000 страниц. Если вы действительно хотите что-то передать по какой-то среде, придётся изучить множество теорий и технологий.
          +7
          А, вот оно что! Спасибо, не знал. Думал, это совсем просто.
            –3
            Ну, это немного сложнее, чем тыкать кнопочки в рандомной программе.
            +1
            Если посмотреть стандарт LTE (4G), то он занимает около 10 000 страниц.

            В случае передачи по воздуху работает принцип Неуловимого Джо — готовых протоколов передачи нет, т.к. применимость в общем-то отсутствует.

            Но в качестве головоломки и развлечения, почему бы и не поэкспериментировать, тема вполне интересная.
              +1
              По поводу применимости, в интернете обнаруживается масса различных проектов по передаче данных с помощью ультразвука.
              В том числе и протоколы связи, например SoniTalk.
              Возможно эти протоколы применимы не только для ультразвука.
            0
            Тут что-то похожее: 3dnews.ru/1009390
            image
              +1
              сигнал проигрывается на ПК, и записывается смартфоном в другом конце квартиры
              Многочисленные переотражения в квартире и относительно большая скорость передачи — большие потери как результат.
                0
                Так в этом и весь интерес, посмотреть как будет проходить сигнал в таких условиях.
                  0
                  Всё же передача по воздуху, вероятно, проще, чем в воде, можно ведь исключать многолучёвость и ослаблять фоновый шум за счёт использования направленных микрофонов.
                    +1
                    Уменшите битрейт передачи — ошибки уменьшатся.
                    Еще может влиять то, что записываете на смартфон, в нем могут быть различные алгоритмы обработки звука которые мешают. Попробуйте на комьютер необработанный сигнал записать.
                      0
                      Я записываю в WAV, естественно.
                  +3
                  Я тоже экспериментировал с передачей данных по воздуху. Предел в моих условиях 1 бит за 10 мс, лучший результат получился с фазовой модуляцией (а самый «мелодичный» метод частотная модуляция, особенно если частоты подобрать на основе нот музыкальных).
                  При использовании фазовой модуляции можно формировать прямоугольный сигнал, высшие гармоники срезаются естественным образом. Проще писать демодулятор — детектор фазы (если потребуется переносить проект на микроконтроллер, например).
                  Вот пример с детектора фазы. Приемник генерирует свою опорную частоту и старается подстроить под принятый сигнал, передатчик меняет фазу на +-120 градусов (а приемник старается обеспечивать максимальную корреляцию входного и внутреннего сигнала). Из бонусов троичное кодирование, нулевое изменение +1 и -1. Можно передавать чуть более 1 бита за один раз. На картинке отклонение фазы на каждый отсчет квантования по времени. При изменении фазы входного сигнала внутренний генератор начинает подстраивать фазу на +-0.004 радиана.
                  image
                  Около 100 строк на Питоне, достаточно просто. Из математики поиск корреляции перемножением амплитуды сигналов. Хотя тут нужно еще нормализацию входного сигнала продумать, чтобы его амплитуда не влияла.
                  Как итог эксперимента отмечу, что передавать данные через воздух не сложно. Сложности начинаются при передачи данных на большой скорости или слабом соотношении сигнал/шум, для декодирования требуется уже более сложная обработка сигнала.
                  Вот эксперименты с частотной модуляцией, интервал 10 мс
                  image
                  интервал 28 мс
                  image
                  интервал 77 мс
                  image
                  При медленной передачи частоты видны «невооруженным глазом» на спектрограмме, при высокой скорости передачи всё сливается в кашу. И видно завал аудиотракта свыше 3300 Гц, многие устройства считают что передавать звуки на такой частоте не нужно и режут спектр ))
                  Из программ использовал Питон и Sound Forge (любой аудиоредактор что может спектрограммы строить).
                    +2

                    Затухание сигнала, начатое на 3.3 кГц, где-то выше по частоте может и прекратиться.
                    Чтобы проверить возможности канала (источник+среда+приёмник), можно сделать запись тестового сигнала и посмотреть на его спектрограмму.
                    Вот для примера спектры моего тестового сигнала:


                    Тестовый сигнал, исходник


                    Тестовый сигнал, приём #1


                    Тестовый сигнал, приём #2

                      0
                      Интересно. А можете сам тестовый сигнал в WAV скинуть?
                  +4
                  Передача данных с помощью звука — настолько глубокая задача, что заниматься ей можно практически бесконечно.
                  Помимо типа модуляции, на качество приёма влияет выбор несущей частоты, битрейта, громкости, фильтров. Даже от положения динамика и микрофона многое зависит.
                  Качество оборудования тоже важно. Если микрофон плохой, то для его успешного использования придётся хорошо постараться, настраивая алгоритмы обработки.
                  Как раз задачу принять и обработать сигнал с плохим оборудованием я как-то себе поставил. Относительно надёжно удалось принять сигнал на скорости 2600 бит/сек, микрофон от наушников находился на расстоянии нескольких сантиметров.
                  Если увеличивать расстояние, то, конечно, нужно понижать битрейт. Вдруг кто захочет проверить мой вариант алгоритмов кодирования/декодирования — я выложил его на Github — Vort / SoundTransceiver (версия 0.0.2 в релизах, ветка develop), код написан на C#, проверял только под Windows.
                  По поводу тестирования — короткие сообщения — не лучший выбор. Точнее, их тоже надо проверять. Но на длинных вылазят такие проблемы, которые на коротких не заметишь. Чтобы проверить побольше разнообразных комбинаций бит, можно использовать алгоритм PRBS. Для теста передачи по звуку мне хорошо подошли варианты PRBS9 (63 байта) и PRBS11 (251 байт).
                    0
                    Удивила картинка BPSK, у него же амплитуда должна быть постоянная? Сейчас больше похожа на амплитудную модуляцию.
                      +1

                      Да, это амплитудная модуляция. Только амплитуда меняется не от 0 к 1, а от -1 к 1. Умножение же на -1 эквивалентно сдвигу фазы на 180°. То есть, выходит, это и фазовая модуляция тоже.

                        0
                        Умножение на +1 и -1 не меняет максимальной амплитуды, а на скриншоте огибающая для несущей частоты выглядит как синусоида. Я не могу понять почему так.
                          +1

                          Могу только приблизительно пояснить. Если жёстко умножать на -1 или 1, то график сигнала будет часто "разрываться", из-за чего сигнал будет занимать всю доступную полосу частот. Поэтому сигнал перед отправкой (да и после приёма тоже) фильтруют. То есть, изменение от -1 до 1 происходит плавно, проходя через ноль. Можно вместо амплитуды менять непосредственно фазу, тогда "провалов" не будет. Но, как я понимаю, это не так удобно.

                            0
                            Да, если просто делать разрыв фазы без изменения амплитуды, получим довольно сильные выбросы на спектре, что и мешает другим сигналам, и зря расходует мощность передатчика.

                            Картинка

                              0
                              Аналоговый тракт передатчика сам вырежет лишнюю часть спектра. Если передатчик узкополосный, быстрые изменения фазы вообще будут проигнорированы, фаза не успеет изменится.
                              Если передатчик не ограничивает полосу, тогда да, будет помеха на соседних каналах.
                        0
                        Удивила картинка BPSK, у него же амплитуда должна быть постоянная?

                        В режиме фазовой модуляции добавляют изменение амплитуды, чтобы момент смены фаз проходил на нулевом уровне сигнала, это уменьшает помехи.
                        0

                        Интересно такое же, но с fm модулятором провернуть. Фм радио пока есть в каждом смартфоне

                          0
                          Здесь основная проблема в том, что на входе мы получаем не просто боле-менее равномерно зашумленный сигнал, а свёртку сигнала с импульсной характеристикой помещения длительностью в несколько секунд и сильно неравномерным спектром. Поэтому первоочередная задача — это деконволюция сигнала, а только потом уже его демодуляция.
                            0

                            Да, в теории это очень правильно. Но когда я попробовал реализовать эквализацию в своей программе, то столкнулся с проблемой "курицы и яйца". Для создания корректирующего фильтра нужно знать хотя бы часть корректно демодулированной последовательности. Но чтобы её получить в плохих условиях приёма, нужен корректирующий фильтр. Можно, конечно, добавить к сигналу известную последовательность бит и попробовать потом найти её (к примеру, корреляцией), но тратить биты данных жалко да и корреляция может не сработать по множеству причин. Усложнять интерфейс программы (добавлением процедуры тестирования канала) или лишаться возможности одностороннего обмена данными (чтобы экземпляры программы могли договориться о фильтре без участия пользователя) тоже не хотелось. Так что желающим реализовать у себя такой подход придётся хорошенько над ним подумать.

                              +1
                              Можно, конечно, добавить к сигналу известную последовательность бит и попробовать потом найти её (к примеру, корреляцией), но тратить биты данных жалко
                              Когда обычный телефонный модем начинает соединение, то он тестирует линию на эхо-сигнал (на Хабре по-моему где то была статья про описание всех шагов при соединении), так и тут можно попробовать сделать «step response»(или что то подобное) импульсной характеристики комнаты.
                            0
                            Есть ещё ЛЧМ-модуляция, о которой в статье я не увидел упоминания. Её преимущество в том, что
                            а) именно для таких условий она и придумана,
                            б) равномерно заполняет всю доступную полосу частот.
                              +1
                              При должной фантазии, контур котика наверное можно угадать
                              image

                              А что вы передавали? JPG? Если так, то понятно почему изображение такое вырвиглазное. Думаю BMP должно быть на порядок лучше.
                                +1
                                Нет конечно, передавался сигнал без сжатия, SSTV работает по принципу факса.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое