
Представьте себе кромешную темноту карстовой пещеры, куда не проникают лучи солнечного света. В таких местах обитают маленькие, но очень интересные существа — летучие мыши. В непроглядной тьме эти ночные хищники уверенно летают, огибая каждый сталактит, и ловят крошечных насекомых для пропитания. Они не видят, но «слышат» окружающий мир с точностью, которой позавидуют военные радары. Делают они это с помощью эхолокации по простому принципу: отправь звук, послушай эхо, определи расстояние по задержке, направление по углу падения эха.
Идея показалась мне достаточно интересной не только с биологической точки зрения, но и с инженерной. Природа решила задачу эхолокации довольно элегантно, и я захотел воспроизвести эту идею с применением микроконтроллера. Так родился проект — сонар на базе STM32F429, который генерирует направленный звуковой луч, захватывает его отражение от окружающих объектов и определяет их положение по задержке и углу прихода отражённого сигнала. Для создания этого сонара я использовал простые доступные компоненты: аналоговый микрофон, компьютерные колонки, звуковые усилители с AliExpress, отладочную плату с микроконтроллером и ноутбук для отображения результатов. В этой статье я расскажу о том, как устроена такая система, какие сложности возникли при реализации, и что в итоге получилось.
Когда я написал статью и засел за редактор Habr для её публикации, то с удивлением обнаружил, что тем же утром вышла статья с описанием аналогичного устройства. Однако, в ней автор использует другие идеи для создания своего сонара, так что есть возможность сравнить подходы и получившиеся устройства между собой.
Генерация направленных звуковых импульсов
Для сканирования окружающего пространства необходимо генерировать короткие звуковые импульсы на заданной частоте, направленные в пространстве под заданным углом сканирования. Изначально я думал сделать вращающийся излучатель, но очень скоро отказался от этой идеи. Несмотря на её кажущуюся простоту, поворотный излучатель потребовал бы сконструировать громоздкий механизм с сервоприводом, выдерживающим значительные нагрузки и обеспечивающим хороший контроль угла. Кроме того, необходимо формировать узконаправленный звуковой импульс. Да и летучие мыши не очень‑то вращают головой в процессе полёта.
Все эти проблемы я решил одновременно, взяв за основу идею фазированной антенной решётки (ФАР). Суть её в следующем: несколько упорядоченных излучателей посылают схожий сигнал с различными задержками по фазе. В дальней зоне ФАР эти сигналы складываются, усиливаются в заданном направлении и подавляются во всех остальных. Изменяя параметры испускаемого сигнала, расположения излучателей, фазового сдвига между излучателями, можно получить желаемую диаграмму направленности, характеризующую распространения сигнала. Подробнее о принципах работы ФАР можно почитать здесь. Итак, я решил сконструировать ФАР для звуковых волн, а в качестве акустических излучателей использовать компьютерные колонки. Их у меня было 9 штук.
Прежде всего было необходимо оценить параметры устройства, для чего я простроил диаграмму направленностей. Изначально я хотел сделать двумерный массив излучателей, который позволил бы отклонять пучок сразу в двух направлениях:
В таком случае диаграмма направленностей задаётся формулой:
где: — отношение расстояния между излучателями к длине волны. На данном этапе я не задавал их конкретные значения, а использовал отношение как параметр (в радиофизике его часто принимают равным 0.5). Результат оказался следующим:
И он меня разочаровал: для главного лепестка ширина по нулям составляет 60° — неприлично много для локатора. Изменение параметра не даёт значительного сужения лепестка. Для улучшения диаграммы направленности необходимо увеличивать число излучателей, что приводит к необходимости закупать еще десятки колонок и решать проблемы с их подключением и управлением — одним микроконтроллером обойтись было бы уже невозможно. Поэтому я решил расположить излучатели в линейный массив:
В таком случае диаграмма направленностей задаётся формулой:
Здесь ширина главного лепестка уже 10° — значительно лучше, хотя и неидеально. Для дальнейшего сужения лепестка нужно использовать больше излучателей. Я попробовал варьировать параметр и применить нормировку сигналов излучателей окном Чебышёва, но это не дало значительных улучшений (думаю, из‑за малого количества излучателей):
Применение оконной функции Чебышёва позволяет ограничить боковые лепестки заданным значением, но при этом уширяется основной лепесток. Я отказался от применения оконной функции по следующим причинам:
-
Боковые лепестки незначительны по сравнению с главным и без применения окна;
-
Уширение главного лепестка снижает разрешение радара по углу;
-
Оконная нормировка сигналов значительно увеличивает вычислительную нагрузку на микроконтроллер.
Поэтому я остановился на варианте с линейным массивом излучателей сигналов одинаковой амплитуды. Пришлось пожертвовать возможностью отклонять пучок в двух направлениях, но зато удалось сделать его гораздо более узким. Этот компромисс меня более, чем устроил, поскольку для построения двумерной карты местности достаточно изменять только азимутальный угол.
Теперь пришло время определиться с параметрами и
для сборки ФАР. Я использовал колонки Sven 120. Если устанавливать их вплотную друг к другу, то расстояние между излучателями будет соответствовать ширине корпуса колонки:
. Значение
, скорость звука
В таком случае необходимая длина акустической волныа соответствующая ей частота сигнала
При таких параметрах зона Фраунгофера для моей ФАР начинается примерно с 5 м:
Если увеличить расстояния между колонками, то потребуется снизить частоту излучаемого сигнала. Это увеличит расстояние до дальней зоны и, следовательно, уменьшит эффективную площадь покрытия радара. Поэтому я решил ставить колонки вплотную.
За генерацию аналогового сигнала и подачу его на динамики с необходимым фазовым сдвигом отвечает микроконтроллер STM32F429 на плате Discovery. Однако на нём установлено всего 2 ЦАПа, а мне нужно 9 независимых выводов сигнала на колонки. Решением стала генерация синусоиды с помощью широтно‑импульсной модуляции (ШИМ). Изменяя фактор заполнения сигнала, можно получать различные средние значения напряжения на выходе (подробнее можно почитать в Википедии или в статье). Разогнанный до 180 МГц микроконтроллер позволяет устанавливать частоту выводимого аналогового сигнала в широком диапазоне. Для этого используются периферийные таймеры микроконтроллера:
-
9 счётчиков — по событию сравнения значения переводят уровень на выходе в «0», а по событию обновления в «1». Значение в регистре сравнения (CCR) задаёт фактор заполнения ШИМ‑сигнала;
-
Контрольный таймер — по событию обновления (UIE) изменяет значения в регистрах сравнения счётчиков (CCR). Т.о. изменяется фактор заполнения ШИМ‑сигнала и, следовательно, усреднённое значение напряжения на выходе;
-
Импульсный таймер — контролирует генерацию звуковых импульсов длительностью 10 мс с частотой 4 Гц и обновление угла сканирования в диапазоне от -80° до 80° с шагом 5° (половина ширины главного лепестка антенны).
Схематично взаимодействия таймеров для генерация аналогового сигнала с помощью ШИМ изображены ниже:
Чтобы в прерывании микроконтроллера не выполнял долгие вычисления, таблица значений синусоиды для записи в регистры сравнения рассчитывается при инициализации устройства на основании частоты тактирования и частоты звукового сигнала. Все каналы вывода сигнала используют единую таблицу значений, однако у каждого свой указатель. Сдвиг указателя реализует фазовый сдвиг между излучателями, что позволяет программно задавать угол сканирования.
Программная реализация вывода аналогового моночастотного сигнала
// Update the sound wave output levels for each channel based on the current phase pointsstatic void Update_SoundWave_level(void){ TIM3 -> CCR1 = Array_SIN[(Phase_Pointer_All + Phase_Shift_Points[IDX(-4)]) % Ref_points]; TIM3 -> CCR2 = Array_SIN[(Phase_Pointer_All + Phase_Shift_Points[IDX(-3)]) % Ref_points]; TIM3 -> CCR3 = Array_SIN[(Phase_Pointer_All + Phase_Shift_Points[IDX(-2)]) % Ref_points]; TIM3 -> CCR4 = Array_SIN[(Phase_Pointer_All + Phase_Shift_Points[IDX(-1)]) % Ref_points]; TIM4 -> CCR1 = Array_SIN[(Phase_Pointer_All + Phase_Shift_Points[IDX( 0)]) % Ref_points]; TIM4 -> CCR2 = Array_SIN[(Phase_Pointer_All + Phase_Shift_Points[IDX( 1)]) % Ref_points]; TIM4 -> CCR3 = Array_SIN[(Phase_Pointer_All + Phase_Shift_Points[IDX( 2)]) % Ref_points]; TIM4 -> CCR4 = Array_SIN[(Phase_Pointer_All + Phase_Shift_Points[IDX( 3)]) % Ref_points]; TIM5 -> CCR4 = Array_SIN[(Phase_Pointer_All + Phase_Shift_Points[IDX( 4)]) % Ref_points]; Phase_Pointer_All = (Phase_Pointer_All + 1) % (Ref_points);}
Выводимый сигнал через усилители подаётся на колонки. Таким образом, я программно задаю частоту сигнала и фазовый сдвиг для каждого акустического излучателя в массиве ФАР. В результате заданная частота чётко выделяется пиком на спектральном анализаторе звука; формируется узкий сканирующий луч, который с заданным шагом изменяет своё направление.
Приём отражённого сигнала
Приём отражённого сигнала осуществляется с помощью микрофона. Сигнал с него подаётся на вход АЦП микроконтроллера, сразу после захвата значение передаётся по DMA в буфер для последующей обработки. Запуск преобразования АЦП для оцифровки сигнала микрофона синхронизируется импульсами TRGO от таймера, что задаёт частоту дискретизации. В результате в буфере микроконтроллера накапливаются значения считываемого звукового сигнала:
На этом графике изображен считываемый микрофоном сигнал от динамика с частотой звука 2500 Гц. Для записи приведённого сигнала звуковые импульсы выводились с частотой 5 Гц, длительность 100 мс. Необходимо в этом сигнале определять мощность (или амплитуду) звука на заданной частоте, отделяя её от других частот, шумов и помех.
Для решения этой задачи я выбрал алгоритм Гёрцеля. Он часто используется в тональной телефонии (DTMF) для декодирования звукового сигнала. По сути он позволяет эффективно вычислить амплитуду одной частоты, что делает его идеальным для моей задачи.
Программная реализация алгоритма Гёрцеля
// Precompute Goertzel parametersk = (uint16_t)((float)size * (float)DEFAULT_SOUND_WAVE_FREQ / (float)MICROPHONE_SAMPLING_FREQUENCY);coeff = 2.0 * cos(2.0 * M_PI * (float)k / (float)size);/** * Audiobuffer processing by Goertzel algorithm for 2500 Hz at microphone sampling frequency * @param data pointer to DMA buffer active Goertzel window */static float process_audio(volatile uint16_t *data){ float s_prev = 0.0f; float s_prev_prev = 0.0f; float s = 0.0f; for (int16_t i = 0; i < size; i++) { s = coeff * s_prev - s_prev_prev + data[i]; s_prev_prev = s_prev; s_prev = s; } float P = s_prev*s_prev - coeff*s_prev*s_prev_prev + s_prev_prev*s_prev_prev; return P;}
Преимуществами алгоритма по сравнению с преобразованием Фурье являются скорость, малый объём потребляемой памяти микроконтроллера, а также возможность поэтапной обработки сигнала без ожидания заполнения всего буфера. Результат работы алгоритма:
Алгоритм хорошо детектирует желаемую частоту, отсекая её от шума и других частот спектра. Однако именно обработка звукового сигнала накладывает на сонар ограничения для разрешения по расстоянию Хотя для работы алгоритма Гёрцеля требуется массив меньшего размера, чем для БПФ, все же необходимо набрать некоторое количество отсчётов — заполнить окно Гёрцеля. Чем больше это окно, тем точнее результат, но тем больше времени требуется для его заполнения и, следовательно, увеличивается интервал между последовательными отсчётами Гёрцеля. Это приводит к снижению разрешения по расстоянию:
Частично эта проблема решается увеличением частоты дискретизации микрофона, но при больших окнах Гёрцеля становится существенным время обработки сигнала. Золотую середину я нашёл методом подбора. В результате частоту дискретизации микрофона я установил равной 0.1 МГц, размер окна Гёрцеля — 256. Таким образом, частота получения результатов алгоритма Гёрцеля получилась 390 Гц. При таких параметрах на 1 звуковой импульс длительностью 10 мс приходится 3–4 отсчёта Гёрцеля, что вполне достаточно для уверенного определения отражённого сигнала. Разрешение по расстоянию — около 45 см — не очень‑то хорошая точность в сравнении с летучей мышью, но как сделать точнее я пока не придумал.
Тем не менее, результат есть: приёмник детектирует испускаемый антенной импульс, принимает отражённый сигнал, выделяя их на фоне шума и разрешая между собой. На графике представлен результат обработки сигнала с характерными пиками. При записи этого сигнала угол сканирования был зафиксирован, а сонар установлен перед стеной для чёткого определения отражённого сигнала.
Микрофон я установил непосредственно за ФАР. Таким образом, сонар целиком находится в начале координат.
В результате, весь алгоритм работы устройства выглядит следующим образом:
Полевые испытания
После того, как устройство было целиком собрано, нужно было проверить пределы его возможностей. Я начал тестировать сонар в полевых условиях — на парковке.
Первым делом я хотел определить максимальную дальность, на которой радар корректно определяет наличие объектов. Для этого я записал уровень шума на улице:
Он на порядок превосходил шум, детектируемый в помещении, но, в целом, колебался вокруг значения 10⁶ и не превышает 10⁷. Если принимаемый сигнал превышает это значение, исследуемый объект может быть обнаружен локатором.
Я провел серию опытов: на известном расстоянии от сонара в направлении сканирующего луча устанавливал объект (лист фанеры), записывал сигнал, выделял в нём пики, соответствующие испусканию и приёму отражённого импульса, а также время записи этих пиков. Во‑первых, из полученных данных я смог оценить реальную скорость звука и тем самым проверить программную реализацию вычислений. Получилось:
В пределах погрешности попал, однако в дальнейшем я использовал значение 340 м/с для расчёта расстояния (скорость звука в воздухе при температуре 20 °C). Во‑вторых, я получил максимальную дальность, на которой сонар определяет объекты на фоне шума:
Из графика видно, что уровень отражённого сигнала становится меньше 10⁷ при расстоянии до объекта больше 10 м. Это и есть максимальная дальность обнаружения сонара. Она сопоставима с дальностью обнаружения объектов у летучих мышей.
Хотя я так и не понял, почему возникает провал мощности на дистанции 10–15 м, эта область находится вне зоны покрытия сонара. Ещё одна странность — мощность должна зависеть от расстояния как r⁻². Но на полученном мною графике мощность спадает как r⁻³. Мое предположение для объяснения этих явлений — интерференция с волнами, отраженными от земли и стен, а также диссипация звука в воздухе. Но экспериментально я это не проверил.
Таким образом, область покрытия сонара представляет собой кольцевой сектор с радиусами 5 м и 10 м и центральным углом 160°. Разрешение по углу 5°, по расстоянию 0.45 м.
Записывая отражённые сигналы для разных углов сканирования, можно определять расстояние до объектов под этими углами:
Эти одномерные массивы данных можно перевести в двумерные для наглядного отображения объектов. Отражённые сигналы записываются между двумя последовательными импульсами и вместе с соответствующим значением угла сканирования передаются на ПК по COM‑порту. На основании полученных данных ПК строит двумерный индикатор кругового обзора (ИКО). При этом уровень сигнала задаётся цветом, время пересчитывается в расстояние до объекта, отражающего сигнал, а угол сканирования синхронно меняется на ФАР и на экране.
Я провёл испытания с целью обнаружения одиночных объектов:
В ходе испытаний выяснилось, что не все предметы определяются сонаром. Хорошо отображаются объекты, отражающие звуковой импульс в обратном направлении. В основном это плоские объекты, мало поглощающие звук: стулья с фанерой, стены, машины. Фигура человека различима, если он стоит лицом к сонару на расстоянии 5–7 м.
А вот рассеянный звук практически неотличим от шума, поэтому корректное определение рассеивающих или поглощающих звук объектов затруднительно для моего локатора. В основном это объекты с рельефной поверхностью: мотоциклы, столбы, деревья.
Ещё немного о летучих мышах
В этой главе я решил вернуться к истокам проекта и сравнить характеристики эхолокации у летучих мышей и у моего сонара. Стоит сразу сказать, что тягаться с природой — задача не из лёгких. Эволюция совершенствовала этот механизм десятки миллионов лет, поэтому летучие мыши являются чрезвычайно эффективными живыми сонарами.
Ещё немного о летучих мышах
Частота звука
Мой сонар использует сигнал частотой около 2.5 кГц. Это связано прежде всего с размерами акустической решётки и доступными динамиками. Летучие мыши «работают» в ультразвуковом диапазоне: 20–120 кГц, а некоторые виды способны излучать сигналы вплоть до 200 кГц. При таких частотах длина звуковой волны крайне мала, что позволяет им различать мелкие объекты. Летучие мыши, питающиеся насекомыми, могут различить движущегося комара.
Кроме того, сигнал летучих мышей вовсе не представляет собой одночастотную синусоиду. Существуют два основных типа эхолокационных сигналов:
-
FM‑сигналы (Frequency Modulated). За время одного импульса (несколько миллисекунд) их частота варьируется в широком диапазоне (например, 30–80 кГц), что позволяет очень точно определять расстояние до объектов;
-
CF‑сигналы (Constant Frequency). Практически моночастотные сигналы с малой шириной пика используются для определения скорости объекта с помощью эффекта Допплера.
Длительность посылаемых импульсов зависит от окружающей обстановки и поведения летучей мыши. Во время обычного полёта она составляет 2–20 мс (сопоставимо с моим сонаром — 10 мс), однако при приближении к добыче сокращается до долей миллисекунды. Одновременно резко возрастает частота повторения импульсов. Непосредственно перед атакой летучая мышь переходит в режим feeding buzz (в научной литературе термин не переводится): частота испускания импульсов достигает 150–200 Гц. Фактически животное обновляет информацию об окружающем пространстве каждые несколько миллисекунд.
Формирование звукового луча
Направленный звуковой луч у летучих мышей формируется по другому принципу, чем в моём сонаре. Звуковой сигнал формируется ртом или ноздрями, при этом формы головы, ротовой полости, хрящей и характерных кожистых наростов на мордочке выступают в роли акустических линз и зеркал.
В зависимости от ситуации, летучие мыши могут изменять ширину акустического луча: при поиске добычи луч уширяется для увеличивая области сканирования, а во время преследования сужается и концентрируется на выбранной цели.
Приём отражённого сигнала
У летучих мышей приём сигнала осуществляется с помощью антенн — огромных ушей замысловатой формы. Полученный сигнал анализируется мозгом для определения следующих параметров:
-
Время задержки эха;
-
Мощность пришедшего сигнала;
-
Спектральный состав;
-
Различия сигналов левого и правого уха;
-
Доплеровское смещение частоты.
На основе этой информации животное способно не только определить расстояние до объекта, но и оценить его скорость, размеры, форму и даже характер поверхности.
У системы приёма сигналов летучих мышей есть и мёртвое время: непосредственно перед излучением мышцы среднего уха уменьшают чувствительность слуховой системы, а затем практически мгновенно восстанавливают её.
Пределы возможностей
При сравнении характеристик моего устройства с эхолокацией летучих мышей разница оказывается весьма существенной:
|
Параметр |
Мой сонар |
Летучая мышь |
|---|---|---|
|
Частота сигнала |
2.5 кГц |
20 – 120 кГц |
|
Частота повторения импульсов |
4 Гц |
до 200 Гц |
|
Максимальная дальность |
10 м |
5–20 м |
|
Разрешение по расстоянию |
около 45 см |
1 мм – 1 см |
|
Формирование акустического луча |
ФАР из 9 динамиков |
Строение головы |
|
Приём |
1 микрофон |
Два уха‑антенны |
С инженерной точки зрения, летучие мыши — это уже не просто сонар, а полноценные системы отправки, приёма и обработки сигналов. Они совершенствовались эволюцией на протяжении миллионов лет, так что мой проект не способен приблизиться к возможностям биологической эхолокации. Но сравнение характеристик для меня было очень интересным и наглядно показало, насколько сложной инженерной конструкцией является обычная летучая мышь.
Заключение
Несомненно, проекту есть куда расти. Можно добавить больше излучателей, чтобы улучшить разрешение по углу; подобрать длительность и частоту звуковых импульсов, чтобы улучшить разрешение по расстоянию; можно сделать двумерный массив излучателей, чтобы определять летающие объекты; наконец, можно заменить динамики на ультразвуковые излучатели, чтобы работа радара не была слышна по всему району. В плане обработки сигнала тоже есть пространства для маневра с целью определения слабого отражённого сигнала на фоне шума: добавление микрофонов, корреляционная обработка сигналов.
И всё же у меня получился хоть и неидеальный, но рабочий сонар. Он формирует узконаправленный звуковой луч, принимает отражённый сигнал и по его задержке определяет положение объектов.
Идея сонара в инженерном мире не новая, но её реализация оказалась для меня весьма увлекательной. В процессе я применил на практике многие теоретические знания из универа: фазированные антенные решётки, цифровая обработка сигналов, синхронизация периферии микроконтроллера и визуализация данных в реальном времени. Для меня это был интересный инженерный эксперимент, результатом которого является рабочий прототип.
ссылка на оригинал статьи https://habr.com/ru/articles/1065556/