Пролог
В этом исследовательском тексте я хотел бы проверить работу фазового детектора и понять, как меняется фаза сигнала при перемещении источника сигнала. Все эксперименты буду производить со звуком. Так проще записать и воспроизвести сигналы. Диктофоны есть в каждом мобильном телефоне. И DDS генератор тоже можно сделать из любого смартфона установив соответствующее мобильное приложение.
Каков план
Я намерен включить микрофон и двигать (ближе дальше) рядом с микрофоном источник звукового сигнала. Затем при помощи post обработки по возможности вычислить расстояние между микрофоном и источником звука.
Я собираюсь собрать вот такой программный SDR конвейер.
Я намерен, ни много ни мело, записать синус и вычислить по *.wav файлу линейные координаты источника звука.
Что надо из оборудования?
№ |
Аппаратура |
Назначение |
1 |
диктофон (смартфон №1) |
для записи файла |
2 |
звуко излучатель (смартфон №2) |
для воспроизведения sin волны |
3 |
персональный компьютер |
для вычисления смещения фазы |
Что надо из софтвера?
# |
Название программы |
Назначение |
1 |
Simple tone generator (Android) |
Программируемый генератор сигналов (DDS) |
2 |
Voice Recorder(Android) |
Диктофон для мобильного телефона |
3 |
Audacity (Win) |
Анализатор звуковых файлов |
4 |
Toolchain для сборки программ на Си |
Для написания SDR обработки на PC |
Фаза 1: Записать звук в *.wav файл.
Прежде всего надо выбрать на какой частоте будем воспроизводить звук. Путь будет 700Hz (длинна волны равна 0.472 m). Получается, что генератор будет испускать звук вот по такому синус сигналу (1). Тут фаза генератора может быть от нуля до 2pi.
При помощи мобильного телефона я записал одноканальный *.wav файл, на частоте дискретизации 44100 Hz, 16 бит на семпл. Длительность записи 127.18 s.
I,[WAV] ChunkId:RIFF,ChunkSize:11217912 Byte,Format:WAVE,Subchunk1Id:fmt,
Subchunk1Size:16,AudioFormat:0x0001,NumChannels:1,
SampleRate:44100 Hz, ByteRate:88200 Byte,BlockAlign:2 Byte,
BitsPerSample:16 bit, Subchunk2Id:data,DataSize:11217876 Byte
I,[WAV] SampleCnt:5608938,SampleTime:22.676u s,PlayDir:127.186803 s
Вот можно проанализировать этот сигнал в программе Audacity.
то, что записалось на диктофон можно выразить вот этой функцией
x - это расстояние между спикером и микрофоном. A(x) - коэффициент затухания приёма. Монотонно убывающая функция, n - целое число. Чем больше расстояние, тем меньше A(x).
тут k - это волновое число. V - скорость звука (331 метров в сек), Лямбда - длина волны,
Фаза 2: Пропустить через полосовой фильтр.
Сигнал с микрофона сильно зашумлен. Откроем программу Audacity и пропустим исходный сигнал в *.wav файле через полосовой фильтр с границами 600 до 900 Hz. Дело в том, что мы работаем с частотой 700 Hz, поэтому всё, что далеко от 700 Hz для нас просто мусор.
Таким образом, я отсеиваю слагаемое noise(t). На данном этапе я получаю вот такой сигнал с микрофона.
Фаза 3: Нормализовать сигнал с микрофона
Дело в том, что амплитуда записанного сигнала A(x) меня особо не интересует. Я пытаюсь рассчитать расстояние анализируя только фазу записанного сигнала. Поэтому надо сделать так, чтобы микрофон всегда записывал сигнал с амплитудой 1. Для этого нужно синус нормализовать. Самый простой способ - это сделать однобитный синус. Однобитный по амплитуде. Для этого надо пропустить его через функцию sign.
Фаза 4: Перемножение записи с гетеродином
Для выделения фазы надо смешать сигнал с локальным осциллятором (гетеродином). Частота гетеродина точно такая же, как и частота несущей в излучаемом звуковом сигнале.
Для этого надо перемножить S_lo с S_rec
Чтобы понять как работает смеситель надо вспомнить школьную тригонометрию.
Формула 6 раскрывается в
тут
Если записать выход смесителя в отдельный wav файл то можно увидеть эту удвоенную частоту 1400 Hz после смесителя.
Фаза 5: Убрать двойную частоту фильтром низких частот (ФНЧ).
После смесителя у нас присутствует удвоенная частота несущей. Её мы уберём цифровым FIR фильтром нижних частот 200го порядка настроенного на частоту среза 10 Hz.
Фаза 6: Усилить на 2 (?)
Формально произведение синусов уменьшает амплитуду первого слагаемого на два. Поэтому интуитивно хочется восстановить амплитуду умножив сигнал на два.
Хотя в случае однобитного синуса домножать на 2 не нужно. Иначе аргумент в acos() будет зашкаливать. В аркосинус можно подавать числа от -1...1 Поэтому в своей программе я пропустил фазу 6.
Фаза 7: извлечь аргумент косинуса
Информация о расстоянии зашита в аргументе косинуса. Поэтому надо извлечь аргумент косинуса взяв арккосинус.
измеренную фазу можно условно обозначить греческой буквой пси
Фаза 8: выделить расстояние
Остается только выделить расстояние. Для этого надо поделить на k правую и левую часть.
или вот так
Вот и получается, что данный метод выдает не абсолютное расстояние до источника, а целый ряд возможных вариантов возможных расстояний, да ещё и размазанный с учетом некогерентности гетеродина генератора источника.
Вот мы и получили формулу для вычисления расстояния между передатчиком и приёмником. Тут стоит заметить, что acos() может принимать значения от 0 < acos(x)< pi.
Получается, что согласно (13) мы сможем получать расстояния только от нуля до X_max
Если мы хотим измерять расстояние, то надо увеличить диапазон. Надо увеличить выражение справа. Скорость звука в воздухе мы изменить не можем, так как это физическая константа 331 м/c. Вот и получается, чтобы увеличить диапазон надо уменьшать частоту сигнала. Однако и частоту звучания тоже уменьшать до нуля нельзя, так как AЧХ звуко излучателя, да и микрофона, сильно затухает на малых частотах.
Если, например, выбрать частоту сигнала 700 Hz, то получается, что микрофоном мы можем измерять расстояния от нуля до 0.2364 м. Не густо...
Эксперименты
Статические измерения
Источник звука неподвижно лежал на расстоянии 136 см от диктофона.
Записал в mono *.wav файл на частоте дискретизации 44100 Hz синус сигнал 600 Hz. Такой частоте соответствует длина волны 0.552 метров. Половина длинны волны составляет 0.275 метров.
Затем я пропустил wav файл через полосовой фильтр так, чтобы прошли все частоты от 500 Hz....до 700 Hz
Затем этот рафинированный сигнал я подал на обработку своей утилите.
Вот такой получился график расстояния от времени. Первый хороший знак в том, что получившееся расстояние в самом деле не меняется. Прям как в реальности! Моя утилита показывает, что расстояние получилось 6 сантиметров. Видимо в подлинное расстояние укладывается ещё 5 полудлин волн. Да и потом, мы же не знаем начальные фазы гетеродина phi_lo и звукоизлучателя phi_gen. Поэтому разность фаз, в конечном, счете вносит погрешность в результат вычислений.
Далее я это же расстояние 136 см измерял на частоте 500Hz. На этом графике первое число в ряде возможных расстояний получилось 13 см.
Те же 136 см измеренные на 400 Hz. Получилось 29см
В целом, полученные экспериментальные результаты укладываются в пределах погрешности в теорию.
Динамические измерения №1
Во время этого измерения я двигал диктофон в пределах 20 сантиметров. И можно заметить, что фаза принятого сигнала тоже изменялась. По крайней мере можно зарегистрировать факт шевеления аппаратуры.
Динамические измерения №2
На этом участке графика я удалялся от диктофона со звуко-излучателем в руках. Частота звука была 700 Hz.
Можно вычислить среднюю скорость движения источника звука.
А на этом участке графика я шагал быстрее. Тут средняя скорость получилась 0.79 m/s
Однако мне пока не понятно почему измеренное расстояние периодически уменьшалось. Я же всегда только удалялся от диктофона. Мне казалось, что измеренный x будет изменяться скачком.
Достоинства акустического фазового дальномера
++Высокая относительная чувствительность.
++Измерения происходят очень быстро, с частотой излучаемого сигнала.
++Доступность оборудования. Простота акустической аппаратуры в сравнении с обработкой радиоволн. Генерировать звук может вообще аналоговая электрическая цепь.
++Можно оценивать среднюю скорость движения источника звука прямо по изменению фазы
Недостатки акустического фазового дальномера
--Есть неоднозначность измерений. При непрерывном и равномерном удалении каждые полволны данные об измеренном расстоянии как будто зашкаливают и начинают изменяться в противоположном направлении.
--Для уменьшения погрешности надо как-то синхронизовать фазу источника звука и фазу гетеродина внутри приёмника. Без этой синхронизации разность начальных фаз может спокойно варьироваться от -pi до pi. В пересчете на длину волны это даст погрешность +/- половину длинны волны. Может быть нужен какой-то радио синхронизатор. Либо перед использованием подключить оба генератора к квадратурному энкодеру и добиться, того чтобы число ни увеличивалось ни уменьшалось. И только после этого начинать измерения.
--Каждый предмет, до которого надо измерять расстояние должен звенеть на постоянной и стабильной частоте. То есть со стороны передатчика это активная система, а значит нужно вспомогательное оборудование и электропитание для него.
--Звук довольно быстро ослабевает. Уже на расстоянии 20 метров телефонного спикера на громкой связи практический не слышно.
--Интерпретировать расстояние извлеченное из фазы сложно. При монотонном увеличении реального расстояния измеренное расстояние, то монотонно возрастает, то монотонно убывает. Как с этим работать мне пока не совсем ясно.
--Эффект Доплера тут работает как помеха. Можно спутать с нестабильностью кварца.
Идеи проектов на фазовом дальномере
++Можно сделать датчик нарушения состояния покоя. Это особенно полезно в охранных системах, например в музеях.
Возможные направления развития.
Было бы здорово делать эти измерения в реальном масштабе времени. Например на FPGA или на микроконтроллере со встроенным аппаратным цифровым фильтром. Причём так, чтобы источник излучал две частоты (например DTMF сигнал). В таком случае получится уменьшить неоднозначность абсолютной величины дальности.
Потом всё то же самое можно ведь проделать не только для звука, но и для радиоволн. Радиоволны не затухают так быстро как звук и радиоволны не раздражают человека как звук своим шумом.
Итоги
Мне удалось убедиться, что анализируя фазу в самом деле можно в некоторой степени оценивать расстояние между спикером и диктофоном.
При этом абсолютного измерения расстояния сделать просто так не получится. Для вычисления абсолютного расстояния надо производить измерения на разных частотах, а затем решать системы линейных уравнений.
При этом очень желательно синхронизовать фазу у гетеродина и излучателя.
Как по мне эта технология измерения расстояния по изменению фазы может быть отличной иллюстрацией для изучения цифровой обработки сигналов в ВУЗах. Мобильные телефоны есть у всех, значит, оборудование покупать не надо. При этом тут вам и метрология, цифровая фильтрация, разбор *.wav файла, программирование на Сях, смесители (перемножители), тригонометрия, системы уравнений и прочее.
Я считаю что именно на таких практических примерах и следует изучать цифровую обработку сигналов (ЦОС). Чтобы DSP не казалась эфемерной теорией.
Словарь
Акроним |
Расшифровка |
DDS |
Direct digital synthesis |
wav |
Waveform Audio File Format |
DTMF |
Dual-tone multi-frequency signaling |
LO |
Local Oscillator |
SDR |
Software Defined Radio |
LPF |
Low-pass filter |
ФНЧ |
Фильтр нижних частот |
ЦОС |
Цифровая обработка сигналов |
АЧХ |
Амплитудно-частотная характеристика |
Ссылки
Вопросы
--Как можно синхронизовать по фазе два уделенных генератора звуковой частоты?
Комментарии (68)
diakin
02.10.2024 21:40Надо нормальный микрофон с усилителем, брать Arduino\STM32, оцифровывать отраженный сигнал с помощью АЦП, сохранять в массив. Потом вычислять спектр. Запускать процесс измерения отраженного сигнала (например) по переходу через 0 сигнала генератора, соответственно останавливать измерения, когда пройдет нужное число периодов сигнала. например 4. Тогда в спектре это будет 4-я гармоника. Ее фаза тогда будет равна фазовому сдвигу между сигналом генератора и отраженным. Фильтров никаких не надо, в спектре все разнесено по частотам. Вопрос только - как предотвратить прямое попадание сигнала излучателя в микрофон, прямой сигнал смешается с отраженным и будет искажать фазу.
aabzel Автор
02.10.2024 21:40Надо нормальный микрофон с усилителем, брать Arduino\STM32, оцифровывать отраженный сигнал с помощью АЦП, сохранять в массив.
Вы можете порекомендовать отладочную плату с микроконтроллером, аудиокодеком и SD картой?
diakin
02.10.2024 21:40А зачем там аудиокодек? Сохраняете отсчеты в массив и делаете БПФ. Хотя это другой метод, без гетеродина.
>Частота гетеродина точно такая же, как и частота несущей в излучаемом звуковом сигнале.
В качестве источника опорного сигнала для гетеродина лучше брать сигнал генератора с объекта (по проводам) Тогда частоты точно будут одинаковыми и фаза будет стабильна.
pwl
02.10.2024 21:40+4для дальномера такая технология подходит мало:
скорость звука в воздухе не стабильна
никогда не знаешь отражение от которой из поверхностей будет сильнее - от стены с обоями, в которую ты целишься, или от гладкого твердого потолка.
отражения от разных объектов складываются создавая новый виртуальный объект, там где физически ничего нет.
хорошо подходит для детектирования разного рода движения:
кто-то пришел/ушел
распознавание жестов
определение частоты дыхания
есть статья где даже пульс измеряли по движению грудной клетки
в принципе как дальномер тоже используется, но в контролируемом пространстве - например для измерения уровня жидкости в баке.
Советы:
не используйте "С" на этапе экспериментов. Когда надо будет делать конечное устройство с готовым алгоритмом - тогда да. Для экспериментов есть python с numpy, scipy, matplotlib и juniper notebook. С ними скорость разработки вырастет в десятки раз.
избегайте использования телефонов в этом деле. Получить чистый необработанный сигнал от них сложно, иногда невозможно. Любая копеечная аудиокарта будет лучше (но не встроенный в ноутбук микрофон - там те же проблемы).
ну и погуглите. Тема сильно не новая, есть множество интересных статей на эту тему.
Ах, да, забыл сказать. Алгоритм, который вы пытаетесь изобрести называется FMCW https://en.wikipedia.org/wiki/Continuous-wave_radar
aabzel Автор
02.10.2024 21:40никогда не знаешь отражение от которой из поверхностей будет сильнее - от стены с обоями, в которую ты целишься, или от гладкого твердого потолка.
отражения от разных объектов складываются создавая новый виртуальный объект, там где физически ничего нет.
В моем тексте ни слова про отражения. Это полностью пассивные измерения. Приёмник ничего не излучает.
pwl
02.10.2024 21:40+3"Полностью пассивный" - это когда ваша конструкция ничего не излучает, а вы просто слушаете звук, и измеряете расстояние до, скажем, колонок соседа-меломана.
А раз уж у вас стоит вопрос "Как можно синхронизовать по фазе два уделенных генератора звуковой частоты?", то ни о какой пассивности речи не идет.
То что вы хотите измерять расстояние не до точки отражения, а до самого источника излучения ровно ничего не меняет в методах и алгоритмах. С отражениями вам все также придется иметь дело. И да, амплитуда отраженного сигнала запросто может превышать прямой.
aabzel Автор
02.10.2024 21:40не используйте "С" на этапе экспериментов. Когда надо будет делать конечное устройство с готовым алгоритмом - тогда да. Для экспериментов есть python с numpy, scipy, matplotlib и juniper notebook. С ними скорость разработки вырастет в десятки раз.
Плохой совет. То что написано на Cи можно мигрировать куда угодно: MCU, PC, ядро OS.
А то, что написано на python - это скрипты-однодневни, которые вскоре оказываются в корзине. Да ещё и Python тупой синтаксис.
aabzel Автор
02.10.2024 21:40Алгоритм, который вы пытаетесь изобрести называется FMCW
Это не FMCW. В тексте приемник ничего предварительно не излучал.
aabzel Автор
02.10.2024 21:40+1избегайте использования телефонов в этом деле. Получить чистый необработанный сигнал от них сложно, иногда невозможно. Любая копеечная аудиокарта будет лучше (но не встроенный в ноутбук микрофон - там те же проблемы).
Вы можете порекомендовать отладочную плату с микроконтроллером, аудиокодеком и SD картой?
pwl
02.10.2024 21:40зачем вам именно плата? просто микрофон на длинном проводе будет в разы удобнее.
Если вы хотите именно плату, то любой одноплатник справится. любой из raspberry, например (ну кроме pico).
Если вы хотите именно микроконтроллер, то это уже из области "желает странного". Много геморроя с неясными целями. Но опять-же выбор огромный, практически любой контроллер умеет в sdio и i2s. Ну скажем https://www.st.com/en/evaluation-tools/nucleo-h7s3l8.html
Хотя можно и на blue pill сделать.
alcotel
02.10.2024 21:40+1Orange Pi, Repka Pi. Не совсем микроконтроллер, но звук в отличии от малинки там нормально выведен. Ну и во всех мк есть АЦП, а во многих и ЦАП. Таймеры для генерации тона тоже не запрещены.
В смартфонах часто используют программные шумодавы и улучшайзеры, без возможности отключения. Скрывают низкое качество микроскопического встроенного микрофона. Можно нарваться на фазовые искажения.
ciuafm
02.10.2024 21:40+2Проблема целого количества периодов до объекта решается измерением расстояния на нескольких некратных частотах. Но если хотите делать это одновременно нужно убрать нормирование сигнала из алгоритма.
iliasam
02.10.2024 21:40Я так понял, что пока передатчик и приемник не имеют другой связи, кроме как через звук, абсолютное расстояние не измерить.
aabzel Автор
02.10.2024 21:40Абсолютное расстояние можно измерить сонаром, который измеряет TOF.
А если наблюдать за фазой, то тут измерять на разных частотах, синхронизовать гетеродин и решать СЛАУ.iliasam
02.10.2024 21:40+4"синхронизовать гетеродин"
Только на приемнике?
Фазовыми методами расстояние измерить можно, если приемник связан с передатчиком линией связи известной длинны. В лазерных рулетках (использующих фазовый метод измерения расстояния) приемник и передатчик находятся в одном корпусе, расстояние между ними фиксированное, и они, конечно, электрически связаны.
А если нет способа синхронизировать приемник и передатчик между собой, то и абсолютное расстояние не измерить. Никак.aabzel Автор
02.10.2024 21:40Только на приемнике?
На передатчике тоже. Теоретически можно же по радио попробовать получать синхронизацию фазы генератора на передатчике и гетеродина на приемнике.
Радиоволны намного быстрее звука.
Надо лишь сделать какой-то радио синхронизатор.
strvv
02.10.2024 21:40Можно качая частоту подобрать сочетания максимумов/минимумов.
По аналогии с gps - на одном видимом спутнике ты ничего не увидишь, сфера вокруг точки спутника,
На двух видимых - некое "кольцо" координат,
На трех можно триангулировать точку.
Но в реальности - чем больше спутников, тем быстрее и точнее ты находишь максимум твоего возможного местонахождения.По статье - можно сделать излучение и приём на одном передатчике/приемнике, а можно использовать, как у УЗ радаров-парктроников - 3/4 радара и поочередно на 40кГц они излучают пакеты,
а вот как они узнают - тут можно гадать - и многоточечный прием, и прием на тот же приемо-передатчик, и поиск отклика.
А для вот такого как в статье отклика - можно использовать, меняя длительность пакета, т.е. n-циклов излучение, m-циклов прием, ожидание изменения амплитуды скользящим окном.
Пришёл отклик - сделал другой длины пакет - поиск кратного...
Поэтому достаточно долго первоначально они ищут расстояние, потом достаточно точно и на дорогих заметил - отражением от других источников вычисляют где есть отражающее препятствие.
aabzel Автор
02.10.2024 21:40Пусть излучатель посылает bpsk сигнал непрерывно 010101. Тогда приемник сможет подстроить свою фазу гетеродина через Costas loop.
Вот и получится синхронизация фазы излучателя и гетеродина.
iliasam
02.10.2024 21:40+1Приемник может подстроить фазу своего гетеродина и под принятую синусоиду.
Для того, чтобы измерить абсолютное расстояние, нужно, чтобы синхронизация фаз передатчика и приемника не зависела от расстояния, а этого нельзя добиться, используя передачу данных только в одну сторону. При этом не важно, какая там используется модуляция, не важно, импульсный принцип, или фазовый.
alcotel
02.10.2024 21:40...И измеренное расстояние окажется навсегда зафиксировано, к сожалению.
Если бы у звука была бы значительная дисперсия, разность скоростей в зависимости от частоты, как у волн на воде, можно было бы и без прямой синхронизации обойтись. А так - только по отдельному каналу с другой скоростью (радио, провод, ИК)
aabzel Автор
02.10.2024 21:40Но если хотите делать это одновременно нужно убрать нормирование сигнала из алгоритма.
Почему? Можно же сначала полосовым фильтром выделить нужную несущую, а затем выполнить её нормирование. И подавай в смеситель.
kenomimi
02.10.2024 21:40Подкину еще идейку для исследований: 4 микрофона, сенсорный экранчик и какой-нибудь жирный stm32, например. На экране показывать точкой примерно расположение самого сильного источника звука, и расстояние до него, а двумя ползунками регулировать частоты низ-верх, которые нам интересны.
aabzel Автор
02.10.2024 21:40Зачем сенсорный экран? Параметры можно смотреть и задавать через UART CLI.
aabzel Автор
02.10.2024 21:40+1Подкину еще идейку для исследований: 4 микрофона
Это называется Sound Source Localization (SSL)
https://www.youtube.com/watch?v=erwi-TFy5Dk
американские школьники это делают в 7м классе
AlexTmp8
02.10.2024 21:40+1Интересная задумка, но я не понимаю как вы без синхронизации фазу определяете.
она же будет случайной и определяется моментом нажатия кнопки запись на телефоне.
или я что-то не понял в эксперименте.aabzel Автор
02.10.2024 21:40+1как вы без синхронизации фазу определяете.
Да. Определяю фазу без синхронизации. Абсолютное значение без синхронизации генераторов тут не получить.
Зато можно зарегистрировать факт перемещения источника/приёмника.niktor_mpt
02.10.2024 21:40+2Прикиньте, сколько у вас появится дополнительной информации, если пошлёте ещё один синус с некратной частотой.
nikolz
02.10.2024 21:40+1Можете пояснить как Вы сделали синхронизацию по фазе излучаемого сигнала и опорного в точке приема?
-----------------
Чем Ваш вариант лучше импульсного ультразвукового датчика?
aabzel Автор
02.10.2024 21:40как Вы сделали синхронизацию по фазе излучаемого сигнала и опорного в точке приема?
Хороший вопрос. Пока никак. Синхронизацию по фазе - это тема для дальнейших исследований.
nikolz
02.10.2024 21:40+1Тогда можете пояснить как Вы измерили разность фаз и расстояние по этой разности?
Если нет синхронизации, то относительно чего Вы измеряете сдвиг фазы в зависимости от расстояния?
aabzel Автор
02.10.2024 21:40Если нет синхронизации, то относительно чего Вы измеряете сдвиг фазы в зависимости от расстояния?
Относительно предыдущего положения спикера.
nikolz
02.10.2024 21:40+1Вы не ответили.
Повторю вопрос. Как Вы измеряете разность фаз между излученным сигналом и принятым?
Вы не знаете в точке приема расстояния до точки излучения и не знаете момент излучения. Верно?
Тогда Вы не можете определить расстояние даже теоретически.
Если Вы измеряете каким-то образом расстояние от предыдущего положения излучателя, то Вы измеряете разность расстояний до приемника.
Но и для такого измерения надо синхронизировать момент излучения относительно предыдущего.
Если Вы измеряете пространственную разность фаз, то микрофон и динамик должны иметь узкую диаграмму направленности.
Вы пытаетесь реализовать пеленгацию по звуку.
Известно, что применение непрерывного сигнала (Ваш случай) проигрывает в дальности импульсному сигналу (ультразвуковой датчик).
В чем преимущество Ваше варианта? Какие теоретические подтверждения работоспособности Вашей реализации без синхронизации?
--------------------------
На основе датчика TOF легко измерял расстояние до 8 метров с погрешностью примерно 1%.
iliasam
02.10.2024 21:40+2Насколько я понял, автор все-таки не дальномер сделал, а просто наблюдает, как меняется фаза сигнала при перемещении микрофона.
Говоря по другому, к качестве опорного сигнала для измерения разности фаз, используются сколько-то первых семплов записи.
Можно сравнить такую конструкцию с линейным инкрементальным энкодером, который тоже не дает информации об абсолютном положении.Интересно, что если проводить аналогии с энкодерами, можно вспомнить, что не зря они делаются квадратурными - это нужно, чтобы можно было измерять направление сдвига. Подозреваю, что и со звуком выходит тоже самое - только с одной частотой нельзя точно определить направление сдвига микрофона. Отсюда и неопределенности, которые упоминаются в статье.
Вот тут и может пригодится передача сигнала на нескольких частотах. Но абсолютное расстояние таким образом не получить.
dmitrodem
02.10.2024 21:40так все ж уже украдено до нас. Техника называется FMCW (frequency modulated continuous wave), активно применяется для радаров (измерить расстояние и скорость).
aabzel Автор
02.10.2024 21:40Цель моего текста даже не в том чтобы сделать дальномер, а в том, чтобы предложить использовать аудио обработку для изучения основ ЦОС в институтах.
Moog_Prodigy
02.10.2024 21:40+1Подобная техника применяется в системах захвата движений (motion capture). На человека вешается куча маленьких излучателей, он перемещается по комнате, делает какие-то движения, вокруг него в комнате массив приемников. Система записывает все его движения, которые потом можно передать в программу для 3д анимации и обойтись без моделирования движений вручную.
Еще такая система внедрялась в каком-то американском университете, давненько правда читал про это, по всем помещениям раскиданы приемники звука, у каждого человека есть маленький передатчик с кнопкой. При нажатии на кнопку система определяет его положение с точностью до сантиметров, и что-то делает. Там было такое - пишешь на post-it надпись "выключатель света" и лепишь его где угодно. Затем в системе прописываешь сценарий, и потом достаточно щелкнуть мини-передатчиком около этого листика - и включается-выключается свет.
Но эти системы все работают на ультразвуке, причем довольно высоком - 40-60 кГц. Точность там до миллиметров в motion capture.
iShrimp
02.10.2024 21:40+1Как уже верно заметили, с помощью периодического сигнала нельзя измерить задержку, большую его периода. Так почему бы не использовать широкополосный сигнал?
Простейший случай - зондирование одиночными импульсами (в пределе - дельта-функция Дирака) - хорошо работает только в полной тишине. Из-за малой энергии импульса любой посторонний шум будет мешать измерению.
Если подавать много импульсов случайным непериодическим образом (в пределе - белый шум), то можно вычислить корреляцию между выходным и входным сигналами и найти импульсную характеристику системы, которая состоит из главного пика (кратчайший путь звуковой волны) и множества вторичных пиков. См. эксперименты на Pixilang. Недостатки данного метода: шум отфильтровывается очень медленно, его амплитуда снижается пропорционально квадратному корню из количества семплов; АЧХ генерируемого сигнала также носит случайный характер и может содержать пики и провалы (что снижает точность деконволюции из-за возможных делений на числа, близкие к 0).
Улучшить отношение сигнал/шум можно, используя псевдослучайную М-последовательность. Она обладает ровной АЧХ и минимальным пик-фактором. Хотя она и является периодической с периодом 2^N-1, этот период может быть сколь угодно большим, что позволит измерять любые реально возможные задержки. Недостаток - период не является точной степенью двойки, что несколько усложняет вычисление БПФ.
Объединяя перечисленные идеи, мы можем создать периодический шум с ровной АЧХ и периодом 2^N для удобства вычислений. Для этого в частотном пространстве заполняем массив комплексными числами с единичной амплитудой и случайной фазой. Вычисляем обратное БПФ и получаем периодический шум, который транслируем с передатчика. На приёмнике вычисляем БПФ, делим полученный спектр на спектр исходного сигнала (деконволюция) и вычисляем обратное БПФ, получая импульсный отклик системы. Недостаток метода - большой пик-фактор шумового сигнала, что ухудшает сходимость из-за нелинейных искажений. Пики можно частично устранить оптимизацией (срезаем пики и нормируем амплитуды к 1).
Наконец, самый сложный, но самый универсальный метод - сгенерировать частотно-модулированный синусоидальный сигнал. Он требует более сложной математической обработки, но позволяет не только получить импульсную и частотную характеристики, но и проанализировать нелинейные искажения (PDF).
antonluba
02.10.2024 21:40MLS еще хорош тем, что принципиально не нужно синхронизировать приемник и передатчик.
В частности, при акустических измерениях (программа ARTA, например) позволяет точно определить не только АЧХ и ФЧХ измеряемого динамика, но и задержку распространения сигнала, а значит - расстояние от излучателя до микрофона.
zhogar
02.10.2024 21:40Как можно синхронизовать по фазе два уделенных генератора звуковой частоты?
Не знаю, может глупо конечно, но первое что пришло на ум, - это помимо приемника, иметь на определенном расстоянии ещё один (второй) источник звука, неподалеку от приемника, под известным углом "альфа" векторами направленности вашего приемника и второго источника звука.. Далее.. Принимая сигнал, от основного (измеряемого) источника, можно примерно настроить (второй источник звука) на высшую гармонику звука первого источника.. Далее.. И подгоняя в небольших приделах (ваш второй источник звука) по частоте, или фазе (прерывая или начиная колебания).. Внимание.. Возможно удастся сопоставить (настроить) на резонанс источник 1 и источник 2.. по средствам вашего приемника, понимать это, амплитудой, или ещё как.. тем самым, получается, вы точно будете знать частоту источника 1.. и подстроите по фазе ваш приемник, как результат.. Надеюсь более менее понятно, о чем я говорю.. Спасибо! Материал отличный!
zhogar
02.10.2024 21:40Если вкратце, то представьте себе настройку гитары, с специальным запущенным приложением на вашем телефоне.. В телефоне, строго известные частоты всех нот, и строя.. (примем их за источники звука 1).. подстраивая колки на своей гитаре (примем за источник звука 2), вы пытаетесь найти подходящую ноту строго заданной струны, до тех пор, пока ваша струна гитары и издаваемый приложением звук, не будут звучать в унисон.. Найдя нужную ноту, вы можете измерить частоту колебания струны, тем самым зная ещё и фазу колебаний.. как-то так, на мой взгляд..
pwl
02.10.2024 21:40если вы знаете угол "альфа" и расстояние между приемником и вторым источником, то вам не нужен звук. вам нужен учебник по геометрии :)
zhogar
02.10.2024 21:40+1Нет, изначально угол между приемником, и источником 1, неизвестен.. известен угол между приемником и источником звука 2 (который в последнем случае вы вводите целенаправленно).. на основе этого, вы путем подстраивания частоты и фазы источника 2.. можете добиться резонанса с источником 1, тем самы уже понимая его "точные" частоту и фазу, и внося всвязи с этим корректировку в расчет при приеме звука.. p.s.. не внимательно поняли мысль, что я пытался донести..
Gudd-Head
02.10.2024 21:40+3Боже, что я сейчас прочитал? Это у вас не дальномер. Это максимум детектор быстрого движения.
Из-за некогерентности излучаемого и принимаемого сигнала вы не отличите медленное движение от разности частот генераторов.
Перемножив сигналы, вы убили информацию о направлении движения (умножение ассоциативно).
Было бы здорово делать эти измерения в реальном масштабе времени. Например на FPGA
И это действительно сделано на ПЛИС: 2 синуса оцифровываются и подаются на фильтры (преобразователи) Гильберта, на выходе каждого получается 2 сигнала: синус и косинус (это позволяет отвязаться от абсолютной амплитуды). Далее эти сигналы продаются на два atan2, на выходе которых - фаза изначального синуса. Далее берётся разность этих фаз (вычитание не ассоциативно). Подробный проход позволяет вычислять относительную разность частот порядка 10^(-8).
zhogar
02.10.2024 21:40+3А вообще, при таких расчетах, не плохо бы иметь данные с метеостанции в режиме реального времени: давление, температура, влажность, скорость и направление ветра.. так как утверждение, что скорость звука в воздушной среде, 331 м/с - является константой?!.. весьма сомнительно.. потому как скорость звука зависит от всех этих параметров, а конкретно от плотности воздушной массы.. да и плюс, поправка на эффект Доплера, должна быть в обязательном порядке..
Moog_Prodigy
02.10.2024 21:40+1Влажность, температура, давление - все влияет. Ненамного, но в целом выходит приличный разброс. И метеостанции(датчики) мелкие китайские все это дело измеряют легко и дешево.
Меня в свое время интересовала система тачскрина на ультразвуке. Обычное тонкое стекло поверх экрана. Четыре датчика в углах экрана. У них есть два сценария: 1. нажатие пальцем, как в смартфоне. 2.тапание пальцем, ногтем или стилусом. Подходы разные, во втором случае идут тупо фильтры, триангуляция, а вот в первом случае там есть еще генератор ультразвука, условно говоря пьезоэлемент, который колеблет само стекло на очень высокой частоте порядка мегагерца, внутри ПЛИС заложена калибровочная матрица отражений и стоячих волн. Простое касание пальцем\предметом меняет картину, это все как-то обрабатывается и по сути работает очень круто и отзывчиво, очень похоже на современные емкостные матрицы телефонов, технология в народ не пошла из-за сложности, но вот DIY ее реализовать можно, правда не знаю насколько упоротый матан там должен крутиться.
niktor_mpt
02.10.2024 21:40Интересная технология. Имеет смысл, когда емкостные/индуктивные датчики не работают.
Ссылку на какую-нибудь статью или англоязычное название привести не могли бы?
Матан - ну расчёт колебаний плоской мембраны с/без демпфера в точке х,у не представляется сложным.
Можно рассмотреть одномерный случай - электрогитара, струна, кривой гитарист, берущий флажолеты :).
niktor_mpt
02.10.2024 21:40Влажность, температура, давление - все влияет. Ненамного, но в целом выходит приличный разброс.
Поэтому, измеряя расстояние по воздуху на эталонной дистанции, можно измерить скорость и направление ветра и что-нибудь из давления, влажности, температуры.
zhogar
02.10.2024 21:40Я от том, что к примеру в летнее время года, и к примеру, в зимнее время года, скорость звука в среде, будет отличаться.. и соответственно все эти факторы все нужно учитывать..
alcotel
02.10.2024 21:40+2Что-то Вы сильно переусложнили математику. Для детектирования фазы стандартно применяют квадратурный смеситель, он же приёмник прямого преобразования.
Узкополосную фильтрацию специально делать не надо, она в итоге делается выходными LPF. Отдельным узкополосным фильтром Вы только фазу ещё дополнительно подвинете в неизвестном направлении.
Однако мне пока не понятно почему измеренное расстояние периодически уменьшалось
После LPF фаза вычисляется, как аргумент arg( Re(S) + i Im(S) ), он же atan2() в Си. Он же делает ненужной нормализацию сигнала. Применив acos() Вы получили неоднозначность по направлению перемещения, и работу в пределах половины длины волны.
Нормализацией в виде sign() Вы внесли фазовые искажения. Дискретизировали фазу. Частота дискретизации-то не сильно большая. Поэтому и выходной сигнал стал грязнее.
Эффект Доплера тут работает как помеха. Можно спутать с нестабильностью кварца
Вообще-то вы именно эффект Доплера и измеряете. Вы передвигаете приёмник, частота сигнала меняется от скорости, соответственно, двигается его фаза относительно опорного сигнала. И Вам ещё очень повезло, что кварцы в обоих смартфонах оказались с достаточно близкой частотой.
Ну и как тут говорят, обработав две, не кратные друг-другу, частоты вы имеете шанс получить нониус, как у штангенциркуля. Например F и F*sqrt(2). Звучать, конечно, это адски будет - уменьшенная квинта, один из самых мерзких музыкальных интервалов.
Sdima1357
02.10.2024 21:40+3Шумомодобный сигнал, проходящий на два разнесеннх преемника определяет множество точек пространстве ,без одной степени свободы ,где может находиться источник , те убирает одну степень свободы из трех и определяют скорее всего плоскость. Добавьте ещё один микрофон, отнимите ещё одну степень свободы. Четыре микрофона , расположенные в углах пирамиды дадут 3 соординаты.
alcotel
02.10.2024 21:40И в обратную сторону это работает: один приёмник и 4 передатчика. GPS называется.
4 приёмника или 4 передатчика синхронизировать всё равно нужно. Зато один, подвижный, действительно может работать автономно.
Sdima1357
02.10.2024 21:40Черыре приемника достаточно синхронизировать только между собой, что не сложно поскольку они рядом , на небольшим расстоянии друг от друга. Но точность определения координат источника быстро падает с увеличением расстояния от пирамиды приемников до источника.. один из приёмников выбирается за базовый, после этого с помощью корреляции с другими получаем три временных разности со знаком и они однозначно определяют координаты источника в системе координат пирамиды приемника
zhogar
02.10.2024 21:40Вы говорите совершенно правильно, своего рода триангуляция, по которой собственно не сильно сложно будет определить разницу времени, приходящего сигнала, на указанные три приемника.. вычислить тем самым углы наклона векторов приходящего сигнала, и как следствие определить расстояние до источника звука.. но есть некая условность, на низкой частоте сигнала, мы должны разнести эти три приемника, минимум на пару метров друг от друга.. иначе можно не получить, сколь значимого значения разницы между приходящим сигналом на приемники..
Sdima1357
02.10.2024 21:40на низкой частоте сигнала
Белый шум, щелчки etc. https://habr.com/ru/articles/847122/comments/#comment_27379532
zhogar
02.10.2024 21:40+1Посмотрите в эту сторону, может быть это как-то вам поможет..
Модуль подводного ультразвукового дальномера. Часть 1
Модуль подводного ультразвукового дальномера. Часть 2
Модуль подводного ультразвукового дальномера. Часть 3Сюда..
Делаем гидрофон и записываем звук трескающегося льда
Почему звук в воде затухает?И это..
Вы делаете это неправильно: расчет глубиныP.s.. только в вашем случае, будет перерасчёт на воздух и более низкие частоты, нежели ультра звук..
P.ps.. Так же, не стоит забывать, что в случае воздушной среды (да и воды думаю тоже), вы имеете градиент плотностей, температур и "влажности", по большому счету.. на пути следования сигнала от источника, до вашего приемника..
Спасибо
m1kr1k
Отличная лабораторная работа!