Технический форум по робототехнике.
boez » 12 окт 2011, 15:37
Вообще формула простая, я думаю автор до нее дошел, осталось только правильно ловить фронты звука.
alfa = arccos((t2-t1)*Vs/L), где t2-t1 - разность времени, Vs - скорость звука, L - база (расстояние между микрофонами).
На самом деле можно сразу вычислить базу в микросекундах: T = 10^6*L/Vs. Vs=340 м/с, 1 см = 29.4 мкс.
Тогда alfa = arccos((t2-t1)/T).
Если источник звука близко - будет небольшое отклонение от этой формулы, в связи с тем, что фронт звуковой волны - окружность, а не прямая, но для расстояний бОльших 3-4 баз этим можно пренебречь.
"У каждого говорящего базовая частота основного тона индивидуальна и обусловлена особенностями строения гортани. В среднем для мужского голоса она составляет от 80 до 210 Гц, для женского — от 150 до 320 Гц" (с) вики. Буква А - это не И, будем считать что не выше 200 даже у детей. 200 гц = 5 мс, 1 мс = 340 мм, т.е. 5 мс это полтора метра, а то и больше. Значит, робот вполне может работать с отдельными фронтами гласного звука, наловить скажем несколько десятков разностей фронтов, усреднить, выкинуть самые "непохожие" чтобы не портили статистику и уже результат подставить в формулу выше. Естественно arccos считать не библиотечной функцией, а по таблице приближенно.
Кстати, сразу видно что АЦП аврки тут не сильно подходит, потому как у него одно преобразование пары значений - 130 мкс, да еще и не одновременно, а у нас разброс фронтов при расстоянии 10 см около 300 мкс максимум, получаем меньше 3 градаций возможных. Но! АЦП аврки можно разогнать, тут бродил пример вообще с видеосигналом. Но я считаю, что обычных ног порта должно хватать, главное правильно намерять и хорошо усреднить.
shadowjack » 12 окт 2011, 15:39
С компаратором - не ахти получится. Нужно цифровать оба канала и, варьируя задержку между ними, находить максимум корреляции. Только, боюсь, микроконтроллер слабоват окажется - на ПЛИСе можно попробовать. Или на PC для отработки алгоритма.
chinga » 12 окт 2011, 15:43
alfa = arccos((t2-t1)*Vs/L), где t2-t1 - разность времени, Vs - скорость звука, L - база (расстояние между микрофонами).
формула та уже есть в коде на 1 странице) но еще туда не дошли) проблема в том, время правильно не считывает) показывает то 10, и на следующий хлопок может показать выше 1000.
если время правильно находит, то дальше чуть легче чисто вычислений.
Vovan » 12 окт 2011, 15:50
2chinga:
chinga писал(а):"))" и ")" ничего не означает
этого я не знал
, позор мне...
chinga писал(а):человек, не может повернуть голову точно туда откуда издастся звук.
это точно!
chinga писал(а):примерно может определить.
неа, только предположить...
chinga писал(а):и еще, человек может определить звук самого хлопка и его отраженные сигналы, и мк все сигналы.
это я не понял
chinga писал(а):но теперь какой способ можно применить?
ИМХО усреднение - нужный способ. А варианты либо усреднять механически (см.выше что я писАл), либо математически, как описАл boez
2boez:
boez писал(а):Но я считаю, что обычных ног порта должно хватать, главное правильно намерять и хорошо усреднить.
+1. АЦП тут явно не в струю...
chinga » 12 окт 2011, 15:55
Нужно цифровать оба канала и, варьируя задержку между ними, находить максимум корреляции.
а как одновременно цифровать два канала?
как я делал, берет данные первая ножка, а в это время данные со второй ножки не будут другими? то есть когда звук издаться, и первый примет точные данные, а второй, боюсь, исчезнет пока первый будет обрабатываться. или не так?
и еще, человек может определить звук самого хлопка и его отраженные сигналы, и мк все сигналы.
мы же слышим эхо? а микрофон принимает все) даже ветер.
либо математически, как описАл boez
это я и делаю, но дело не доходит до градусов. время не можем точно определить.
Vovan » 12 окт 2011, 17:25
дык звук же уже цифрой идет с компаратора, или как?
Как определить время, ужЕ ведь описано неоднократно, ну а градусы - величина зависимая от ентого времени.
Вот
forum68/topic7990.html тут еще обсуждали, помоему подробно описано...
chinga » 12 окт 2011, 18:55
дык звук же уже цифрой идет с компаратора, или как?
ну да) с
компараторпроблема в этом, время не могу точно находить.
Добавлено спустя 12 минут 3 секунды:завтра попробую расстояние между микрофонами уменьшить.
Michael_K » 12 окт 2011, 19:51
HarryStar писал(а):У вас какой-то странный алгоритм судя по коду. Или по крайней мере очень непрозрачно написан.
Плюс стопятьсот.
Как пишете, так и работает.
Не нужно НИЧЕГО предполагать.
Radist » 12 окт 2011, 20:03
Пора отделить мух от котлет. С математикой вроде разобрались, осталась проблема измерения времени. Попробую кратко резюмировать проблему топикстартера. Уши - это не просто микрофоны, а датчики, выдающие сигнал 0/1 (ничего не слышу/ой, что-то услышал). Насколько я понял после микрофона стоит полосовой фильтр (или ФНЧ), затем стоит компаратор. Фильтром отстраиваемся от ветра и прочего ВЧ шума, компаратором отстраиваемся от переотражений и эха от стен. Далее задача тривиальная - читать две ноги порта на предмет их изменения, включить таймер при изменении, снова читать две ноги порта до нужного изменения, выключить таймер. Никакого АЦП нет и не надо!!! Топикстартер говорит, что время каждый раз разное и грешит на свою программу. Я бы посоветовал подключить оба выхода компараторов к двухканальному осциллографу и понаблюдать как они себя ведут. Если ведут себя как положено - косяк в программе, если фронты скачут как зайцы - ковырять схемотехнику датчиков. Все это еще на первой странице написал Vovan.
chinga » 12 окт 2011, 21:09
У вас какой-то странный алгоритм судя по коду. Или по крайней мере очень непрозрачно написан
что непонятного там?
Плюс стопятьсот.
Как пишете, так и работает.
Не нужно НИЧЕГО предполагать.
это вы к чему?)
Я бы посоветовал подключить оба выхода компараторов к двухканальному осциллографу и понаблюдать как они себя ведут. Если ведут себя как положено - косяк в программе, если фронты скачут как зайцы - ковырять схемотехнику датчиков.
постараюсь завтра проверить.
Michael_K » 12 окт 2011, 21:16
Это я к тому, что с логикой у вас в программе туго.
Вы _предполагаете_, что все происходит так, как вам хочется.
boez » 12 окт 2011, 21:36
Вот как бы делал я:
- Код: Выделить всё • Развернуть
unsigned char oldport, newport, dir;
unsigned short cnt;
while((oldport=PINA & 3) != 0x00);
while ((newport=PINA) == oldport) cnt++;
dir=0;
if (newport == 0x03) {
if (oldport == 0x01) dir=1;
if (oldport == 0x02) dir=2;
}
На выходе получаем dir=0 - неправильно измерено, dir=1 - условно слева, dir=2 - условно справа, count - временная разность |t1-t2| в условных единицах.
А датчики надо изучать - что они выдают, есть там выпрямитель или нет. Т.е. условно на одно полусекундное "А" они дают 1 импульс или 50?
Michael_K » 12 окт 2011, 21:55
boez писал(а):Вот как бы делал я:
Написана, имхо, шляпа. Очевидно, oldport всегда равен нулю?
Нету там выпрямителя никакого. Тупо компаратор.
Хорошо, если только 50
chinga » 12 окт 2011, 22:36
что все происходит так, как вам хочется
а как еще надо делать?
Т.е. условно на одно полусекундное "А" они дают 1 импульс или 50?
просто один скачек и все кажется.
Michael_K » 12 окт 2011, 22:51
chinga писал(а):что все происходит так, как вам хочется
а как еще надо делать?
Вы пропустили подчеркнутое слово, я для кого подчеркивал?
Уже третий раз говорю - не предполагать!