Исследуем электромагнитные поля с помощью SDR приемника и OpenCV



    SDR-приемник, даже самый дешёвый, является весьма высокочувствительным приборчиком. Если добавить к нему специальную антенну и OpenCV, то можно будет не только привычно слушать эфир, но и посмотреть на распределение электромагнитных полей в пространстве. О таком интересном применении и пойдет речь в данной статье. Внимание! Под катом много картинок и анимации!

    Вы же хотели бы увидеть электромагнитные поля? Да нет ничего проще, вот они:



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

    Последние можно отыскать в стенах научных институтов, исследовательских отделах крупных компаний и, разумеется, у военных. Обычно это отдельное помещение, экранированное от внешнего излучения клеткой Фарадея, а изнутри покрытое радиопоглощающими материалами. Ведь сосед-радиолюбитель или незаземлённая микроволновка не должны нас беспокоить при проведении подобных экспериментов. Данное помещение именуется безэховой камерой. Название конечно более соответствует студии звукозаписи, но в данном случае под «эхом» понимаются любые внутренние отражения и переотражения электромагнитных волн, мешающие исследованиям, и которые нещадно гасятся. Внутри камеры, с точки зрения антенны, вы находитесь в кромешной пустоте, где всё излучение уходит в бесконечные просторы, имитируемые радиопоглотителем и ничего не возвращается обратно.

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


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

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

    Но вернемся к сути дела. Так уж вышло, что вдалеке от источников, в пустом пространстве, электромагнитные поля выглядят довольно скучно. Примерно как-то так:



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

    Энтузиасты быстро смекнули, что для картирования полей по тому же принципу, что и в профессиональных камерах, можно построить собственный координатный сканер, или, что ещё проще, приспособить для этой цели вездесущие 3d-принтеры. Да чего уж там, даже научную статью про это написали.


    3d-принтеры, где вместо экструдера (или вместе с ним) установлены измерительные зонды-антеннки. Сверху показано как меняется в пространстве коэффициент связи двух петлевых антенн: измерительной, и той, что лежит на столе принтера (так называемый S21 параметр). Снизу пример построения распределения высокочастотного магнитного поля над платкой Arduino.

    Хоть самодельные сканеры и не находятся в электромагнито-стерильных условиях безэховых камер, они все еще могут выдавать интересные результаты. И если в первом примере с картинки выше для сбора данных используется дорогой профессиональный анализатор (научная статья, как-никак), то во втором случае обошлись недорогим SDR-приемником, что делает такие эксперименты ещё более доступными. Впрочем, мы не будем останавливаться на 3d-принтерах, они и так уже всем порядком надоели.

    Автор второго проекта с картинки, Charles Grassin, решил ещё более упростить процесс, и совсем избавиться от какой-либо координатной системы, как от лишнего громоздкого элемента, предложив отслеживать движения измерительной антенны с помощью OpenCV. Задуманная им система выглядит так:


    Схема установки для картирования электромагнитных полей при помощи SDR приемника и OpenCV.

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

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


    Схема изготовления магнитного пробника и примеры которые сделал я. Если вы взялись за картирование полей всерьез, то сделайте много антеннок разных размеров — пригодятся. Даже если не выйдет с полями, то останется хороший набор для выдувания мыльных пузырей.

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

    Чтобы продемонстрировать как пробник «чувствует» разные компоненты электромагнитного поля, я смоделировал его в CST:


    Если мы подадим синусоидальный сигнал на такую антенну, то она создаст около себя переменные электрические и магнитные поля, как показано на анимации. Эта же картинка описывает процесс приема — антенна будет наиболее чувствительна в тех же зонах, где она создаёт максимальные поля (так называемый принцип взаимности). Ещё обратите внимание на разницу фаз между компонентами поля. Энергия плавно перетекает из магнитного в электрическое и обратно.

    Даже будучи двумя проявлениями единой сущности электрическое и магнитное поля взаимодействуют с антенной по разному. Разрыв в оплётке который мы сделали сверху — не что иное, как воздушный конденсатор. Как и полагается конденсатору, он концентрирует электрическое поле в своём промежутке. Магнитное же поле, благодаря симметричности конструкции имеет максимум внутри петли. Таким образом, если мы хотим измерить последнее, достаточно располагать петлю параллельно измеряемому объекту. И это прямо то что надо для её захвата в кадре с помощью OpenCV! Итак, после того как антенна готова, добавим последний штрих. Улучшим её визуальную опознаваемость путем использования чёрной термоусадки или изоленты. Вот мое творчество:


    Для самой большой антенны (5 см в диаметре) не нашлось термоусадки нужного размера. Впрочем, я ей в итоге и не пользовался. Чёрный цвет даст отличный контраст с белым фоном, чтобы OpenCV было легче разглядеть нашу антенну.

    Далее потребуется раздобыть веб-камеру и установить её на некое подобие штатива. Если вдруг у вас не оказалось веб-камеры, то подойдет и смартфон на android с приложением DroidCam. Антенна подключается к SDR-приемнику, а он в свою очередь к компьютеру. На этом аппаратная часть готова.

    Скачиваем скрипт camera_emi_mapper.py. Для его работы потребуются библиотеки opencv и pyrtlsdr. Подробные инструкции по установке есть по обозначенной ссылке. Обратите внимание, что если вы используете Windows, то библиотеки pyrtlsdr должны быть той же разрядности, что и версия python в вашей системе. Скрипт запускается командой:

    python3 camera_emi_mapper.py -c 1 -f 100

    флаг -c позволяет выбрать камеру, если у вас их несколько, а флаг -f задаёт частоту на которой будет вестись мониторинг величины сигнала (в мегагерцах). Если всё работает, то мы увидим изображение с веб-камеры. Для первого пробного эксперимента, я поместил в кадр свой прибор OSA103, включив его в режиме генератора на 100МГц:



    Нажимаем R чтобы скрипт запомнил фоновое изображение, после чего вносим петлю в зону сканирования. Далее с помощью клавиши S можно выбрать нашу антенну вот таким вот образом:



    После подтверждения выбора клавишей Enter сразу начнется захват данных с камеры и SDR-приемника. Ну, и как водится, с первого раза все идёт не так:



    Для понимания, что же видит OpenCV и почему захват не проходит как надо, я раскомментировал следующие строки скрипта:

    # debug only
    #cv2.imshow("Thresh", thresh)
    #cv2.imshow("Frame Delta", frameDelta)

    Они открывают два дополнительных окна, где можно увидеть как хорошо антенна контрастирует с фоновым изображением. Регулируется же этот контраст значением в thresh:

        	
    thresh = cv2.threshold(frameDelta, 50, 255, cv2.THRESH_BINARY)[1]
    

    В оригинале было 15, я увеличил это значение до 50, и антенна стала уверенно захватываться. Это число нужно подбирать в зависимости от освещения в кадре. Заодно я поэкспериментировал с яркостью антенны, так как черная иногда путалась с крупным квадратом ПЛИС. После этих коррекций всё стало работать как часы:


    По завершению сканирования нужно нажать Q и скрипт построит распределение поля. В данном случае результат получился вот таким:


    Честно сказать — мало что понятно, всё оказалось размыто и с какими-то разводами. Не то чтобы я ждал супер результата, но хотелось бы увидеть чего-то более конкретного, например какие цепи в приборе участвуют в генерации. Всё-таки картирование электромагнитных полей должно давать ответы на вопросы а не создавать новые. Я снова заглянул в код и увидел, что картина поля сильно размывается при построении. Я уменьшил этот эффект, поменяв значение sigma с 7 на 2:

    
    blurred = gaussian_with_nan(powermap, sigma=2)
    

    Также, я заменил объект измерения. Для проверки метода нужна какая-нибудь более простая штука в качестве подопытного, и прибор со сложной внутренней структурой для этого не годится. Причём распределение радиочастотного магнитного поля у нового объекта должно быть заранее известно, чтобы было понятно правильно ли показывает поля скрипт или нет. Под этот критерий отлично подходит та же самая магнитная петля. Как мы видели ранее, в петле магнитное поле сосредоточено внутри её контура. А значит при сканировании мы и должны это увидеть. Я спаял из медной фольги и конденсатора простенький квадратный резонансный контур такого вида:


    Резонансный контур и теоретическое представление того, как ведут себя в нём высокочастотные токи. В каждой из сторон квадрата токи создают магнитные поля в соответствии с правилом правой руки, а суммарно они дают вклад в общее магнитное поле в центре. И да, переменный ток течет прямо сквозь конденсатор.

    У вас может возникнуть вопрос — каким это образом мы можем увидеть поле, если здесь даже нет никакого источника! А все дело в том, что нас окружает белый шум (то самое «шшшш» которое мы слышим когда не настроены на любимую станцию), и в его спектре уже есть практически любые нужные частоты. Если мы поднесем измерительную антенну близко к резонансному контуру, она станет более восприимчивой к шуму на резонансной частоте этого самого контура. SDR-приемник такой чувствительный, что с его помощью можно измерять поля даже у пассивных объектов! Попробуем, что же получается:



    Я старался действовать очень аккуратно, но всё равно в процессе немного сместил лист на котором приклеен контур. Впрочем результат вышел неплохой. Водить нашим пробником можно и гораздо быстрее. Как я понял, скорость обработки данных зависит только от производительности компьютера ну и тремора ваших рук. Во всяком случае, видеокарта моего ноута знатно напрягалась в процессе испытаний. Да, и ещё я поменял цветовую карту на более приятную для глаз plasma:



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



    По аналогии с примером выше, метод дает хорошее разрешение по направлению движения антенны. Но с каждым изменением этого направления в данные закрадывается ошибка в виде смещения картины поля. Я обвёл тот же самый контур, но на этот раз по диагонали, что ещё раз продемонстрировало сей недостаток. Кстати, оба сканирования проводились на частоте 87 МГц.



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



    Всё просто — если одно направление, то и нет ошибок. Конечно пока это ещё сильнее ограничивает область возможного применения, но зато мы будем уверены что наблюдаемые поля более-менее соответствуют действительности. Теперь, будучи осведомленными о том как правильно измерять, можно попробовать отсканировать ещё что-нибудь. Например вы знали что резонансный контур, вроде уже показанного, можно сделать вообще без проводников? Как я уже утверждал, высокочастотный ток течет сквозь конденсатор, а значит можно собрать резонансный контур используя только его и ничего больше. Мысленно увеличим конденсатор во много раз и получаем кусочек керамики, который также локализует магнитное поле около себя (спасибо коллегам из ИТМО за предоставленный образец). Частота сканирования 254 МГц.



    Стоит упомянуть ещё один недостаток метода — расстояние от объекта до антенны должно быть в идеале одинаковое, иначе наша картина полей будет уже не в плоскости, а значит будет искажена. Теоретически, думаю это можно также исправить при помощи OpenCV, отслеживая изменение размеров антенны в кадре.

    Для финальной демонстрации я собрал вот такую штуку посложнее:



    Это многоступенчатый фильтр низких частот, ещё это можно назвать линией передачи, или даже метаматериалом (с очень большой натяжкой). Принципиальная схема выглядит вот так:



    Так как в составе этой конструкции множество резонансных элементов, то и резонансных частот у нее тоже много (измерено прибором из первого эксперимента). Каждый минимум графика это резонанс в спектре:



    Такие резонансы называются собственными модами. И для каждой из них характерна своя уникальная картина полей. Но тем не менее, все они связаны определенной закономерностью, а именно количеством волн укладывающихся в конструкцию, что отлично видно при сканировании:



    Посчитав количество пиков поля можно точно назвать номер моды. Также это отличная иллюстрация того как электромагнитные поля уменьшают свою скорость внутри материалов. Ведь меньше скорость волны — больше пиков поля укладывается на картинке. На мой взгляд прекрасное наглядное пособие.

    Как видим, идея скрестить SDR и OpenCV оказалась весьма неплоха. И что самое главное, этот союз вносит творческую нотку в скучный и монотонный процесс измерений. Думаю в перспективе он может сделать изучение электромагнитных полей более увлекательным занятием, а также стать хорошим подспорьем для домашних лабораторий.
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

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

      +2
      Годно, спасибо, интересно читать =)
        +1
        Да, классный материал!
          +1
          Вещь! Пора разрабатывать пробник для измерения поля на частотах 5G.
          Смещение измеряемого поля при смене направления движения пробника напоминают также печать на струйном принтере с большим люфтом.
          Что если попробовать передвигать пробник по спирали? Ошибка будет, но, возможно, размажется более равномерно по площади.
            0
            Да, надо бы попробовать. Но когда водишь антеннкой чисто рефлекторно хочется ею двигать как кистью. Видимо для другого алгоритма движения надо будет потренироваться.
              0

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

            +3

            Волшебная палочка: помахал и сразу стало видно все скрытое...

              0
              Кстати, огнище же будет, если это совместить с VR, и нормальный трекинг антенны сделать, с 6 координатами (линейное расположение и наклоны вокруг осей).
              +6
              Может проще было поставить пару контрастных меток на пробник, чтобы он увереннее захватывался?
                0
                Да, это может улучшить захват. Но у меня были проблемы скорее с производительностью — если двигать слишком уж быстро, то скрипт просто не успевал обрабатывать кадры, хотя захватывал позицию нормально.
                  +4
                  пару контрастных меток на пробник, чтобы он увереннее захватывался

                  метки хватит и одной. типа такой: docs.opencv.org/trunk/marker23.png
                  плюс тогда можно будет так же через OpenCV получать ориентацию пробника в 3D: docs.opencv.org/trunk/d5/dae/tutorial_aruco_detection.html
                  +1

                  Можно ли поменять картинки такого качества в практических задачах?
                  И ещё, чем вызвано такое искажение картинки при смене направления перемещения? Погрешность определения положения? Задержка между сьемом показаний поля и определением положения антенны?

                    +2
                    Конечно о точных измерениях здесь речи не идёт, но для такого простого и быстрого метода картинка вполне хороша. Думаю для демонстраций или лабораторных вполне годится.

                    Проблема искажений связана с тем, что антенна имеет определенные геометрические размеры, скрипт же упрощает её до квадратной зоны (она выделена красным на анимации с OpenCV). При горизонтальном движении этого квадрата с каждым его смещением величина поля в этом квадрате постоянно перезаписывается, и по сути если движение строго горизонтально, то с каждым шагом обновляется только одна линия пикселей, соответствующая стороне квадрата противоположной движению. Как только мы меняем направление на противоположное, запись идет уже с обратной стороны этого квадрата и получается сдвиг на величину антенны. Если просканировать всю картинку только в одну сторону, то сдвига не будет. Еще думаю в смещении может играть роль разница в скорости движения. Задержек между съемом показаний поля не замечал, скрипт довольно бодро работает, даже на моем стареньком ноутбуке.

                      0

                      Еще высота над источником влияет. Поле обычно затухает как квадрат расстояния, поэтому от колебания рук может набегать заметная ошибка.

                        0
                        Кажется, тут можно сильно всё улучшить, если использовать среднее арифметическое от всех измерений, в которых антенна накрывает заданный пиксель. Тогда должны уйти все погрешности, связанные с направлением движения, и границы должны стать более плавными.
                      0
                      Чорт, такой пост мечтал сделать я) но я отстал от вас на много лет)
                        0
                        Да будет вам, мы никуда не гонимся чтобы отставать. Сделайте ещё какой-нибудь.
                        –2
                        Идея для стартапа: сделать очки, которые показывают разные частоты и поля: хочешь смотришь на магнитное поле, хочешь, как в коменте выше — распределение 5G ;). А то тепловизоры, да тепловизоры =)
                          +2
                          У вас картинка смещается из-за временного лага между сигналами с sdr и web-камеры.
                          Когда они будут синхронизированы, то смещений не будет.
                            +1

                            Зашёл, чтобы написать этот комментарий! Хотя возможно проблема ещё и в том, что обсчёт кадра занимает некоторое время. И если мы берём данные с антенны на момент окончания обсчёта картинки, то эти данные будут уже для другого расположения антенны.
                            Имхо, надо так: во-первых, забирать данные с радио и с камеры по возможности одновременно; а во-вторых, добавить регулируемый параметр delta, который будет указывать ожидаемый лаг между видео и радио. Соответственно, "опережающий" источник (скорее всего радио) надо будет буферизовать на соответствующее число кадров.

                              +1
                              Думаю вы, и автор комментария выше правы, нужно добавить в код возможность поправки временного сдвига. Только этот сдвиг может плавать в зависимости от скорости перемещения антенны. Надо это тоже как-то учесть.
                            0
                            По заголовку решил что речь пойдет о скрининге wi-fi сетей на предмет уязвимостей *facepalm*
                              +2

                              А можно провести такой же опыт на монолитной стене с проводкой? И выложить скрин.

                                0
                                Была такая идея, собственно самую большую петлю я сделал именно для такого эксперимента. Но в этой статье я работал с высокими частотами, начиная от 25 МГц (меньше мой SDR приёмник без переделки не ловит), в то время как для поисков проводки скорее подойдет сигнал с частотой в десятки кГц, как в профессиональных трассоискателях. Низкие частоты нужны для исключения всяких антенных эффектов, чтобы точно локализовать кабели, а не отсветы от наведенных в арматуре токов и полу-петель от поворачивающих проводов. Я не стал мешать всё в кучу, но теоретически нет никаких проблем сделать это.
                                +1
                                Теперь это нужно водрузить на коптер. и полетать возле направленных LTE-антен
                                  +1
                                    0

                                    AGM-88 своими руками — хорошая была бы статья :)
                                    В Югославии 1999 г. "в порядке эксперимента уничтожался практически каждый источник любого радиоизлучения".
                                    https://books.google.ru/books?id=H7UxHLx_Ne0C&pg=PA150&lpg=PA150


                                    А кто подскажет по ненаправленной антенне для ЭМИ-измерителей, как её сделать для детектора AD8318?
                                    "три резистивных ортогональных диполя. Именно это решение позволяет получить относительно равномерный AF в многодекадном диапазоне частот с приемлемой ошибкой изотропности. Конструктивно это такая шарообразная фигня на палочке."

                                    0

                                    А можно ли вместо "механической" развертки сделать электронную с помощью антенной решетки?

                                      0
                                      Да, вполне возможно. Но массив антенн будет своим присутствием искажать измеряемое поле сильнее, чем одна маленькая антенна, это стоит принять во внимание.

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

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