En primer lugar, he visto un hilo similar, sin embargo, es un poco diferente a lo que estoy tratando de lograr. Estoy construyendo un robot que seguirá a la persona que lo llama. Mi idea es usar 3 o 4 micrófonos, es decir, en la siguiente disposición para determinar desde qué dirección se llamó al robot:
Donde S es fuente, A, B y C son micrófonos. La idea es calcular la correlación de fase de las señales registradas a partir de los pares AB, AC, BC y, en base a eso, construir un vector que apunte a la fuente utilizando una especie de triangulación. El sistema ni siquiera tiene que funcionar en tiempo real porque se activará por voz: las señales de todos los micrófonos se grabarán simultáneamente, la voz se muestreará desde un solo micrófono y si se ajusta a la firma de voz, la correlación de fase se calculará a partir de la última fracción de segundo para calcular la dirección. Soy consciente de que esto podría no funcionar demasiado bien, es decir, cuando se llama al robot desde otra habitación o cuando hay múltiples reflexiones.
Esta es solo una idea que tuve, pero nunca he intentado algo así y tengo varias preguntas antes de construir el hardware real que hará el trabajo:
- ¿Es esta una forma típica de hacer esto? (es decir, utilizado en teléfonos para cancelación de ruido?) ¿Cuáles son otros enfoques posibles?
- ¿Se puede calcular la correlación de fase entre 3 fuentes simultáneamente de alguna manera? (es decir, para acelerar el cálculo)
- ¿La frecuencia de muestreo de 22 kHz y la profundidad de 12 bits son suficientes para este sistema? Estoy especialmente preocupado por la profundidad de bits.
- ¿Deben colocarse los micrófonos en tubos separados para mejorar la separación?
fuente
Respuestas:
Para extender la respuesta de Müller,
Editar
Sentí que esta pregunta # 2 parecía divertida, así que decidí intentar resolverla por mi cuenta.
Si conoce su álgebra lineal, entonces puede imaginar que ha colocado los micrófonos en un triángulo donde cada micrófono está a 4 mm de distancia, lo que hace que cada ángulo interior sea de .60°
Entonces supongamos que están en esta configuración:
Voy a...
Entonces, las siguientes cosas son ciertas:
Esto nos da:
Y el producto cruzado es simplementeAB¯¯¯¯¯¯¯¯×AC¯¯¯¯¯¯¯¯
La información Z, es simplemente basura, cero interés para nosotros. A medida que cambian las señales de entrada, el vector cruzado oscilará hacia adelante y hacia atrás hacia la fuente. Entonces, la mitad del tiempo apuntará directamente a la fuente (ignorando los reflejos y otros parásitos). Y la otra mitad del tiempo apuntará a 180 grados de la fuente.83–√
De lo que estoy hablando es de que se puede simplificar a , y luego convierte los radianes en grados.arctan(−2a−2b−4c23√(b−a)) arctan(a+b+2c3√(a−b))
Entonces, lo que termina es la siguiente ecuación:
Pero la mitad del tiempo la información está literalmente 100% equivocada, entonces, ¿cómo ... debería uno ... corregir el 100% del tiempo?
Bueno, si es líder , entonces la fuente no puede estar más cerca de B.a b
En otras palabras, simplemente haga algo simple como esto:
Y tal vez solo quiera reaccionar si la fuente de sonido proviene de un ángulo vertical específico, si la gente habla por encima de los micrófonos => 0 cambio de fase => no hace nada. La gente habla horizontalmente al lado => algún cambio de fase => reacciona.
Por lo tanto, es posible que desee establecer ese umbral en algo bajo, como 0.1 o 0.01. No estoy completamente seguro, depende del volumen y la frecuencia y los parásitos, pruébelo usted mismo.
Otra razón de cuándo usar la ecuación de valor absoluto es para cruces por cero, puede haber un pequeño momento para cuando la dirección apunte en la dirección incorrecta. Aunque solo será el 1% del tiempo, incluso si eso es así. Por lo tanto, es posible que desee adjuntar un filtro LP de primer orden a la dirección.
Y si desea reaccionar a un volumen específico, simplemente sume los 3 micrófonos y compárelo con algún valor de activación. El valor medio de los micrófonos sería su suma dividida por 3, pero no necesita dividir por 3 si aumenta el valor de activación por un factor 3.
Tengo problemas para marcar el código como C / C # / C ++ o JS o cualquier otro, por lo que lamentablemente el código será negro sobre blanco, en contra de mis deseos. Bueno, buena suerte en tu aventura. Suena divertido.
También hay una probabilidad de 50/50 de que la dirección esté a 180 grados de la fuente el 99% del tiempo. Soy un maestro en cometer tales errores. Sin embargo, una corrección para esto sería simplemente invertir las declaraciones if para cuando se deben agregar 180 grados.
fuente
fuente