Чтобы расширить ответ Мюллера,
- Следует ли размещать микрофоны в отдельных трубках для улучшения разделения?
speed of soundsound frequency=343 m/s6 kHz=5.71 mm
редактировать
Мне показалось, что этот вопрос № 2 выглядит забавно, поэтому я решил попытаться решить его самостоятельно.
- Можно ли как-то рассчитать фазовую корреляцию между 3 источниками одновременно? (т.е. чтобы ускорить вычисления)
Если вы знаете свою линейную алгебру, то можете представить, что вы поместили микрофоны в треугольник, где каждый микрофон находится на расстоянии 4 мм друг от друга, а внутренние углы составляют .60°
Итак, давайте предположим, что они находятся в этой конфигурации:
C
/ \
/ \
/ \
/ \
/ \
A - - - - - B
Я буду...
- используйте номенклатуру которая является вектором, указывающим от кAB¯¯¯¯¯¯¯¯AB
- называют мое происхождениеA
- напишите все числа в мм
- использовать 3D математику, но в конечном итоге с 2D-направлением
- установите вертикальное положение микрофонов в их фактическую форму волны. Таким образом , эти уравнения основаны на звуковую волну , которая выглядит как это .
- Рассчитайте перекрестное произведение этих микрофонов на основе их положения и формы волны, затем проигнорируйте информацию о высоте от этого перекрестного произведения и используйте arctan, чтобы определить фактическое направление источника.
- позвонить выходной сигнал микрофона в положении , вызов выходе микрофона в положении , вызов выхода микрофона в положенииaAbBcC
Так что следующие вещи верны:
- A=(0,0,a)
- B=(4,0,b)
- C=(2,42−22−−−−−−√=23–√,c)
Это дает нам:
- AB¯¯¯¯¯¯¯¯=(4,0,a−b)
- AC¯¯¯¯¯¯¯¯=(2,23–√,a−c)
И перекрестный продукт простоAB¯¯¯¯¯¯¯¯×AC¯¯¯¯¯¯¯¯
AB¯¯¯¯¯¯¯¯×AC¯¯¯¯¯¯¯¯=⎛⎝⎜40a−b⎞⎠⎟×⎛⎝⎜223–√a−c⎞⎠⎟=⎛⎝⎜0⋅(a−c)−(a−b)⋅23–√(a−b)⋅2−4⋅(a−c)4⋅23–√−0⋅2⎞⎠⎟=⎛⎝⎜23–√(b−a)−2a−2b−4c83–√⎞⎠⎟
Информация о Z, , просто бесполезна, нас не интересует. При изменении входных сигналов кросс-вектор будет качаться взад и вперед в направлении источника. Таким образом, половину времени он будет указывать прямо на источник (игнорируя отражения и другие паразиты). А в остальное время он будет указывать на 180 градусов от источника.83–√
Я говорю о который можно упростить до , а затем поверните радианы в градусы.arctan(−2a−2b−4c23√(b−a))arctan(a+b+2c3√(a−b))
Итак, в результате вы получите следующее уравнение:
arctan(a+b+2c3–√(a−b))180π
Но половину времени информация буквально на 100% неверна, так как ... нужно ли ... исправлять это в 100% случаев?
Хорошо, если ведет , то источник не может быть ближе к B.ab
Другими словами, просто сделайте что-то простое, как это:
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 изменение фазы => ничего не делать. Люди говорят горизонтально рядом с ним => некоторые изменения фазы => реагируют.
|P|=P2x+P2y−−−−−−−√=3(a−b)2+(a+b+2c)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 градусов.