Circuito de detección de latidos FFT

Durante más de un año he tratado de descifrar tanto el aspecto electrónico como el aspecto del software de mi proyecto.

Me las arreglé con algo de éxito para hacer que la idea general funcionara, los baches que he encontrado en el camino me están estresando francamente.

Descripción y objetivo del proyecto:

Básicamente, un dispositivo de detección de latidos con un factor de forma muy pequeño.

Estoy usando un Arduino Uno como dispositivo de creación de prototipos, pero tengo un Arduino Mega, Sparkfun Micro y varias otras placas de desarrollo disponibles para usar si es necesario.

Quiero que el microcontrolador lea audio analógico, lo convierta a FFT o FHT o cualquier otro dato fácilmente traducible, lea las frecuencias más bajas donde se presenta el bombo de la música y, finalmente, mida el tiempo entre cada bombo para calcular el BPM de la canción. .

El rango de frecuencia donde está presente el bombo en la música está alrededor del rango de 45 Hz a 55 Hz y es más distinguible en esa área cuando se mira en un analizador de espectro.

Esto también debería ser correcto al hacer FFT/FHT con un microcontrolador debido a la naturaleza de la conversión de analógico a digital a FFT/FHT.

Sin embargo, puede diferir y es más probable que difiera si se usa un micrófono para escuchar el audio.

Lo que he logrado con éxito:

  • Montaje de un circuito que permite inyectar audio a una entrada analógica del arduino. El circuito se puede encontrar aquí:

diagrama de bloques
(fuente: interfaz.khm.de )

Así que los dos componentes más importantes del proyecto están en su lugar.

Con lo que tengo problemas:

  • Obtengo un pico constante en el área de frecuencia más baja del espectro que está presente en todo momento. Esto es un problema porque el Kick de la música está en esa zona.

Cosas que he probado:

  • Un tipo en youtube trató de ayudarme dándome instrucciones simples y me dijo que usara un capacitor de 1uF entre la fuente de audio y la entrada analógica, además de probar una resistencia pull-up o pull-down en el analógico Aporte.

Resultados (cita):

Cuando se usa un pull-up, el pico de baja frecuencia aumenta, cuando se usa un pull-down, la baja frecuencia desaparece.

Así que el menú desplegable es el camino a seguir.

SIN EMBARGO, con el pull-down presente, se introducen los armónicos del tono sinusal pero no el pico en el área de frecuencia más baja mientras no haya sonido presente.

Con el menú desplegable NO presente, los armónicos se desvanecen, pero el pico está presente.

  • Implementación de filtros FIR e IIR. Resultados: el audio sigue reaccionando a todas las frecuencias.

¿Qué más puedo probar antes de tirar este proyecto por la ventana?

Los enfoques y las sugerencias deben limitarse a los componentes y, preferiblemente, estar orientados al software.

El órgano de luz debe tener un bajo consumo de energía y muy pocos componentes físicos, y si se requieren componentes físicos, deben ser pequeños y estar montados en la superficie.

Un bombo en realidad contiene el espectro de un redoblante (de 100 a varios kHz) seguido inmediatamente por un espectro de menos de 100 Hz que decae, por lo que su análisis puede estar comenzando por el camino equivocado.
¿Cuál es su frecuencia de muestreo en el ADC y cuántas muestras está utilizando en su transformación? Es muy posible que tenga los parámetros incorrectos.
@Andy Estoy usando una interfaz de audio profesional con un software que lee FFT en vivo, y el bombo puede variar en el rango de frecuencia, sí, pero el rango final es de alrededor de 45 Hz, ya que esa es la frecuencia más alta para un bombo, al menos para la música electrónica de baile.
la frecuencia de muestreo es lo que Open Music Labs dice que es, estoy usando su código de stock.
@WhatRoughBeast probé su sugerencia y cambié el parámetro LOG_OUT a LIN_OUT8 en combinación con la respuesta que proporcionó AaronD, y ahora obtengo un espectro limpio.

Respuestas (1)

Creo que el tipo de YouTube podría haber estado en el camino correcto, pero la confusión es que la "tierra" generalmente se centra entre dos suministros para la mayoría de los circuitos analógicos y coexiste con el suministro más bajo para la mayoría de los circuitos digitales. Entonces, ya sea que lo haya subido o bajado, el nivel de CC ya estaba recortado, por lo que todo lo que se agregó a eso (su música) también se recortó automáticamente.

En su lugar, debe tirar de él hasta un punto intermedio. La forma más fácil de hacerlo es simplemente jalarlo hacia arriba y hacia abajo al mismo tiempo, usando dos resistencias. Eso debería centrarlo bien, con el nivel exacto determinado por la relación de las dos resistencias.

También a considerar:

  • La frecuencia de corte es 1/(2 * pi * R * C) en hercios, donde R es la combinación en paralelo de las dos resistencias en ohmios y C es el capacitor en faradios. Querrá ser aproximadamente 1/10 de la frecuencia más baja que desea detectar.
  • Las dos resistencias en paralelo (y la resistencia que usó antes) cargarán la fuente de audio. Si es mayor que unos pocos kohms, no me preocuparía.
  • Las dos resistencias en serie consumirán corriente de la fuente de alimentación. Si estás corriendo desde la pared y has cumplido con el punto anterior, eso no será un problema. Las baterías pueden ser diferentes.

Actualizar:

De una discusión bastante larga en los comentarios y un enlace a un foro diferente ( http://www.openmusiclabs.com/forums/viewtopic.php?f=4&t=493&sid=c89646aea90012eb0fbcbf4161ab5b74 ), parece que el problema tiene que ver con Compensación de CC. El esquema original intenta resolver esto, pero incluye un ajuste innecesario que es fácil equivocarse. Aquí hay una mejor manera de hacerlo:

esquemático

simular este circuito : esquema creado con CircuitLab

Asegúrese de mantener R1 y R2 iguales. La frecuencia de corte se describe arriba.

El propósito del ajuste original parece ser ajustar la compensación de CC para que coincida con el ADC, pero espero suficiente variación de otras fuentes para que sea más fácil cerrarlo y usar un paso alto digital para terminar el trabajo.

Algunos otros cambios:

  • Cambié a resistencias de 10k en lugar de 100k. Esto proporciona una impedancia de fuente más baja al ADC para el nivel de CC. Esto requiere un tope más grande para el mismo corte, lo que normalmente no es un problema.
  • Agregué una resistencia para completar el filtro anti-alias básico. Use la misma ecuación para la frecuencia de corte para ponerla aproximadamente el doble de la frecuencia más alta que le interesa (10x sería mejor, pero eso puede ser pedirle demasiado al ADC con este tipo de filtro), luego ejecute el ADC al menos 10x el frecuencia de corte.

Como se muestra, las frecuencias de corte son ~1.5Hz y ~48kHz, por lo que querrá muestrear ese canal ADC al menos a 500kHz. ¿Por qué no 48kHz como el audio estándar? Porque este filtro se desliza muy lentamente. Solo a frecuencias mucho más altas finalmente atenúa el ruido lo suficiente como para no interferir con su señal cuando se desplaza hacia abajo por aliasing. Si no desea ejecutar el FHT tan rápido, puede usar un paso bajo analógico más complejo, o puede usar un paso bajo digital que se ejecute tan rápido y luego deseche la mayoría de las muestras.

Entonces, básicamente, el diagrama al que me referí que tiene una serie de componentes en el lado izquierdo del diagrama, es correcto, pero no completamente correcto según la frecuencia mínima que quiero detectar. Además, lo que está sugiriendo con un pullup y un pulldown, ¿no es eso lo que sugiere el diagrama? Como señalé en la pregunta, el tipo de YouTube está en el camino correcto, pero los armónicos se introducen en el espectro, lo que hace que el espectro se sature. Entonces, una onda sinusoidal de 1kHz aparecerá a 0Hz, 1kHz, 2kHz, etc., ese no es el caso cuando el menú desplegable no está presente.
@xaid: Probablemente no necesites el bote, pero por lo demás se ve bien. Es aproximadamente una década más bajo de lo necesario para el audio (~ 0,3 Hz), pero probablemente esté bien. Dicho esto, claramente hay algo mal con los componentes de entrada analógica en alguna parte porque no cambiaste el software y obtienes una diferencia en la distorsión dependiendo de cómo esté configurado el material analógico. Los circuitos RC no agregan armónicos como ese; el recorte lo hace.
O tal vez el volumen de la fuente es demasiado alto. Eso también podría recortarse.
Por cierto, si planea usar la salida de audio analógica, querrá una tapa en serie entre el paso bajo y el conector, para eliminar la compensación de suministro de 1/2. Luego tire de eso hacia abajo como un paso alto RC. La impedancia de la fuente en la banda de paso permanece aproximadamente igual a la R de paso bajo por sí misma.
No voy a usar la salida de audio analógico. Tienes razón sobre el recorte. Si subo el volumen, se introducen armónicos. He encontrado un buen nivel de volumen para experimentar. El pico constante de baja frecuencia todavía está allí. ¿Cualquier otra sugerencia?
@xaid: ¿Es realmente un pico? ¿O un simple desplazamiento de CC? Probablemente desee un paso alto digital de todos modos solo para eliminar cualquier variación lenta que pueda haber en el nivel de CC. No confiaría en que un circuito analógico permanezca exactamente en la mitad de la escala de su ADC.
Dicho esto, hay un límite de 4.7nF en el diagrama que funcionará con cualquier impedancia de fuente que conecte para hacer un paso bajo analógico. Probablemente sea para anti-aliasing, pero una impedancia de fuente alta podría llevar el corte a la banda de audio.
... y una impedancia de fuente baja podría empujarlo por encima de la frecuencia de Nyquist, momento en el cual el espectro "retrocede" hacia 0 Hz según lo informado por el ADC. Si ese es el problema, entonces estás muestreando demasiado lento y tu pico de baja frecuencia es en realidad físicamente de alta frecuencia.
Sí, es un pico. Jugué con diferentes valores de resistencia y, por ejemplo, al conectar un potenciómetro (10k) entre +5v y la resistencia de 10k (reemplazando la resistencia superior de 100k), puedo ver un ligero cambio en el pico cuando giro el potenciómetro. Supongo que eso tiene que ver con el desplazamiento de CC.
El diagrama muestra 100k-10k-100k entre +5V y 0V. Acabas de llamarlo una resistencia de 10k. ¿Qué hiciste en realidad?
Lo que hice fue cambiar la conexión de la resistencia +5v 100k, para que se vea así: 10kPOT-10k-100k.
Está bien, veo lo que hiciste. En la configuración más óptima, tiene el equivalente de 20k-100k, cuando realmente necesita valores iguales. No necesitas la olla; solo use dos resistencias fijas de valores iguales que cumplan con los requisitos en mi publicación original. Luego use un paso alto digital entre ADC y FHT.
Encontré este hilo en el foro Open Music Lab, hablan sobre ese pico de baja frecuencia con el que estoy teniendo problemas: openmusiclabs.com/forums/…
Sin embargo, no sé dónde han conectado el potenciómetro que mencionan.
ELIMINAR LA BOTE!!!! ¡No lo necesitas! Simplemente conecte dos valores iguales en serie a través de la fuente de alimentación y conecte la señal al punto entre las resistencias. ¡Agregue un paso alto digital y listo! Actualizaré mi respuesta con un diagrama.
Está bien, tómatelo con calma jajaja. Creo que usaron el potenciómetro para equilibrar la compensación de CC, y creo que la compensación de CC es a lo que me refiero como Armónicos. Pero, en el hilo del foro, mencionaron que lograron que Bin 0 (el pico constante de baja frecuencia) también se igualara. Estoy increíblemente confundido en este momento. ¿Por qué simplemente no funciona? Estoy siguiendo todos y cada uno de los pasos lo más cerca que puedo.
@xaid: ¿Eso aclara las cosas?
lo estoy probando Su diagrama falló. Un poco. Retiré el capacitor de 22uF, conecté la señal IN de audio directamente a la conexión donde está el Pullup y Pulldown, ¡y GRAN ÉXITO! Edite el diagrama y deberíamos estar listos. Agregue también a su respuesta que se debe usar un amplificador. Solo obtengo una amplitud de espectro relativamente pequeña. ¿Alguno de los componentes pasivos podría tener algo que ver con eso?
Ups. Estoy un poco equivocado. Al usar AnalogRead() para obtener muestras, su diagrama SIN el límite de 22uF brinda excelentes resultados, pero una amplitud bastante baja en el espectro. Sin embargo, cuando se utiliza el código original de Open Music Labs, el límite de 22 uF reduce el pico de baja frecuencia, pero brinda una mayor amplitud de espectro. Supongo que también tiene que ver un poco con la frecuencia de muestreo.
Acabo de notar que estoy usando un límite de 3.3uF en lugar de un límite de 3.3nF. Desafortunadamente, no tengo un límite de 3.3nF, así que lo eliminé por completo y el nivel de ruido + pico todavía está presente, PERO, la señal de audio parece ser mucho más fuerte en el espectro, por lo que realmente puedo distinguir la patada en el música, independientemente del género, lo cual es genial. ¡Ojalá se pudiera borrar el ruido! ¡Eso seria genial!
Parece que todavía tiene un problema con la compensación de CC, y solo está adivinando la causa y las posibles soluciones. Si tiene un osciloscopio, puede medir la compensación (podría usar un voltímetro si no hay audio presente). Averigüe cuál es la compensación de CC. Verifique el rango de entrada del ADC: puede ser de 0 a 5 V, o puede ser de 0 a 3,3 V o algo más. Entonces puede asegurarse de que su compensación de CC llegue a la mitad del rango. Deja de adivinar y empieza a medir.
@JRE No tengo osciloscopio, ese es mi mayor inconveniente. Supongo que necesito conseguir uno. ¿Ves lo que hice ahí? jeje... Tengo un voltímetro, ¿podría darme una instrucción simple sobre cómo medir la compensación de CC con un voltímetro?
Suficientemente simple. Conecta todo como si fueras a usarlo, pero asegúrate de que no haya audio en la línea de entrada de audio; DEBE estar conectado con todo funcionando, simplemente sin audio. Mida el voltaje de CC en C2 (4,7 nF). Mida también el voltaje de CC donde entra en el ADC (después del multiplexor de entrada analógica). Verifique las especificaciones y el diagrama real del ADC: las especificaciones deben indicarle el rango de entrada. También puede depender del voltaje de referencia que el circuito entrega al ADC, así que verifíquelo también.
@JRE El voltaje de CC en C2 es 2,36, el voltaje de CC donde entra al ADC es 2,36, el voltaje de referencia es de 5 V, el rango de entrada del ADC es de 5 V. ¿Qué más necesito hacer?
@xaid: si te refieres a C2 en mi dibujo, es correcto. ¿Qué % de escala completa lee el ADC? Debería estar cerca de la mitad de la escala, pero es muy difícil acertar exactamente, lo que aparecerá en el FHT, de ahí mi recomendación para un paso alto digital antes del FHT.
El siguiente paso más allá de eso, suponiendo que el ADC lea correctamente, es colocar una forma de onda predecible en el audio, como una onda sinusoidal, triangular, de diente de sierra o similar. Luego registre la forma de onda en el ADC (en bruto, no FHT) y compárela con un osciloscopio.
Hace varios años, compré un endoscopio de 4 canales en eBay por alrededor de $150 (dólares estadounidenses), incluidas las sondas y el envío. Solo necesita un canal para esto si lo mueve a diferentes puntos del circuito, pero es bueno tener algunos más. Una muy buena inversión.
¿Qué significa % de escala completa? Por favor explique. ¿Quiere decir que si alimento ADC con 5 voltios, debería leer 1024 en la salida en serie? Del mismo modo, si conecto a tierra, ¿la salida debería ser 0? Si eso es correcto, supongo que el % es 100% porque 5 voltios dan el valor 1023 y tierra da el valor 0.
Si es un ADC de 10 bits, la escala completa es 1023 y, por lo tanto, la escala media (50 %) es 511. Si es un ADC de 12 bits, la escala completa es 4095 y, por lo tanto, la escala media (50 %) es 2047. Si sus voltajes de referencia son +5 V y 0 V, entonces la escala completa sería +5 V y 0 sería 0 V, pero hay muchos ADC que usan referencias diferentes a las de las fuentes de alimentación.
Desea que el paso alto analógico lea cerca de la mitad de la escala (50%) sin señal. No tiene que ser exacto porque lo arreglará con un paso alto digital, pero cuanto más lejos esté, más fácil será recortar.
Según la documentación del chip que estoy usando, el ADC tiene una resolución de 10 bits. Ver página 317, 29.8: atmel.com/images/…
DE ACUERDO. Las cosas están un poco más claras. El ADC le dará valores que representan voltaje entre 0 y 5V. Su CA utiliza un voltaje de CC de 2,36. Una FFT de esa señal tendrá una gran joroba a bajas frecuencias. Debe hacer que los valores muestreados se centren alrededor de 0. Haga esto: 1) Cambie R1 (un poco más bajo, alrededor de 9K) para que el voltaje de CC medido sea exactamente 2.5V. 2) Reste el valor que le da el ADC para 2.5V de los valores entrantes. Esto debería minimizar la "joroba" a bajas frecuencias. Es posible que pueda implementar un filtro de paso alto en lugar de hacer la resta.
En realidad, la implementación más simple de un paso alto que se me ocurre en este momento es una resta, donde el valor a restar está determinado por un paso bajo promedio exponencial.
Me acercaría a esto de manera ligeramente diferente, aunque los JRE también deberían funcionar. Vería lo que me dice el ADC y ajustaría el circuito para que el ADC lea cerca de la mitad de la escala. Esto podría ser ligeramente diferente de la mitad del suministro. Luego tenga en cuenta el error restante en el software como dijo JRE.
Ok, intenté cambiar el valor de R1, hizo que el pico fuera más grande. Al leer el ADC sin señal, oscila alrededor de la mitad de la escala, 450 algo, mientras que la mitad de la escala es alrededor de 511. Entonces, supongo que está bien, ¿verdad? Con respecto al filtro de paso alto, dado que necesito detectar frecuencias bajas, ¿eso no contrarrestaría lo que estoy tratando de lograr?
No si establece si es lo suficientemente bajo. El paso alto analógico (C1,R1,R2) está configurado para aproximadamente 1,5 Hz, tal como lo dibujé. Si su paso alto digital está allí o es más bajo, debería hacer muy poca diferencia, excepto eliminar el desplazamiento de CC.
¿deberíamos probar un valor ligeramente mayor? ¿Diga 25Hz?
Este tipo de filtro es muy sencillo de hacer, pero tiene un rango de frecuencias bastante amplio que no deja pasar por completo pero que tampoco elimina. Por lo tanto, generalmente se establece lejos de las frecuencias de interés para que no las arruine. Dicho esto, el número de 1,5 Hz es una aproximación de componentes disponibles a 2 Hz, que es una década por debajo de 20 Hz, que es el límite inferior tradicional para el audio en general. Puede conectar sus propios números allí y cambiar el circuito en consecuencia.
Tendré que esperar hasta la próxima semana hasta que adquiera un osciloscopio y algunos componentes más para probar esto más a fondo. No entiendo qué tiene que ser tan difícil.
Creo que una gran parte de tu dificultad es tratar de hacer que todo funcione a la vez. Construiste todo el proyecto antes de probar algo y ahora "algo" no funciona. Cada vez que hice eso, terminé rehaciendo todo porque actué por un simple malentendido desde el principio, lo que provocó más errores en todo lo que dependía de esa parte. Lo desarmé todo nuevamente hasta que hizo muy poco, correctamente, luego lo reconstruí paso a paso, probando esta vez. Así que todo el trabajo que se hizo en la primera versión no logró nada más que educación sobre cómo no hacerlo.
@AaronD tienes razón, ese es uno de mis mayores problemas, y lo admito. Sin embargo, tengo buenas noticias. Creo que su diagrama es correcto, y cambié algo en el software, que es usar el espectro Lin8 en lugar de Log, y eso arregló todo con el pico y todo. Así que ahora es agradable y elegante y puedo leer las frecuencias perfectamente. ¿Tal vez intente agregar en la respuesta que usa un método diferente que no sea Log como parámetro?
@xaid: creo que todavía tienes un problema en términos de contaminación de la señal; la escala lineal solo hace que sea más difícil ver eso. Pero dependiendo de lo que realmente estés haciendo con él, podría ser lo suficientemente bueno. Como visualización final, la escala logarítmica sería mucho más útil, pero si está activando algo más, probablemente sean los mismos números detrás de escena, independientemente de la escala.
@AaronD Creo que es lo suficientemente bueno. el ruido es apenas visible, la patada salta por encima de 128 en valor. Eso es todo lo que realmente necesito. Francamente, me gustaría ampliar la resolución en la región más baja del espectro de frecuencias, para que la patada pudiera distinguirse más, pero después de más de una semana de constantes pruebas y adivinanzas, creo que no puedo. pedir más que esto, por ahora, al menos. ¡Gracias por tu esfuerzo, realmente lo aprecio!
¡Encantado de ayudar! .