Звуковой Фазовый Дальномер (Микрофон = Датчик Расстояния)
Пролог
В этом исследовательском тексте я хотел бы проверить работу фазового детектора и понять, как меняется фаза сигнала при перемещении источника сигнала. Все эксперименты буду производить со звуком. Так проще записать и воспроизвести сигналы. Диктофоны есть в каждом мобильном телефоне. И DDS генератор тоже можно сделать из любого смартфона установив соответствующее мобильное приложение.
Каков план
Я намерен включить микрофон и двигать (ближе дальше) рядом с микрофоном источник звукового сигнала. Затем при помощи post обработки по возможности вычислить расстояние между микрофоном и источником звука.
Я собираюсь собрать вот такой программный SDR конвейер.
Я намерен, на много ни мело, записать синус и вычислить по *.wav файлу линейные координаты источника звука.
Что надо из оборудования?
№ | Аппаратура | Назначение |
1 | диктофон (смартфон №1) | для записи файла |
2 | звуко излучатель (смартфон №2) | для воспроизведения sin волны |
3 | персональный компьютер | для вычисления смещения фазы |
Что надо из софтвера?
# | Название программы | Назначение |
1 | Simple tone generator | Программируемый генератор сигналов (DDS) |
2 | Voice Recorder | Диктофон для мобильного телефона |
3 | Audacity | Анализатор звуковых файлов |
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. Пропустить через полосовой фильтр.
Сигнал с микрофона сильно зашумлен. Откроем программу Audiodacity и пропустим исходный сигнал в *.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.
График функции y=arccos (x)
Получается, что согласно (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. Поэтому разность фаз, в конечном, счете вносит погрешность в результат вычислений.
График расстояния от времени для покоящегося источника. Частота сигнала 600 Hz
Далее я это же расстояние 136 см измерял на частоте 500Hz. На этом графике первое число в ряде возможных расстояний получилось 13 см.
График расстояния от времени для покоящегося источника. Частота сигнала 500 Hz
Те же 136 см измеренные на 400 Hz. Получилось 29 см
В целом, полученные экспериментальные результаты укладываются в пределах погрешности в теорию.
Динамические измерения №1
Во время этого измерения я двигал диктофон в пределах 20 сантиметров. И можно заметить, что фаза принятого сигнала тоже изменялась. По крайней мере можно зарегистрировать факт шевеления аппаратуры.
Перемещение диктофона относительно излучателя. Частота сигнала 600Hz (длина волны 0.552 m)
Динамические измерения №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 |
ФНЧ | Фильтр нижних частот |
ЦОС | Цифровая обработка сигналов |
АЧХ | Амплитудно-частотная характеристика |
Ссылки
Вопросы
--Как можно синхронизовать по фазе два уделенных генератора звуковой частоты?