Щоб продовжити відповідь Мюллера,
- Чи слід розміщувати мікрофони в окремі пробірки, щоб покращити поділ?
- Ні, ви намагаєтеся визначити напрямок джерела, додавання трубок лише зробить звук відскоком всередині трубки, який точно не потрібен.
Найкращим способом дій було б зробити їх обличчям прямо вгору, таким чином, всі вони отримають подібний звук, і єдине, що в них унікальне - це їх фізичні місця, які безпосередньо впливатимуть на фазу. Синусова хвиля 6 кГц має довжину хвилі -швидкість звукучастота звуку=343 м / с6 кГц= 5,71 мм. Отже, якщо ви хочете однозначно визначити фази синусоїд до 6 кГц, які є типовими частотами для розмови людини, то вам слід розмістити мікрофони не більше 5,71 мм один від одного. Ось один предмет , діаметр якого менше 5,71 мм. Не забудьте додати фільтр низьких частот із частотою відсікання близько 6-10 кГц.
Редагувати
Я відчув, що це питання №2 виглядає веселим, тому вирішив спробувати вирішити його самостійно.
- Чи можна обчислити фазову кореляцію між трьома джерелами одночасно? (тобто для прискорення обчислень)
Якщо ви знаєте свою лінійну алгебру, то ви можете уявити, що ви розмістили мікрофони в трикутнику, де кожен мікрофон знаходиться на відстані 4 мм один від одного, роблячи кожен внутрішній кут .60 °
Тож припустимо, що вони в такій конфігурації:
C
/ \
/ \
/ \
/ \
/ \
A - - - - - B
Я буду...
- використовуйте номенклатуру яка є вектором, що вказує від доА Б¯¯¯¯¯¯¯¯АБ
- називають моє походженняА
- записати всі числа в мм
- використовуйте математику 3D, але в кінці закінчуйте 2D напрямком
- встановіть вертикальне положення мікрофонів у фактичній формі хвилі. Таким чином , ці рівняння засновані на звукову хвилю , яка виглядає як це .
- Обчисліть поперечний добуток цих мікрофонів, виходячи з їх положення та форми хвилі, потім ігноруйте інформацію про висоту цього крос-продукту та використовуйте арктан, щоб придумати фактичний напрямок джерела.
- виклик вихід мікрофона в положенні , виклик вихід мікрофона в положенні , виклик вихід мікрофона в положенніаАбБcС
Тож справді такі речі:
- A = ( 0 , 0 , a )
- B = ( 4 , 0 , b )
- С= ( 2 ,42-22------√= 23-√, в )
Це дає нам:
- А Б¯¯¯¯¯¯¯¯= ( 4 , 0 , a - b )
- А С¯¯¯¯¯¯¯¯= ( 2 , 23-√, а - в )
І поперечний продукт простоА Б¯¯¯¯¯¯¯¯×А С¯¯¯¯¯¯¯¯
А Б¯¯¯¯¯¯¯¯×А С¯¯¯¯¯¯¯¯=⎛⎝⎜40а - б⎞⎠⎟×⎛⎝⎜223-√а - с⎞⎠⎟=⎛⎝⎜0 ⋅ ( a - c ) - ( a - b ) ⋅ 23-√( а - б ) ⋅ 2 - 4 ⋅ ( a - c )4 ⋅ 23-√- 0 ⋅ 2⎞⎠⎟=⎛⎝⎜23-√( б - а )- 2 а - 2 б - 4 с83-√⎞⎠⎟
Інформація Z, - це просто непотріб, для нас нульовий інтерес. Коли вхідні сигнали змінюються, перехресний вектор буде хитатися вперед і назад у напрямку джерела. Так що половину часу він буде вказувати прямо на джерело (ігноруючи роздуми та інші паразитики). А іншу половину часу він буде вказувати на 180 градусів від джерела.83-√
Я говорю про який можна спростити до , а потім перетворіть радіани на градуси.арктан(- 2 а - 2 б - 4 с23√( б - а ))арктан(a + b + 2 c3√( а - б ))
Тож у результаті ви отримаєте таке рівняння:
арктан(a + b + 2 c3-√( а - б ))180π
Але половину часу інформація буквально не на 100% помиляється, так як ... як слід .... зробити це правильно 100% часу?
Добре, якщо веде , то джерело не може бути ближче до B.аб
Іншими словами, просто зробіть щось таке, як це:
source_direction=atan2(a+b+2c,\sqrt{3}*(a-b))*180/pi;
if(a>b){
if(b>c){//a>b>c
possible_center_direction=240; //A is closest, then B, last C
}else if(a>c){//a>c>b
possible_center_direction=180; //A is closest, then C last B
}else{//c>a>b
possible_center_direction=120; //C is closest, then A last B
}
}else{
if(c>b){//c>b>a
possible_center_direction=60; //C is closest, then B, last A
}else if(a>c){//b>a>c
possible_center_direction=300; //B is closest, then A, last C
}else{//b>c>a
possible_center_direction=0; //B is closest, then C, last A
}
}
//if the source is out of bounds, then rotate it by 180 degrees.
if((possible_center_direction+60)<source_direction){
if(source_direction<(possible_center_direction-60)){
source_direction=(source_direction+180)%360;
}
}
І, можливо, ви хочете реагувати лише тоді, коли джерело звуку надходить з певного вертикального кута, якщо люди говорять над мікрофонами => 0 зміна фази => нічого не робити. Люди говорять поруч із ним горизонтально => деяка зміна фази => реагують.
| П|=П2х+П2у-------√=3 ( а - б)2+ ( a + b + 2 c)2-------------------√
Тому ви можете встановити цей поріг на щось низьке, наприклад, 0,1 або 0,01. Я не зовсім впевнений, залежить від гучності та частоти та паразитиків, протестуйте самі.
Ще одна причина, коли використовувати рівняння абсолютного значення - це нульові перетини, може виникнути незначний момент, коли напрямок буде вказувати в неправильному напрямку. Хоча це буде лише за 1% часу, якщо навіть це. Таким чином, ви можете приєднати фільтр LP до першого порядку до напрямку.
true_true_direction = true_true_direction*0.9+source_direction*0.1;
І якщо ви хочете реагувати на певний об'єм, то просто підсумуйте 3 мікрофона разом і порівняйте їх з деяким значенням тригера. Середнє значення мікрофонів було б їх сумою, поділеною на 3, але вам не потрібно ділити на 3, якщо збільшити значення тригера на коефіцієнт 3.
У мене виникають проблеми з маркуванням коду як C / C # / C ++ або JS або будь-якого іншого, тож, на жаль, код буде чорно-білим, проти моїх побажань. Ну добре, удачі у твоєму підприємстві. Звучить весело.
Також є ймовірність 50/50, що напрямок буде знаходитися на відстані 180 від джерела 99% часу. Я майстер робити такі помилки. Виправленням цього може бути лише інвертування if, якщо слід додати заяви на 180 градусів.