Звуковой Фазовый Дальномер (Микрофон = Датчик Расстояния)

в 20:45, , рубрики: FIR, post-processing, SDR, балансный смеситель, смеситель, уравнение бегущей волны, Фазовые дискриминаторы, фазовый дальномер, фазовый детектор, цос

Пролог

В этом исследовательском тексте я хотел бы проверить работу фазового детектора и понять, как меняется фаза сигнала при перемещении источника сигнала. Все эксперименты буду производить со звуком. Так проще записать и воспроизвести сигналы. Диктофоны есть в каждом мобильном телефоне. И DDS генератор тоже можно сделать из любого смартфона установив соответствующее мобильное приложение.

Каков план

Я намерен включить микрофон и двигать (ближе дальше) рядом с микрофоном источник звукового сигнала. Затем при помощи post обработки по возможности вычислить расстояние между микрофоном и источником звука.

Я собираюсь собрать вот такой программный SDR конвейер.

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 1

Я намерен, на много ни мело, записать синус и вычислить по *.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.

S_{tx}(t)=sin (2pi f_{sig}t+varphi _{g})  qquad  qquad (1)

При помощи мобильного телефона я записал одноканальный *.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.

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 3

то, что записалось на диктофон можно выразить вот этой функцией

S_{rec}(x,t)=A(x) sin (2pi f_{sig}t-kx+varphi _{g}+ 2pi n) + noise(t)  qquad  qquad (2)

x - это расстояние между спикером и микрофоном. A(x) - коэффициент затухания приёма. Монотонно убывающая функция, n - целое число. Чем больше расстояние, тем меньше A(x).

k=frac{2pi}{lambda }  qquad qquad (3)

тут k - это волновое число. V - скорость звука (331 метров в сек), Лямбда - длина волны,

lambda=frac{V м/c}{f_{sig}  Hz}  qquad qquad (4)

Фаза 2: Пропустить через полосовой фильтр.

Сигнал с микрофона сильно зашумлен. Откроем программу Audacity и пропустим исходный сигнал в *.wav файле через полосовой фильтр с границами 600 до 900 Hz. Дело в том, что мы работаем с частотой 700 Hz, поэтому всё, что далеко от 700 Hz для нас просто мусор.

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 7

Таким образом, я отсеиваю слагаемое noise(t). На данном этапе я получаю вот такой сигнал с микрофона.

S_{rec}(x,t)=sin (2pi f_{sig}t-kx+varphi _{g}+ 2pi n) qquad  qquad (5)

Фаза 3: Нормализовать сигнал с микрофона

Дело в том, что амплитуда записанного сигнала A(x) меня особо не интересует. Я пытаюсь рассчитать расстояние анализируя только фазу записанного сигнала. Поэтому надо сделать так, чтобы микрофон всегда записывал сигнал с амплитудой 1. Для этого нужно синус нормализовать. Самый простой способ - это сделать однобитный синус. Однобитный по амплитуде. Для этого надо пропустить его через функцию sign.

Фаза 4: Перемножение записи с гетеродином

Для выделения фазы надо смешать сигнал с локальным осциллятором (гетеродином). Частота гетеродина точно такая же, как и частота несущей в излучаемом звуковом сигнале.

S_{lo}(t)=sin (2pi f_{sig}t+varphi _{lo})  qquad  qquad (6)

Для этого надо перемножить S_lo с S_rec

S_{lo}(t)*S_{rec}(t)=sin(2pi f_{sig}t+varphi _{lo})sin(2pi f_{sig}t-kx+varphi _{g}+ 2pi n)  qquad (7)

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

sin (alpha )sin(beta )=frac{cos(alpha -beta )-cos(alpha +beta )}{2}  qquad  quad (8)

Формула 6 раскрывается в

S_{lo}(t)*S_{rec}(t)=frac{1}{2}[cos(kx+varphi _{diff} + 2pi n )-cos(4pi f_{sig}t-kx+varphi _{g}+varphi _{lo})])  qquad (9)

тут

varphi _{diff}=varphi _{lo}-varphi _{gen}   qquad  qquad  (10)

Если записать выход смесителя в отдельный wav файл то можно увидеть эту удвоенную частоту 1400 Hz после смесителя.

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 14

Фаза 5: Убрать двойную частоту фильтром низких частот (ФНЧ).

После смесителя у нас присутствует удвоенная частота. Её мы уберём цифровым FIR фильтром 200го порядки нижних частот настроенным на частотой среза 10 Hz.

LPF[S_{lo}(t)*S_{rec}(t)]=frac{1}{2}cos(kx+varphi _{diff} )  qquad (11)

Фаза 6: Усилить на 2 (?)

Формально произведение синусов уменьшает амплитуду первого слагаемого на два. Поэтому интуитивно хочется восстановить амплитуду умножив сигнал на два.

2LPF[S_{lo}(t)*S_{rec}(t)]=cos(kx+varphi _{diff} + 2pi n)  qquad (12)

Хотя в случае однобитного синуса домножать на 2 не нужно. Иначе аргумент в acos() будет зашкаливать. В аркосинус можно подавать числа от -1...1 Поэтому в своей программе я пропустил фазу 6.

Фаза 7: извлечь аргумент косинуса

Информация о расстоянии зашита в аргументе косинуса. Поэтому надо извлечь аргумент косинуса взяв арккосинус.

psi=acos(2LPF[S_{lo}(t)*S_{rec}(t)])=kx+varphi _{diff}+2pi n   qquad (13)

измеренную фазу можно условно обозначить греческой буквой пси

psi=acos(2LPF[S_{lo}(t)*S_{rec}(t)]) qquad (14)

Фаза 8: выделить расстояние

Остается только выделить расстояние. Для этого надо поделить на k правую и левую часть.

frac{ psi -varphi _{diff}+ 2pi n}{k}=x  qquad (15)

или вот так

x=frac{lambda  [  psi -varphi _{diff}+ 2pi n]}{2pi}    qquad (16)

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

x(n)=frac{lambda    psi }{2pi} + frac{lambdavarphi_{diff}}{2pi}   + lambda n    qquad (17)

Вот мы и получили формулу для вычисления расстояния между передатчиком и приёмником. Тут стоит заметить, что acos() может принимать значения от 0 < acos(x)< pi.

График функции y=arccos(⁡x)

График функции y=arccos(⁡x)

Получается, что согласно (13) мы сможем получать расстояния только от нуля до X_max

x_{max}=frac{lambda  pi}{2pi}=frac{lambda}{2}=frac{V_{sound}}{2 f_{signal}}    qquad (18)

Если мы хотим измерять расстояние, то надо увеличить диапазон. Надо увеличить выражение справа. Скорость звука в воздухе мы изменить не можем, так как это физическая константа 331 м/c. Вот и получается, чтобы увеличить диапазон надо уменьшать частоту сигнала. Однако и частоту звучания тоже уменьшать до нуля нельзя, так как AЧХ звуко излучателя, да и микрофона, сильно затухает на малых частотах.

Если, например, выбрать частоту сигнала 700 Hz, то получается, что микрофоном мы можем измерять расстояния от нуля до 0.2364 м. Не густо...

Эксперименты

Статические измерения

Источник звука неподвижно лежал на расстоянии 136 см от диктофона.

Записал в mono *.wav файл на частоте дискретизации 44100 Hz синус сигнал 600 Hz. Такой частоте соответствует длина волны 0.552 метров. Половина длинны волны составляет 0.275 метров.

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 24

Затем я пропустил wav файл через полосовой фильтр так, чтобы прошли все частоты от 500 Hz....до 700 Hz

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 25

Затем этот рафинированный сигнал я подал на обработку своей утилите.

Вот такой получился график расстояния от времени. Первый хороший знак в том, что получившееся расстояние в самом деле не меняется. Прям как в реальности! Моя утилита показывает, что расстояние получилось 6 сантиметров. Видимо в подлинное расстояние укладывается ещё 5 полудлин волн. Да и потом, мы же не знаем начальные фазы гетеродина phi_lo и звукоизлучателя phi_gen. Поэтому разность фаз, в конечном, счете вносит погрешность в результат вычислений.

График расстояния от времени для покоящегося источника. Частота сигнала 600 Hz

График расстояния от времени для покоящегося источника. Частота сигнала 600 Hz

Далее я это же расстояние 136 см измерял на частоте 500Hz. На этом графике первое число в ряде возможных расстояний получилось 13 см.

График расстояния от времени для покоящегося источника. Частота сигнала 500 Hz

График расстояния от времени для покоящегося источника. Частота сигнала 500 Hz

Те же 136 см измеренные на 400 Hz. Получилось 29см

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 28

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

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 29

Динамические измерения №1

Во время этого измерения я двигал диктофон в пределах 20 сантиметров. И можно заметить, что фаза принятого сигнала тоже изменялась. По крайней мере можно зарегистрировать факт шевеления аппаратуры.

Перемещение диктофона относительно излучателя. Частота сигнала 600Hz (длина волны 0.552 m)

Перемещение диктофона относительно излучателя. Частота сигнала 600Hz (длина волны 0.552 m)

Динамические измерения №2

На этом участке графика я удалялся от диктофона со звуко-излучателем в руках. Частота звука была 700 Hz.

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 31

Можно вычислить среднюю скорость движения источника звука.

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 32

А на этом участке графика я шагал быстрее. Тут средняя скорость получилась 0.79 m/s

Звуковой Фазовый Дальномер (Микрофон=Датчик Расстояния) - 33

Однако мне пока не понятно почему измеренное расстояние периодически уменьшалось. Я же всегда только удалялся от диктофона. Мне казалось, что измеренный 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

ФНЧ

Фильтр нижних частот

ЦОС

Цифровая обработка сигналов

АЧХ

Амплитудно-частотная характеристика

Ссылки

Вопросы

--Как можно синхронизовать по фазе два уделенных генератора звуковой частоты?

Автор: aabzel

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js