Cálculo de la longitud de onda del sonido usando un Arduino

Estoy usando un Arduino Uno R3. Necesito medir la longitud de onda del sonido de una frecuencia particular (conocida). Sustituyendo en la ecuación:

Vsound = Frecuencia * Longitud de onda

...Deseo calcular la velocidad del sonido en el medio. Como soy nuevo en Arduinos y la electrónica, planeo usar un altavoz para generar la frecuencia (conocida) del Arduino. También tengo un micrófono ADMP 401. Pero, ¿cómo proceso/calculo la longitud de onda del sonido en el Arduino y empujo la velocidad de salida al monitor en serie?

EDITAR: ¿Es posible simplemente tomar el audio grabado por el micrófono ADMP 401 y enviarlo a una computadora a través del bus serie?

Ahí tienes un problema: tienes dos incógnitas: Vsound y Wavelength . ¿Podrías enviar un pulso desde el parlante a una distancia y tiempo conocidos, cuánto tarda en llegar al micrófono?
¡Inicialmente estaba considerando el retraso de tiempo! Pero sentí que este enfoque podría ser más preciso (además tengo la oportunidad de aprender un poco más sobre EE). Si se puede obtener la longitud de onda del arduino (no creo que sea exactamente un desconocido per se), debería ser posible calcular fácilmente Vsound.
No sé qué tan precisa sería esta idea, pero podría configurar un tubo como el diagrama en Ondas estacionarias en una columna de aire y hacer que Arduino controle un motor que mueve el micrófono en el tubo para encontrar el primer máximo en el amplitud. Para 1 KHz en el aire, sería de unos 30 cm, por lo que en el ámbito de los aparatos físicamente alcanzables. O podría ser más preciso encontrar el primer (o quizás el segundo) mínimo de amplitud. Para el método de ping, debería poder obtener una precisión justa con una gran distancia.
Podría darle un buen método para hacerlo (con 2 micrófonos), pero primero responda estas preguntas. ¿Definiría solo 1 frecuencia de trabajo (como 1kHz)? ¿Qué precisión necesita para la velocidad del sonido? ¿Qué rango de velocidad desea (250 m/s a 350 m/s)?
Sí, definiría solo una frecuencia de trabajo. La velocidad del sonido puede tener una precisión de +/- 5 m/s. Y sí, un rango de velocidad de 300 a 400 m/s sería perfecto :)
@RawBean ¿cuál es tu idea?

Respuestas (4)

Configure el amplificador de entrada para que la forma de onda de audio se recorte en una onda cuadrada. Luego introduzca esto en un pin y use una de las bibliotecas de medición de frecuencia, como esta: http://interface.khm.de/index.php/lab/experiments/frequency-measurement-library/

Interesante. ¿Podría vincular los esquemas del amplificador de entrada antes mencionado?

Andrew Morton lo dijo, solo voy a decirlo y ampliarlo.

Dada una medición de un solo punto de presión de sonido instantánea de algún tipo de transductor, lo único que posiblemente puede derivar de eso es la frecuencia. La única forma de obtener la longitud de onda de forma independiente es duplicar su placer, duplicar su diversión: necesita saber la distancia exacta a la unidad emisora ​​o necesita otro receptor. Además, con solo dos receptores, aún necesita colocarlos en línea recta con el remitente, con bastante distancia entre ellos para que pueda obtener un retraso significativo en la frecuencia entre los dos. Con tres, puede establecer la direccionalidad, pero aún deben estar lo suficientemente separados para crear un retraso de tiempo notable para establecer la velocidad. A partir de una sola unidad de medida, también debe tener en cuenta cuánto tiempo se tarda en obtener las muestras. De varias unidades, necesita marcas de tiempo muy precisas.

Los cálculos de longitud de onda casi siempre dependen del uso de un valor conocido de velocidad de transmisión a través de un medio determinado. Los grandes experimentos para establecer la velocidad de vibración a través de materiales sólidos son realmente un dolor de cabeza para configurar, pero luego tenemos buenas tablas de valores conocidos para jugar en nuestros escritorios.

Gracias. ¿Podría sugerir una forma de medir la frecuencia del sonido entonces?
Lo que pasa con la frecuencia es que es una medida de la frecuencia con la que sucede algo. La frecuencia se puede medir de manera bastante simple al muestrear una forma de onda de audio y procesarla usando algunas bibliotecas bastante simples. Las fuentes de onda sinusoidal única básicamente no requieren procesamiento, solo necesitan un algoritmo corto para recorrer las muestras, encontrar picos, compararlos con la frecuencia de muestreo conocida y ¡listo! Frecuencia. Pero los sonidos compuestos, que son la mayoría, primero necesitan un poco de amor de una cosa llamada Transformada Rápida de Fourier.

Principio

Te propongo usar 2 micrófonos en lugar de uno. La idea es adquirir la señal en 2 ubicaciones diferentes, al mismo tiempo (en comparación con el período de la señal), y multiplicarlas para extraer la longitud de onda.

ingrese la descripción de la imagen aquí

Adquirirás 1 señal por ubicación. La segunda señal se retrasará una cierta cantidad de tiempo. Lo llamamos delta d . Digamos que en el micrófono número 1, tenemos una onda sinusoidal pura metro i C 1 ( t ) = pecado ( ω t + ϕ ) y en el micrófono número 2 tenemos metro i C 2 ( t ) = pecado ( ω t + ϕ d )

Delta solo depende de la longitud de onda porque fijamos la distancia entre los 2 micrófonos. Entonces, si obtenemos delta, obtendremos la velocidad.

Vea, por ejemplo, si la distancia entre 2 micrófonos es exactamente igual a la mitad de una longitud de onda, entonces tendría tales señales:

ingrese la descripción de la imagen aquí

Nota: Considero que la amplitud es la misma entre los 2 micrófonos.

Ahora, considere usar esta fórmula

pecado ( a ) pecado ( b ) = 1 / 2 ( porque ( a b ) porque ( a + b ) )

  1. Haz esta multiplicación en el firmware.

metro i C 1 ( t ) metro i C 2 ( t ) = 1 / 2 ( porque ( d ) porque ( 2 ( ω t + ϕ ) d ) )

  1. Por filtrado de paso bajo (o promedio) metro i C 1 ( t ) metro i C 2 ( t ) obtendrías solo la parte constante, que es

    1 / 2 porque ( d )

  2. Luego, calcule delta

    d = arccos ( 2 yo o w pag a s s ( metro i C 1 ( t ) metro i C 2 ( t ) ) )

  3. Finalmente, convierte a radianes a metros.

    λ = d / 2 π d

    Vea esta imagen, donde tomo un delta de 1 rad y un filtro de paso bajo de segundo orden Butterworth.

ingrese la descripción de la imagen aquí

Requisitos

  • Deben configurarse para estar en línea con la fuente de sonido.
  • La distancia d entre ellos debe medirse con precisión, será su referencia en el dominio del espacio.
  • La distancia d entre ellos debe ser inferior a 1/2 longitud de onda. FYI, para una señal de 1 kHz sería ~ 17 cm máx.

Realización

  • Conecte la salida del micrófono a las entradas analógicas en la placa del arduino.
  • Si puede permitírselo, agregue un filtro de paso de banda entre los micrófonos y los arduinos. La frecuencia de corte está alrededor de la frecuencia de la onda fuente.
  • Use la función AnalogRead () de Arduino para mic1 y la siguiente instrucción llame a la de mic2. Debido a que la lectura toma 100 usec, es importante tenerlo en cuenta y usar una frecuencia que sea lo suficientemente lenta (como 100 Hz) para minimizar el impacto de esta latencia.
Esta es realmente una muy buena idea. Pero tengo dudas con esto: δ=arccos(2∗low−pass(mic1(t)∗mic2(t))) ¿Para qué sirve el término de paso bajo? ¿Es paso bajo(mic1(t)∗mic2(t) lo mismo que 0,5 coseno (delta)?
Además, puedo ver que podría haber un error significativo al calcular el término delta (especialmente sin un filtro de banda). No estoy criticando su proyecto (sigo pensando que es una muy buena idea porque ahora se eliminó la 't'), pero ¿cómo sería esto superior a simplemente medir el retraso de tiempo?
el paso bajo () que utilicé es una función que mantiene solo el valor constante (DC si lo prefiere) de la señal. Un promedio estaría bien, aunque no el mejor. Si tiene algunas habilidades de procesamiento de señales, podría implementar un filtro IIR. Sí, calcular el paso bajo (mic1 (t) * mic2 (t)) sería lo mismo que 0,5 cos (delta).
Lo siento, pero no hice el esfuerzo de estimar el error. Por supuesto, sin el filtro de paso de banda, el error podría ser enorme. Depende de la relación señal/ruido de su configuración. Acerca de comparar mi solución con "simplemente medir el retraso de tiempo", no veo cómo es posible medir solo el retraso de tiempo. ¿El tiempo de retardo entre qué y qué?
Ah, sí. El tiempo de retraso entre los dos micrófonos que reciben la onda de sonido.
Desde el punto de vista del hardware, comparando las 2 soluciones con una SNR baja, los componentes son los mismos (2 micrófonos). Desde el punto de vista de la implementación del algoritmo, mi solución es fácil porque se basa en la adquisición de una muestra, una multiplicación y la acumulación de los resultados (para promediar). Si mide el retraso de tiempo entre los 2 senos, ¿cómo implementaría esto? Debe medir el retraso en una ubicación fija de la onda sinusoidal. ¿En qué puntos? ¿Cuándo la señal llegó a su punto máximo? su fondo? cuando cruza el cero porque recortaste la señal? ¿Qué robustez a un pico de ruido?
Puntos justos. También veo que un filtro de banda no es demasiado difícil de hacer, así que supongo que esto es viable. ¿Hay alguna advertencia que me pueda dar al construir uno?
Por supuesto que es viable. Le aconsejo que haga un filtro RC pasivo: lea esto como introducción electronics-tutorials.ws/filter/filter_4.html son 2 resistencias y 2 capas por filtro. Incluso podría construir en un stripboard y probar diferentes conjuntos de valores.
Muy bien, gracias. Los mantendré informados con los resultados de este experimento +50 :)
Puede que necesite un poco más de ayuda, ya ves: d
De nada. Y gracias por compartir los resultados conmigo :-)
Hola, lamento la respuesta tardía, intenté usar un filtro de paso bajo con un límite de 473 y una resistencia de 5,1 kohm. Desafortunadamente, el paso bajo distorsiona mucho la onda sinusoidal. ¿Que crees que deberia hacer?
Aquí hay una captura de pantalla que demuestra lo mismo. El patrón de onda a la izquierda que se asemeja a una onda cuadrada es una onda sinusoidal sin filtrar, y el patrón irregular a la derecha es la salida filtrada: i.imgur.com/teOnjY1.png para una onda sinusoidal de 500 Hz.
Encantado de escucharte de nuevo. Acerca de su problema de filtrado, se ve raro... En la imagen, pude ver alrededor del tic 3:15 que la señal realmente parece una señal filtrada de paso bajo. Se eleva rápidamente y luego toma tiempo para estabilizarse. Pero después del tic 3:30 empieza a parecer una locura. Me pregunto cómo conectas eléctricamente tu filtro, tal vez simplemente tienes un mal contacto. Para brindarle más apoyo en este tema de filtrado, puede publicar una nueva pregunta. O encuentre mi perfil de LinkedIn en mi página de perfil de SO y conéctese conmigo.
Ah, me temo que no estoy en LinkedIn. Pero, idealmente, ¿debería verse así una salida filtrada de paso bajo? Debo decir que la lectura del osciloscopio es del pin A0 del Arduino y no es tremendamente precisa, por lo que podrían ser lecturas raras...
No en realidad no. Pongo un ejemplo de la salida de diferentes filtros de paso bajo allí: imgur.com/a/Ev2gh Por cierto, ¿cuál es la frecuencia de muestreo?

La velocidad también depende ligeramente de la frecuencia, por lo que, para aproximaciones, puede medir el tiempo de retorno del eco de un pulso para una distancia conocida o usar ondículas de varias frecuencias con una relación s/n más alta sintonizada en Rx para bloquear el ruido. Alternativamente, puede usar un micrófono en cada extremo con un altavoz acoplado a un extremo, pero aún necesita la distancia o alguna otra referencia, como la velocidad en el aire en una condición ambiental conocida.