Editar: salta a la parte inferior para obtener una solución decente.
De forma predeterminada, analogRead () es demasiado lento para muestrear correctamente las señales a 1kHz +. Hay varias cosas que puede / debe hacer si desea utilizar el ADC Arduino para la detección de tonos:
-
Cambia el prescaler de reloj ADC. A 16 MHz, he podido establecer ADPS tan bajos como 3, aunque la precisión se reducirá.
-
Deje de usar analogRead () y escriba su propio contenedor de lectura ADC. Hay una gran cantidad de cruft en analogRead () que no necesitas si sabes lo que estás haciendo.
-
Ponga el ADC en modo de ejecución libre, para que no tenga que esperar a que se muestre.
Al hacer todas estas cosas, es posible acercar la frecuencia de muestreo del ADC a 10 kHz o más, lo que es lo suficientemente rápido para sus propósitos. Tenga en cuenta que a menos que sea bastante inteligente con su código, es probable que este proceso consuma casi todos sus ciclos, lo que le deja un Arduino poco útil.
Sin embargo, hay una alternativa: buenos filtros analógicos. Cree dos filtros de picos con una Q alta en sus frecuencias de interés, colóquelos en los detectores de picos y, a continuación, su Arduino solo necesita mirar dos señales digitales.
Editar: otra forma de hacerlo. Rectifique el audio y péguelo a una señal digital. Luego cuente los pulsos en un intervalo de tiempo constante con el Arduino. Esta es la forma más fácil de hacer las cosas (menos hardware, no requiere demasiados ciclos, puede ejecutarse en una interrupción).