Paso 4: Detección de pitch generalizada
Básicamente lo que hice fue elegir un voltaje que sabía que siempre estaría en los límites de mi onda (2.5V). Entonces miré a cada vez que la onda cruza este nivel con una pendiente hacia arriba, vamos a llamar a estos eventos de"umbral". Si esto sucedió varias veces en un ciclo que elegí el evento umbral con la pendiente más grande que el comienzo de mi ciclo. Similar al ultimo paso, he utilizado una variable llamada "tiempo" (se incrementa a una tasa de 38.5 kHz) para medir el tiempo entre eventos de umbral y almacenado se trata de un array llamado [contador]. También grabé la pendiente en cada uno de los eventos de umbral en un array llamado [cuesta]. Luego comparé los elementos de [contador] y [] pendiente de averiguar donde había un partido. Una vez que se encuentra una coincidencia, agregué elementos de contador de tiempo [] para determinar la duración del ciclo y enviar este valor a una variable global llamada "periodo". Luego en la función loop() principal (todos los pasos que he de describir ocurren en la rutina de interrupción del ADC) utiliza el valor del periodo para calcular la frecuencia e imprimirlo. También debo añadir que puse una variable en el código llamado "noMatch" que me ayudó a decidir que había sido demasiado largo puesto que tuve un buen partido y que sólo debo regrabación de los elementos de [contador] y [] pendiente.
Al escribir esto pensé en un montón de posibles escenarios que podrían romper el algoritmo. La ola más difíciles en mi mente es uno que pasa los 2.5V umbral muchas veces en un ciclo en similares cuestas y espaciadas a lo largo del ciclo del mismo modo. Tiene una onda como esta, tienes que tener slopeTol muy baja (0-3) y tal vez encuentre que timerTol bajar (a tal vez 5) ayuda a seguir la onda correctamente. También, si desea medir ondas con pendientes muy pronunciadas (como las ondas de pulso) se debe establecer el valor de slopeTol hasta 100 o incluso hasta 256 a seguirlo mejor.
Generalmente este pedazo de código parece manejar muy bien un montón de formas, se pueden ver algunos de mis resultados en las imágenes de arriba. En amarillo se muestra la señal de entrada y el evento de umbral que es el seguimiento de Arduino está indicado por un pulso del pin 12 (azul).
También he añadido un poco de código para parar calcular e imprimir datos de frecuencia cuando la amplitud de la onda cae por debajo de cierto nivel. (Si hay poca o ninguna señal entonces el código anterior a veces escupe un montón de basura). Aquí está: