
Представьте себе кромешную темноту карстовой пещеры, куда не проникают лучи солнечного света. В таких местах обитают маленькие, но очень интересные существа — летучие мыши. В непроглядной тьме эти ночные хищники уверенно летают, огибая каждый сталактит, и ловят крошечных насекомых для пропитания. Они не видят, но «слышат» окружающий мир с точностью, которой позавидуют военные радары. Делают они это с помощью эхолокации по простому принципу: отправь звук, послушай эхо, определи расстояние по задержке, направление по углу падения эха.
Идея показалась мне достаточно интересной не только с биологической точки зрения, но и с инженерной. Природа решила задачу эхолокации довольно элегантно, и я захотел воспроизвести эту идею с применением микроконтроллера. Так родился проект — сонар на базе 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 points static 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 parameters k = (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 микрофон |
Два уха‑антенны |
С инженерной точки зрения, летучие мыши — это уже не просто сонар, а полноценные системы отправки, приёма и обработки сигналов. Они совершенствовались эволюцией на протяжении миллионов лет, так что мой проект не способен приблизиться к возможностям биологической эхолокации. Но сравнение характеристик для меня было очень интересным и наглядно показало, насколько сложной инженерной конструкцией является обычная летучая мышь.
Заключение
Несомненно, проекту есть куда расти. Можно добавить больше излучателей, чтобы улучшить разрешение по углу; подобрать длительность и частоту звуковых импульсов, чтобы улучшить разрешение по расстоянию; можно сделать двумерный массив излучателей, чтобы определять летающие объекты; наконец, можно заменить динамики на ультразвуковые излучатели, чтобы работа радара не была слышна по всему району. В плане обработки сигнала тоже есть пространства для маневра с целью определения слабого отражённого сигнала на фоне шума: добавление микрофонов, корреляционная обработка сигналов.
И всё же у меня получился хоть и неидеальный, но рабочий сонар. Он формирует узконаправленный звуковой луч, принимает отражённый сигнал и по его задержке определяет положение объектов.
Идея сонара в инженерном мире не новая, но её реализация оказалась для меня весьма увлекательной. В процессе я применил на практике многие теоретические знания из универа: фазированные антенные решётки, цифровая обработка сигналов, синхронизация периферии микроконтроллера и визуализация данных в реальном времени. Для меня это был интересный инженерный эксперимент, результатом которого является рабочий прототип.
Комментарии (34)

Caefah
01.08.2026 14:06Если строить аналогии с природными примерами, то логика подсказывает как минимум два микрофона. Больше — ещё лучше. В таком случае как и у летучих мышей источник сигнала может быть один, а всё остальное вычислять на базе разности, получаемой каждым микрофоном по отдельности. Это просто идея. Спасибо за статью! Вам уже удалось реализовать в железе то, о чём я только начал задумываться: «А с чего бы начать?..»

Persik1
01.08.2026 14:06Разность фаз на двух микрофонах даст точный азимут, но усложнит математику. Придется считать кросскорреляцию двух сигналов, а это уже серьезная нагрузка на проц

aabzel
01.08.2026 14:06Разность фаз на двух микрофонах даст точный азимут, но усложнит математику. Придется считать кросскорреляцию двух сигналов, а это уже серьезная нагрузка на проц
Понятно, что для вычисления угла прихода волны у нас в распоряжении wav файла есть только смещение фазы сигнала в каналах записи. Если смещение равно нулю, то и угол AoA равен 0 градусов.
При частоте дискретизации 96000 Hz один семпл длится всего 10.4 us. Скорость звука 331 м/c. За это время звук пролетает 3.4 мм.

Получается, что в предельном случае, когда угол на источник звука 90 градусов и при расстоянии между микрофонами 6 см=0.06м разность межу фазами звуковых дорожек составит всего 0.06/331.0 = 0.00018126s = 181.26 us или всего 17 cемплов на 96kHz.

С какой погрешностью мы тогда сможем измерять угол на источник звука? Получается что 90/17= 5.2 градуса. Не густо.

Cогласно рисунку прямоугольного треугольника ABC, последовательность формул (1)-(10) приводит к тому, что угол прихода звуковой волны AoA вычисляется по формуле (11). Тут применяется теорема Пифагора (1), простейшая тригонометрия (7) и формула вычисления пройденного пути по известной скорости и времени (3).
Из тригонометрических преобразований легко выражается формула для угола прихода звуковой волны (11). Единицы измерения тут радианы. От -pi/2 до pi/2
Как видите, зависимость нелинейная. Арксинус это монотонно возрастающая нечётная функция, заданная на области определения от -1 до 1 области значения от -pi/2 до pi/2.
Учитывая, что микрофоны жестко закреплены , а скорость звука постоянная, ToF может максимум быть (13)
Расстояние между микрофонами определяет то, какую максимальную разность фаз имеет смысл анализировать внутри программы. Если расстояние равно 1 метр, то звук пройдет это расстояние за 3ms. При частоте дискретизации 96kHz длительность семпла равна 10.4us. Выходит, что надо вычислять корреляцию между дорожками отличающимися максимум на 290 семплов.
TOF мы определим при помощи ЦОС вычислений программным образом алгоритмом вычисления корреляции между сигналами на каналах. База D - известна, скорость звука тоже известна. По сути можно выполнить свёртку записей правого и левого микрофона вокруг +/- (TOF_max/2), найдем максимум свёртки, определим значение максимума свёртки. Оно и будет являтся TOF.
Для тестирования потребуется ещё такая формула.
Для вычисления угла прихода волны в диапазоне от -90.....+90 надо считать корреляцию по следующему количеству отсчетов (12)
Буквально несколько предварительно рассчитанных значений

Для уменьшения погрешности определения направления прихода звуковой волны надо либо
1. Увеличивать расстояние между микрофонами
-
Увеличивать частоту дискретизации.
Второй способ более трудный, так как диктофон не может записывать быстрее, чем 96kHz. Вот и остается наращивать расстояние между микрофонами.

Какой длины считать свёртку?
Важный параметр это сколько семплов охватывать при вычислении свёртки? Чтобы не было неоднозначности. Надо чтобы длина волны уместилась на расстоянии между микрофонами не полностью. Допустим расстояние между микрофонами 1 метр. Значит надо, чтобы длины волн, которые прилетают были длиннее чем один метр. То есть из частота должна быть меньше 331 Hz.
С одной стороны, чем больше будет слагаемых тем явнее окажется максимум. С другой стороны увеличивается количество вычислений. Надо помнить что на каждом семпле мы считаем ToF_sample количеств свёрток (12). А потом еще находим максимум в массиве.
При этом надо помнить что источник звука может двигаться. И надо выбрать такой интервал времени, в котором цель не успела переместиться слишком далеко.
-

zapparello2
01.08.2026 14:06Есть слепые, которые научились "сонировать" окружающую среду, цокая языком и двумя ухами улавливая отражённую звуковую картину.
Вместо того, чтобы одним лучом медленно сканировать, может лучше "бахнуть" сразу во все стороны, записать картину отражённого сигнала на 2 (4, ...) микрофона и по ней восстанавливать сцену? Например, по сдвигу фазы принятой синусоиды на разных микрофонах можно триангулировать направление на источник отражения, по сдвигу фазы относительно исходного сигнала - дальность до обьекта.
kukovik
01.08.2026 14:06Бахнуть. С помощью Mitsubishi Dialtone D160.

zapparello2
01.08.2026 14:06У прахвэссора из "Назад в будущее", помнится, была подходящая аудиосистема :)

haqreu
01.08.2026 14:06А в помещении с эхом ото всех стен работать хоть как-то будет?

Vitaly_Y Автор
01.08.2026 14:06Если в помещении целиком поместится рабочая область сонара (спортзал, ангар), то да, будет работать. Но могут быть артефакты от отражений от стен - полагаю, повышенный уровень шума или ложные пики, соответствующие стенам.
Парковка, на которой я проверял устройство, находится во внутреннем дворе здания и окружена стенами со всех сторон. Минимальное расстояние между стенами 20 м, устройство работает корректно

Radisto
01.08.2026 14:06Как ФАР-дефектоскоп при контроле небольшого объекта. Ну или вы в комнате с зеркальными стенами - будет много отражений. Которые надо фильтровать априорной информацией. Как в общем, летучие мыши и делают

hardegor
01.08.2026 14:06Большинство вопросов по теме зондирования атмосферы уже подробно разобраны - рекомендую скачать вот эту книжку
Красненко Н.П. Акустическое зондирование атмосферы

VT100
01.08.2026 14:06Как я понимаю, “минус куб” потому, что рассматривался двумерный случай. А на практике - измерения производятся в объёме.
ДН самих излучателей при расчёте ДН ФАР - не учтена.
Массив микрофонов, наверное, будет лучше. Больше эхосигнала будет принято. И частоты можно будет приподнять для улучшения разрешения за счёт меньшего шага.
Vitaly_Y Автор
01.08.2026 14:06Измерения проводились вдоль главного лепестка в дальней зоны антенны. В таком случае интенсивность излучения спадает как
для излучателей любой природы (как радиоволны, так и акустические). Для антенн интенсивность в дальней зоне зависит не только от расстояния, но и от направления, что выражается как раз через диаграмму направленностей:
Я полагаю, что отличия в скорости спада возникают из-за поглощения среды. По з-ну Бугера-Ламберта-Бера при прохождении поглощающей среды:
А провал мощности при 11-13 м из-за интерференции с волнами, отражёнными от земли.
ДН я рассчитывал идеализированную, для оценки. Конечно, на практике она будет не совсем такой. Помимо ДН самих излучателей влияет взаимодействие излучателей между собой, интерференция от элементов установки, наверняка есть ещё факторы. Кроме того, я никак не учитывал АЧХ и ФЧХ усилителей. Это все искажает реальную ДН по сравнению с рассчитанной математически. Но и рассчитывал я её лишь для оценки применимости антенны к моей задаче.Да, большее количество микрофонов улучшило бы ситуацию. Возможно, в будущем поставлю и их. Но пока все упирается в обработку сигнала - даже разогнав МК, пришлось поколдовать с приоритетами прерываний, чтобы сигнал корректно излучался, а принятый звук не терялся и полностью обрабатывался.

aabzel
01.08.2026 14:06Когда я написал статью и засел за редактор Habr для её публикации, то с удивлением обнаружил, что тем же утром вышла статья с описанием аналогичного устройства. Однако, в ней автор использует другие идеи для создания своего сонара, так что есть возможность сравнить подходы и получившиеся устройства между собой.
Спасибо, что вставили ссылку на мой текст. Прям сезон сонаров.
https://habr.com/ru/articles/1050166/
Что если генерировать звуковую зондирующий волну не колонками , а пьезокерамическими звуко-излучателями? Зуммерами. Они компактные и управляются одним проводом.
Как раз ШИМ пригодится.

Radisto
01.08.2026 14:06И принимать массивом микрофоном. Излучение - ФАР, прием - акустическая голография. И то и то для узк используется. Но вычислительные мощности как правило большие требуются. В нк аналог сонара - А-скан и его производные - делали на рассыпухе полсотни лет назад, сейчас это компактная коробочка на плис. А фар и синтезированная апертура - это что-то с мощностью ноутбука и специализированным софтом. Хотя наверное синтезированную аппертуру компактно сделать легче, чем акустическую ФАР. Летучие мыши вон кричат в одно рыло, а слушают двумя ушами. Хотя это эволюция - не всегда оптимальное, часто первое попавшееся рабочее

aabzel
01.08.2026 14:06Для сканирования окружающего пространства необходимо генерировать короткие звуковые импульсы на заданной частоте,
Я так понял у Вас зондирующий импульс простой. B=1. На одной частоте.
Поэтому его отражение и можно поймать алгоритмом герцеля.
Однако такими импульсами невозможно различить две цели стоящие рядом. Идущие звеном самолёты.
Радары и сонары уже давно работают только со сложными импульсами. 1‹‹B.
Это ЛЧМ сигналы и модулированные м-последовательность фазовые пакеты. Причина проста . У сложных сигналов очень хорошая автокорреляционная функция. Это позволяет на порядки увеличить разрешение по дальности.

Vitaly_Y Автор
01.08.2026 14:06Да, я про это как-то поздно задумался) Уже когда анализировал полученные результаты и думал, как улучшить точность, стал изучать подходы к обработке сигналов в локации. Зондирующие сигналы дают лучшее разрешение. Хотя, полагаю, там и математика в разы сложнее для МК: у меня поначалу даже алгоритм Гёрцеля не успевал обрабатывать. Потом расставил приоритеты прерываний правильно, всё заработало

aabzel
01.08.2026 14:06Выводимый сигнал через усилители подаётся на колонки. Таким образом, я программно задаю частоту сигнала и фазовый сдвиг для каждого акустического излучателя в массиве ФАР. В результате заданная частота чётко выделяется пиком на спектральном анализаторе звука; формируется узкий сканирующий луч, который с заданным шагом изменяет своё направление
Как же это здорово!

aabzel
01.08.2026 14:06Разрешение по расстоянию — около 45 см — не очень‑то хорошая точность в сравнении с летучей мышью, но как сделать точнее я пока не придумал
Решение классическое. Надо испускать сложные сигналы: ЛЧМ или ФКМ.

aabzel
01.08.2026 14:06Микрофон я установил непосредственно за ФАР.
Подобрать хороший микрофон та ещё задача. Какой у Вас микрофон?

aabzel
01.08.2026 14:06Можно теперь провести испытания на полигоне , расставив кругом уголковые отражатели, выпеленные из коробок.

aabzel
01.08.2026 14:06Из всего этого можно сделать отличную охранную систему, для навигации ptz видеокамер. Охранять дачный участок, аэропорты, металлургические комбинаты , нефте переливные станции и прочее.
Или датчики для авто парковки автомобилей.
Если перейти на пьезокерамику, то можно смастерить глубиномер с анализом карты глубин и поиском скопления рыб.

aabzel
01.08.2026 14:06Несомненно, проекту есть куда расти
Я пришел к выводу , что полноценный сонар надо проектировать на FPGA. Или в тандеме с одноплатным компьютером . Микроконтроллер просто захлёбывается при обработке сложных импульсов.

Radisto
01.08.2026 14:06Так и делают. Тут конечно проще - в воздухе скорость ниже, расстояния большие, оперировать приходится солидными промежутками времени. А малые размеры и высокая скорость - в воде или твердых телах - там да, fpga. Я разбирал (случайно) промышленные приборы - там spartan-овское что-то было и куча рассыпухи на плате. Люди, проектировавшие подобные системы в 90х, говорили, что уперлись в быстродействие микроконтроллеров очень быстро даже на примитивных двухканальных регистраторах, хотя брали самые быстрые на тот момент PIC.

aabzel
01.08.2026 14:06Летучие мыши по ходу вообще в уме делают синтез аппаратуры. Подобно тому как SAR спутники землеобзора строят карту поверхности земли по отдельным радиолограммам в известных местах.
.

Radisto
01.08.2026 14:06Не знаю как мыши, но у дельфинов слуховые зоны мозга соединены со зрительными. Они могут ещё и сопоставлять картинки. У человека это аналог синестезии. Мышей конечно сложнее изучать - у них ухо больше мозга, но скорее всего тоже что-то похожее.

Refridgerator
01.08.2026 14:06Чтобы обойти природу - нужно использовать 4 микрофона в узлах тетраэдра, тогда можно будет определять направление в 3D через разность фаз и амплитуд. Математика обработки конечно будет в разы сложнее. Я делал нечто подобное в задаче выделения центра из стерео сигнала или, другими словами, выделение сигнала вдоль конкретного вектора в 2D (а сама математика считается в комплексных числах в частотном домене). Возможности человека в аналогичной задаче результат субъективно превзошёл.

aamonster
01.08.2026 14:06Если хочется сделать 3d, самая очевидная идея оптимизации – горизонтальная линейка излучателей и вертикальная линейка приёмников.

Persik1
01.08.2026 14:06Очередное доказательство что миллионы лет эволюции пока выигрывают у кучки китайских динамиков и стм-ки) Зато поигрался с ШИМом :)
Radisto
Однако популяризаторы, в том числе с кандидатскимо степенями по биологии, в частности Алексей Опаев, который писал статьи о рукокрылых для Элементы.ру (вполне уважаемый сайт биологической в основном напраленности) использует термин "пищевая трель" (есть ещё питьевая, в этом режиме они зву́чат поверхность водоема, когда пьют, чтобы не нырнуть).