
Я программировал мультимедийные системы для автомобилей. Это были проигрыватели музыки на основе микроконтроллеров. И между делом у меня появилась мечта сделать сонар из музыкальной колонки.
Постановка задачи
Собрать прототип акустического сонара. Соединить микроконтроллер STM32, аудиокодек WM8731 и SD карту в один прототип. Сделать прошивку на Audio Loop Back. Микроконтроллер соединить с аудиокодеком по I2S и I2C. Прошивка рассчитывает зондирующий ЛЧМ импульс и отправляет его на спикер. Тем временем микрофон в фоновом режиме записывает излученный импульс и эхо от него. Затем прошивка вычисляет свертку зондирующего импульса с принятым эхо сигналом. Результат свёртки записывается на SD карту в виде отдельного файла. Поэкспериментировать с разными зондирующими импульсами. В идеале каждый зондирующий импульс должен быть уникальным.
Теория
Сонар работает очень просто. Передатчик отправляет один зондирующий импульс и параллельно слушает ответ. Со временем приходят отраженные импульсы.

Как известно скорость звука это 331 метр/с. Если умножить скорость звука на TOF и поделить на два, то получится расстояние до предмета.
Учитывая скорость звука в воздухе 331 м/с получаем, что разрешение по дальности dx косвенно зависит от частоты дискретизации звука

Однако в радиолокации существуют отдельные формулы для разрешающей способности по дальности.

Для монотонного импульса используется формула разрешения по дальности (2). Все цели, которые отстоят друг от друга менее, чем на dR на сонаре будут отображены как одна единственная цель. Формула (2) выводится исходя из геометрических построений на рисунке выше.
В случае ЛЧМ импульса разрешение по дальности считается по формуле (4)
Например, для ЛЧМ c параметрами Fstart=500 Hz Fend=5kHz и скорости звука 331 м/c разрешение равно 3см.

В радарной технике используют сложные и длинные зондирующие сигналы: ЛЧМ и кодовые BPSK (ФКМ сигналы). Это позволяет закачать в зондирующий импульс больше энергии, повысить шансы на отражение сигнала и его приход обратно в приемник.
Сонары в воздушной среде делать существенно проще, чем подводные сонары или дефектоскопы металлов. В воздухе скорость звука в разы ниже (331 м/c), расстояния в разы большие, оперировать приходится солидными промежутками времени. А малые размеры и высокая скорость - в воде или твердых телах - там работают только FPGA.
Всё это открывает возможность построить акустический сонар на основе микроконтроллера.
Свёртка, конволюция — операция в функциональном анализе, которая при применении к двум функциям возвращает третью функцию, соответствующую взаимно корреляционной функции. Операцию свёртки можно интерпретировать как «схожесть» одной функции с отражённой и сдвинутой копией другой.

Коррелограмма - это результат свёртки. Это функция, где по оси X отложено расстояние (или время с момента отправки импульса), а по оси Y отложена мера сходства принятого участка записи с опорным сигналом, который собственно был отправлен. По своей сути, коррелограмма показывает радиальное расстояние до всех окружающих нас целей. Коррелограмму можно посчитать из записи эхо либо коррелятором (FIR фильтром), либо преобразованием Фурье (обычно алгоритмом FFT).
Азимут — это горизонтальный угол между направлением на север (или другим опорным направлением) и направлением на заданный объект, измеряемый по часовой стрелке
Аппаратная часть
В прошлом тексте я использовал два смартфона для сбора данных. Первый проигрывал огромный wav файл с зондирующими ЛЧМ импульсами, второй смартфон просто записывал всё вокруг рядом. Такой подход затруднял понять, где именно на двух звуковых дорожках эхо от конкретного импульса. Поэтому я решил написать одну прошивку для одного прототипа, чтобы специально собирать сонарные данные.
В качестве отладочной платы я выбрал PCB DevEBox_V3_0. Эта учебная плата хороша тем, что на ней есть SD карта, подключенная по быстрому интерфейсу SDIO. Надо собрать прототип согласно вот этой подсказке.

Еще сонар можно собрать на основе платы JL_32F4XX. PCB JL_32F4XX даже предпочтительнее, так как не ней заложен более надежный USB mini штекер, нежели USB micro.

На микроконтроллер STM32F407VG я загрузил прошивку аналогового LoopBack проигрывателя. Это такая прошивка, которая может одновременно воспроизводить и одновременно записывать звук в WAV файл. Про её разработку у меня есть отдельный текст.
Перед экспериментами убедитесь осциллографом, что при воспроизведении частота дискретизации на проводе I2S2_WS точно равна 48kHz. От этого зависят будущие вычисления дальности. Если частота отстоит от 48kHz, то это придется компенсировать за счет варьирования скорости звука в конфиге программы на PC.
Зондирующие импульсы я проигрывал 8 Watt-ными компьютерными колонками. Модель Defender 2.0 Speaker System Aurora S8 (SN 2293315072403158). Колонки питались от USB-A порта.
Эхо записывал петличным микрофоном Aceline AMIC-7, Сопротивление:2200 Ом, частота: 50 Гц - 16000 Гц, чувствительность -58 дБ

Программная часть
При записи эхо сигнала надо реализовать непрерывную запись звуковой дорожки длительностью 1-2 секунды. Данные надо непрерывно записывать в SD карту и уже затем считать свёртку по каждому смещению. У меня уже был текст про то как делать аудио LoopBack. Называется Full Duplex I2S на STM32. Надо посылать реальные сонарные сигналы и записывать эхо от них. Далее на PC пропустить записанный сигнал через программный консольный коррелятор, опорный сигнал которого равен излучаемому зондирующему сигналу. Получится свертка, показывающая расстояния до целей. Коррелятором выступает обыкновенный целочисленный FIR фильтр высокого порядка несколько тысяч симплов. Всё предельно просто.

Чем длиннее зондирующий импульс, тем выше порядок коррелятора. Порядок коррелятора это количество регистров в его сдвиговом регистре. Каждый регистр хранит один семпл записанного звука.
Подготовка зондирующего импульса
Для синтезирования зондирующих импульсов у меня написана отдельная консольная утилита. В частности для синтезирования ЛЧМ импульсов. Зондирующие импульсы должны иметь внеземное происхождение. Так их не спутаешь с реальными природными звуками. Называется утилита sonar.exe. Утилита при запуске разворачивает на экране интерфейс командной строки и можно текстовыми командами сконфигурировать параметры любого зондирующего импульса.
CLI команда | Пояснение |
dds_set_chirp 1 10 000 450 10 000 0.05 | Присвоить первому DDS настройки для ЛЧМ сигнала F1=450 Hz; F2=10kHz; Duration: 50ms |
ddssfr 1 48 000 | Задать частоту дискретизации 48kHz для первого DDS |
wavsf 2 48000 | Задать частоту дискретизации 48kHz для второго WAV файла |
wav_duration 2 2 | Задать длительность 2 секунды для второго WAV файла |
wav_gen1ch_from_dds 2 out.wav 1 | Сгенерировать WAV файл out.wav на основе настроек из первого DDS |
wav_shift_right out.wav 0.25 | Сдвинуть вправо сигнал из WAV файла на 0.25 секунд |
Можно вводить CLI команды вручную, а можно набрать их автоматически одним кликом на bat файл. Данный скрипт синтезирует желаемый цифровой ЛЧМ импульс, который начинается от 450 Hz и заканчивается 10kHz. Имеет ширину 50ms.
cls set batdir=%~dp0 echo batdir=%batdir% cd %batdir% set wav_num=2 set options= set options=%options%; ddp 1 0.05 set options=%options%; dds_set_chirp 1 10000 450 10000 0.05 set options=%options%; ddssfr 1 48000 set options=%options%; wavsf %wav_num% 48000 set options=%options%; wav_duration %wav_num% 2 set options=%options%; wav_gen1ch_from_dds %wav_num% out.wav 1 set options=%options%; ll FileAPI debug set options=%options%; wav_shift_right out.wav 0.25 %batdir%sonar.exe %options%
В прошивке зондирующий ЛЧМ импульс рассчитывается вот этой функцией. По сути подготовка импульса сводится к формуле вычисления одного семпла calc_chirp_sample
/* cur_time_s - up time in s signal_diration_s - signal duration f_2_hz - maximum value of signal frequency. f_1_hz - initial signal frequency des_amplitude - signal amplitude phase_rad - initial phase. */ float calc_chirp_sample(float cur_time_s, float f_2_hz, float f_1_hz, float phase_rad, float amplitude, float signal_diration_s) { float amplitude_scaled = 0.0f; float b = 0.0f; if(0.0f < signal_diration_s) { float bandwith_hz = f_2_hz - f_1_hz; b = bandwith_hz / signal_diration_s; float argument_rad = phase_rad; argument_rad += M_2PI * (f_1_hz * cur_time_s + (b * cur_time_s * cur_time_s) / 2.0f); if(signal_diration_s < cur_time_s) { amplitude = 0.0f; } float cos_arg = (M_2PI * cur_time_s) / signal_diration_s; float hamming_window = 0.46f - 0.46f * cosf(cos_arg); amplitude_scaled = amplitude * sinf(argument_rad) * hamming_window; } return amplitude_scaled; }
Лог синтеза импульса

Импульс помещается в wav файл длительностью 1.1 секунды с определенным в скрипте отступом от начала файла с частотой дискретизации 48kHz.

На слух этот импульс напоминает лопающиеся мыльные пузыри. В частотной области спектр ЛЧМ сигнала — это прямоугольник со сглаженными краями.

ЛЧМ сигнал хорош тем, что у него очень ярко выраженная автокорреляционная функция. Вы можете построить ее при помощи всё той же утилиты sonar.exe. Данный скрипт позволяет экспериментировать с АКФ различных ЛЧМ сигналов.
АКФ различных ЛЧМ сигналов
cls set batdir=%~dp0 echo batdir=%batdir% cd %batdir% set options= set wav_num=2 set sonar_num=0 set ampletide=10000 set freq1=400 set freq2=9000 set chip_dur_s=0.05 set options= set options=%options%; ddp 1 0.05 set options=%options%; dds_set_chirp 1 %ampletide% %freq1% %freq2% %chip_dur_s% set options=%options%; ddssfr 1 48000 set options=%options%; wavsf %wav_num% 48000 set options=%options%; wav_duration %wav_num% 2 set options=%options%; ll WAV info set options=%options%; ll FileAPI info set options=%options%; wav_generate_signal %wav_num% 1 set options=%options%; wav_shift_right2 %wav_num% 0.5 set options=%options%; sonar_config %sonar_num% %chip_dur_s% %freq1% %freq2% set options=%options%; sonar_chirp_correlation %sonar_num% CHIRP_400_9000_dt50_A1000.wav set options=%options%; sonar_plot_convolution %sonar_num% 3 7 %batdir%sonar.exe %options%
График АКФ рисуется отдельным Python скриптом.


Я выбрал, что в качестве зондирующего импульса у меня в экспериментах будет ЛЧМ сигнал длительностью 30ms, амплитудой 30k PCM, начальной частотой 1kHz, конечной частотой 10kHz. У такого сигнала хорошая автокорреляционная функция.
Если записывать на микрофон этот импульс, то получается вот такой принятый сигнал.

Иной раз эхосигнал можно увидеть даже на графике сигнала записи.

Однако есть более точный способ определить момент времени прихода эхо. Это и есть корреляция записи с опорным зондирующими сигналом. Или попросту свёртка.
Зондирующий импульс в виде ЛЧМ сигнала
Прямо в комнате я записал 24 эхо сигнала на зондирующий ЛЧМ импульс. Затем вычислил корреляцию и построил на одном графике в виде точек с прозрачностью 10%. Можно наблюдать локальные максимумы корреляции.

Далее я попробовал испытать сонар на импровизированном полигоне.

Результат корреляции удобнее анализировать в логарифмическом масштабе. Так проще зарегистрировать локальные максимумы свертки записи эхосигнала с опорным сигналом в FIR фильтре (корреляторе). Вот эту запись я выполнил во дворе.

Некоторые измерения приблизительно соответствуют расстоянию до забора.

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

Зондирующий импульс в виде модулированного кодом Баркера BPSK сигнала
В качестве зондирующих импульсов можно еще применить модулированые кодом Баркера BPSK пакеты. Вот так выглядит BPSK пакет модулированный Баркер кодом длинной 13 чипов: 1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1. Тут несущая частота 2kHz, на один чип 6 периодов несущей. Длинна импульса 39ms.

На слух этот сигнал похож на квакание лягушки. Коды Баркера хороши тем, что что при автокорреляции боковые лепестки имеют минимальную высоту. Это уникальные штучные коды. Таких известно всего 13 кодов.

Корреляция импульса с реальной записью эха показала, как будто бы эхо от деревьев на расстоянии 24,5 метров.

BPSK импульс методично каждый раз отражался именно от берёзы за забором. При этом сам забор не так выразительно выглядит как в случае с ЛЧМ.

Зондирующий импульс модулированный M-последовательностью
Главная проблема кодов Баркера в том, что они очень короткие. Самый длинный код Баркера имеет длину 13 бит. Поэтому в них невозможно закачать много энергии. Однако помимо кодов Баркера можно закодировать сонарные зондирующие импульсы ещё и длиннющей M-послделовательностью. Я подготовил вот такой BPSK импульс длинной 31 бит.

Далее пробовал излучать модулированные M-последовательностью BPSK сигналы. Такие импульсы тоже могут определит расстояние до забора. Вот так это работает в наруре

Монотонный зондирующий импульс
Также я попробовал посылать самый простой зондирующий импульс в виде синус сигнала на частоте 2500 Hz длительностью 10ms. Длинна волны определяет максимальный размер цели, которую можно обнаружить.

В случае частоты 2,5kHz мы можем обнаруживать цели размерами более 13cm. Все, что меньше будет теряться в дифракции.

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

В результате корреляции записи с монотонным 2.5kHz импульсом 10ms я тоже получил заметные эхо сигналы от телеги, дровяника, забора и бани. Просто разрешение по дальности ожидаемо заметно грубее и хуже.

Монотонные зондирующие импульсы имеют место быть. Монотонными зондирующими импульсами можно делать первичный грубый поиск цели. Далее, определив потенциальную цель, можно в то же место пульнуть уже более внимательные ЛЧМ и ФКМ импульсы, для получения конкретных деталей о предстоящей цели.
Скрипт генерации монотонного импульса 10ms, 9kHz, 25kPCM
cls set batdir=%~dp0 echo batdir=%batdir% cd %batdir% set options= set DDS_NUM=1 set wav_num=2 set PLAY_DURATION_S=1.6 set SIGNAL_DURATION_S=0.01 set sonar_num=0 set SAMPLE_FREQ_HZ=48000 set AMPLETIDE=25000 set CAR_FREQ=9000 set options= set options=%options%; dds_set_sin %DDS_NUM% %CAR_FREQ% %AMPLETIDE% 0 0 set options=%options%; dds_signal_diration %DDS_NUM% %SIGNAL_DURATION_S% set options=%options%; ddssfr %DDS_NUM% %SAMPLE_FREQ_HZ% set options=%options%; wavsf %wav_num% %SAMPLE_FREQ_HZ% set options=%options%; wav_duration %wav_num% %PLAY_DURATION_S% set options=%options%; wav_generate_signal %wav_num% %DDS_NUM% set options=%options%; wav_shift_right2 %wav_num% 0.07 %batdir%sonar.exe %options%
В чем трудность разработки акустического сонара?
1) Получение корреляции это очень затратная с вычислительной точки зрения операция. Для обработки 1,1 секунды на 48kHz, STM32F407VG микроконтроллер на 168 МHz вычислят корреляцию с 30ms опорным сигналом 13 минут! Это, по сути, пропустить 52800 семплов через FIR фильтр порядка 1440. Это очень долго. Ситуацию можно улучшить, если отправить wav запись эхо сигнала на одноплатный компьютер или делать обработку на FPGA. Дело бы улучшил микроконтроллер с аппаратными корреляторами. Еще можно ускорить вычисления пожертвовав энергетикой излучаемого сигнала. Чем короче длительность ЛЧМ импульса, тем меньше надо делать вычислений, так как порядок коррелятора прямо пропорционален длительности зондирующего импульса. Однако короткие ЛЧМ импульсы не позволяют чтобы то ни было обнаружить. Чем короче ЛЧМ импульс, тем менее он эффективен. На коротком ЛЧМ импульсе даже не видно локальных максимумов как таковых. Трудно выделить локальные максимумы на графике свертки.
2) На малых расстояниях зондирующие импульсы на основе кодов Баркера нет так эффективны. Их боковые лепестки перебивают все отражения от близких целей. Для регистрации на малых расстояниях лучше выбрать ЛЧМ импульсы.
3) По факту звуковые отражения приходят только от строго перпендикулярных поверхностей (забор, листья, стены). Всё остальное сонар не видит.
4) Скорость звука в воздухе плавает от температуры, влажности и атмосферного давления. За две недели измерений я наблюдал несколько скоростей звука 288 м/c; 321 м/c; 337 м/с; и 344 м/c. Хороший сонар надо оснащать датчиком температуры, датчиком влажности и желательно еще барометром. Чтобы можно было каждый раз вычислять текущую скорость звука. Или добавить калибровочные мишени для авто-калибровки датчика.
Что можно улучшить?
Можно и дальше экспериментировать со все новыми и новыми зондирующими импульсами. Однако кадинальные улучшения могут дать вот эти меры:
1) Логическим развитием акустических сонаров было бы создание FPGA SoC, который бы отправлял попарно отличные зондирующие импульсы с периодом 0,1 - 0,2 сек и многочисленными аппаратными корреляторами в реальном времени параллельно вычислял бы свертки, показывая результат на графическом экране. Однако это сделать весьма трудно, так как надо привлекать FPGA технологии.
2) В сонаре должны быть датчики температуры, влажности и атмосферного давления. Эти переменные влияют на скорость звука в воздухе. Прошивка должна каждый раз пересчитывать скорость звука по калибровочным таблицам для текущих параметров окружающей среды.
3) Воспользоваться преобразованием Фурье для вычисления свертки. Согласно теореме о свертке, свертку можно вычислить не просто корреляторами, а преобразованием Фурье. Вычислить свертку можно по формуле
iDFT{DFT( принятый сигнал) * [комплексное сопряжение(DFT(импульсный ЛЧМ-сигнал))] }
Эта формула хороша тем, что множитель DFT опорного сигнала
комплексное сопряжение(DFT(импульсный ЛЧМ-сигнал))
это величина постоянная и ее можно вычислить один раз при инициализации программы и не вычислять каждый раз. Там самым можно оптимизировать время вычислений программы.
При этом на вычисление надо подавать сигналы не оригинальной длинны, а выравненной PulseLen+RecLen-1. То есть надо дополнить нулями, как сигнал с импульсом, так и сигнал с записью. Подобно тому как и коррелятор увеличивает размерность выходного результата.
Вот так получилась свёртка ЛЧМ сигнала самого на себя с отступом вычисленная через преобразования Фурье.

Можно заметить максимум модуля комплексной функции на смещении 0,07 секунды.

Это как раз соответствует смещению сигнала на входной записи в wav файле.

Скрипт вычисления авто корреляции ЛЧМ сигнала через DFT -> iDFT утилитой sonar
Скрипт вычисления авто корреляции ЛЧМ сигнала через DFT -> iDFT утилитой sonar
cls set batdir=%~dp0 echo batdir=%batdir% cd %batdir% set SONAR_NUM=0 set WAV_NUM=2 set DDS_NUM=1 set CHIP_DUR_S=0.05 set FREQ_1=400 set FREQ_2=4000 set AMPLITUDE=200 set SAMPLE_FREQ_HZ=48000 set PROBING_PULSE=ProbingPulse.wav set options= set options=%options%; ll dds notice set options=%options%; ll wav notice set options=%options%; ddp %DDS_NUM% %CHIP_DUR_S% set options=%options%; dds_set_chirp %DDS_NUM% %AMPLITUDE% %FREQ_1% %FREQ_2% %CHIP_DUR_S% set options=%options%; dds_sample_frequency %DDS_NUM% %SAMPLE_FREQ_HZ% set options=%options%; wavsf %WAV_NUM% %SAMPLE_FREQ_HZ% set options=%options%; wav_duration %WAV_NUM% %CHIP_DUR_S% set options=%options%; wav_gen_from_dds %WAV_NUM% %PROBING_PULSE% %DDS_NUM% set options=%options%; sonar_dft_convolution %PROBING_PULSE% Rec_CHIRP_A2000_400_4000_dt50.wav %batdir%sonar.exe %options% python plot_csv_file.py convolutionDFT.csv 1 7 TimeS Abs python plot_csv_file.py convolutionDFT.csv 1 9 TimeS Arg python plot_csv_file.py convolutionDFT.csv 1 3 TimeS Real python plot_csv_file.py convolutionDFT.csv 1 5 TimeS Image
Вот тут я вычислил свертку ЛЧМ сигнала c параметрами dt=20ms, F1=4345Hz, F2=7655Hz с записью реального эха при помощи DFT. Модуль сигнала на выходе iDFT как раз показывает корреляцию. Как можно заметить, результат совпал с тем, что вычислил коррелятор.


4. Применить алгоритм FFT для вычисления свертки
По-хорошему свертку надо считать при помощи алгоритма FFT iFFT. Это вычисляется быстрее. Формула остается той же самой только DFT заменяется на FFT.
iFFT{ FFT( принятый сигнал) * [комплексное сопряжение(FFT(импульсный ЛЧМ-сигнал))] }
В результате программа вычисляет свёртку для файла длинно 0,7 секунд в 13 раз быстрее по сравнению с FIR фильтром, и в 3421 раз быстрее, если сравнивать с DFT!
Алгоритм вычисления | Продолжительность вычислений, с | Продолжительность вычислений, мин |
свертка через коррелятор FIR* | 4.5 | 0.07 |
свертка через DFT | 1177.257 | 19 |
свертка через FFT*** | 0.344 | 0.00573 |
Лог работы утилиты показывает, что c FFT свертка посчиталась за 0,3с.
![[FFT],CalcDuration:0.089 s [FFT],CalcDuration:0.089 s](https://habrastorage.org/r/w1560/getpro/habr/upload_files/195/346/b61/195346b61129c3dc289433b3f5ed4c80.png)
5) Добавить в программу сонара составление одной усредненной коррелограммы по серии из N отдельных коррелограмм от одного и того же зондирующего импульса. То есть, накапливать информацию о цели, компенсировать так случайных шум и промахи. Складывать по точечно N коррелограмм и анализировать одну усредненную коррелограмму. Так цели станут более ярко выраженными. Усреднение сверток позволяет повысить контрастность коррелограммы. Чем больше проделать эхо измерений, тем чётче получится информация о дальности до целей.

Вычисления коррелятором (FIR) и через FFT приводят к одному и тому же результату свёртки.

Достоинства сонара:
1) В отличии от видеокамер сонар видит в полной темноте, сквозь жидкости и металлы. Для сонара подойдет любая сплошная среда.
2) Сонар дешевле радара. Можно реализовать сонар на дешевой электронной начинке. Микросхемы аудиокодеков очень дешевы и стоят порядка сотен рублей.
3) Для работы сонара не надо согласовывать у государства радио частотный диапазон работы, как в случае с радарами. Не надо покупать право на частоты. Звуком можно пользоваться абсолютно бесплатно.
4) Скорость звука в воздухе относительно мала 331 м/c, если сравнивать её со скоростью света у радаров (300 000 000 м/c = 3e8 м/c) или с той же скоростью звука в жидкостях (вода 1403 м/c). Это обстоятельство существенно снижает требования цену к акустическим ADC/DAC. Эксперименты с сонарами может позволить себе кто угодно и делать их буквально на двух телефонах (или связке микроконтроллер + ASIC аудиокодек+ SD карта ).
5) Сонар не имеет мертвой зоны как радар. Радары начинают работать после 40 метров. Всё то, что ближе - слепая зона. В то время как сонар хорошо работает как раз на малых расстояниях до 40-50 метров.
Недостатки акустического сонара
1) Ветер сносит звук. Колеблющуюся среду распространения сигнала. Вы можете каждый день зондировать одно и то же стационарное место и получать разные показания коррелограммы.
2) Низкая дальность. Эхо звук приходит очень слабый. Надо применять микрофон с высоким динамическим диапазоном. Анализировать сигнал в логарифмическом масштабе по шкале Y.
3) Надо калибровать параметры сонара для определения текущей локальной скорости звука. Скорость звука плавает от температуры, давления, влажности.
4) Для сонарных измерений в реальном времени нужны аппаратные корреляторы или аппаратные FFT на десятки тысяч семплов.
5) Сонар слышат люди. Чтобы зондирующие звуки никого не раздражали надо испускать импульсы редко и тихо. Надо отправлять импульсы в случайные интервалы времени. Либо имитировать голоса разнообразных птиц в качестве зондирующих импульсов, чтобы никто не догадался, что рядом работает сонар.
6) Ввиду низкой скорости звука в воздухе акустическим сонаром Вы не можете делать измерения слишком уж часто. Как ни крути, а надо подождать прихода эха, и только потом отправлять очередной зондирующий импульс. Чем больший радиус вы хотите сканировать, тем меньше будет частота измерений.

В радарной же технике такой проблемы нет. Скорость света запредельно большая. Радаром можно вообще снимать видео.
7) Когда мы получаем коррелограмму мы не знаем направление прихода этой волны. Расстояние до цели знаем, а направление - нет.

Решение напрашивается само собой. Надо делать несколько измерений коррелограммы вдоль прямой с известным шагом. Затем программно синтезировать апертуру. То есть строить концентрические окружности и искать их пересечения. Так вы сможете определять азимут на цель. Чем больше сонарных измерений вы сделаете вдоль прямой, тем чётче у Вас сформируется карта окружающих предметов.
Возможные приложения акустического сонара
1) Можно охранять по ночам длинные коридоры режимных предприятий. Регистрировать появления людей. Считать поток людей в метро и на вокзалах.
2) Сонаром можно охранять дачный участок. Фотографировать появление целей: лисы, кабаны, собаки и прочее. Наводить прожектор на появившуюся цель.
3) Сонар можно использовать в системах автопарковки автомобилей.
4) Сонар можно встроить в трость для инвалидов по зрению. Информировать о расстояниях через голосовые команды там же самым аудиокодеком, что и излучает ЛЧМ-сигналы.
Как работают реальные радары?
Реальные радары работают намного эффективнее. Работают в X диапазоне (8 до 12 ГГц). Центральная частота 10 GHz (длинна волны 3 см). Или в Ku диапазоне 16.6 ГГц – 17.3 ГГц. Посылают зондирующий импульс длительностью 50us. Ширина ЛЧМ импульса от 10 MHz до 84 MHz. Средняя мощность излучения 75 мВт. Обладают вращающейся антенной. Вычисляют свертку аппаратным FFT на лету при помощи FPGA. Имеют на FPGA soft процессор, который передает результат свертки по гигабитному Ethernet через UDP протокол прямиком на клиентский софт в PC.
Результаты
Мне удалось построить прототип сонара из микроконтроллера, аудиокодека и SD карты. Разработана прошивка для микроконтроллерного прибора, который может одновременно воспроизводить и записывать звук. Удалось научиться синтезировать WAV файлы с различными зондирующими импульсами внутри: ЛЧМ сигналы, монотонные импульсы, кодированные Баркером BPSK пакеты, кодированные М-последовательностью BPSK пакеты.
ЛЧМ сигналы показали наилучшую воспроизводимость измерений.
Написана утилита sonar.exe для вычисления корреляций конкретных записей на входе c опорным сигналом. Проведены эксперименты по измерению дальности до окружающих предметов получившимся сонаром, показавшие концептуальную работоспособность прототипа.
При этом одинаковый результат свертки я получил тремя способами: через коррелятор на FIR фильтре, через DFT и через FFT.
Вот так просто и незатейливо можно отлаживать радиолокационные алгоритмы буквально из подручных материалов на примере привычного нам всем акустического диапазона. Всё это открывает дорогу для дальнейших исследований в области радиолокации и гидроакустики.
Словарь
Акроним | Расшифровка |
ЦОС | Цифровая обработка сигналов |
ЛЧМ | Линейная частотная модуляция |
DDS | direct digital synthesis |
TOF | Time-of-Flight |
FIR | finite impulse response |
Ссылки
Название | URL |
Сонар из Диктофона | |
Эхолокация: микрофон и фазированная решётка из колонок @Vitaly_Y | |
Обработка звука в реальном времени (или Full Duplex I2S на STM32) | |
Аналитика по сонару | https://docs.google.com/spreadsheets/d/1twizxcenUCPF2iNNpEq3qrrdMX3we23pn7XMsVpdRhA/edit |
Pulse Compression: How Matched Filtering Boosts Weak Signals and Sharpens Resolution | |
Radar Systems Engineering by Dr. Robert O'Donnell. Chapter 11: Waveforms & pulse compression, Part 2 | |
Проигрыватель WAV файлов на STM32 | |
Диктофон на микроконтроллере (WM8731 + I2S + STM32 + SDIO + FAT16) | |
STM32F4XX M STM32F407VGT6 | |
M-последовательности, последовательности Лежандра, Якоби и разностные множества Адамара @Morgana0_0 | |
Принципы работы сонаров и подводная акустика: как, зачем и почему @akuzmin | |
Разрешающая способность по дальности | |
ECE3084 L12.5: Autocorrelation, Pulse Compression, & Barker Codes (Signals & Systems, Georgia Tech) | |
Модуль подводного ультразвукового дальномера. Часть третья @MShekunov | |
Модуль подводного ультразвукового дальномера @MShekunov | |
Как работают эхолоты | |
#18 Audio codec — Floating point hardware | |
Утилита генератор wav файла с ЛЧМ и приложение консольный сонар | |
Чип AudioСodec(а) WM8731 (или (ADC/DAC)*2 из iPod(а)) |
Вопросы
1) Существуют ли в продаже готовые учебные электронные платы с SD картой, STM32F4 микроконтроллером, микросхемой простого аудиокодека и графическим экраном?
2) Можно ли радарные сигналы хранить в WAV файле?
5) Существует ли отдельный специальный бинарный формат данных для хранения свёрток сигналов? Формат для хранения результата коррелляции.
6) Существует ли утилита для сравнения двух wav файлов? Чтобы находить в двух WAV файлах одинаковые участки звука.
7) Какие параметры ЛЧМ сигнала следует выбрать для сонара в воздушной среде?
8) Раз уж в ЛЧМ важна именно частота зондирующего сигнала, то можно ли использовать однобитные зондирующие импульсы? Например, чтобы излучать их не аудиокодеком, а пьезокерамическим звуко‑излучателем от GPIO или формировать отправкой битового потока по SPI в режиме DMA.
9) Существуют ли в продаже микроконтроллеры с аппаратными корреляторами глубиной 2000+ семплов по 16-бит каждый? Это бы очень пригодилось для цифровой связи, радиолокации, дефектоскопов, УЗИ, сонаров и прочих ЦОС приложений.
10) Как определить разрешение по дальности для ФКМ импульсов? Когда зондирующий импульс кодируется модулированным BPSK пакетом.

