Frecuencia de muestreo máxima de Arduino Duemilanove?

¡Buenos días a todos!

Tengo un Arduino Duemilanove dando vueltas en este momento y pensé que podría probar algunos proyectos de interfaz de audio. Me pregunto qué tipo de frecuencia de muestreo puedo lograr usando una sola entrada analógica y aplicando algunos algoritmos simples en el chip, luego informando usando algunas salidas digitales conectadas a LED.

Me gustaría muestrear a ~44,1 kHz si es posible.

Como referencia, lo primero que quiero probar es un afinador de guitarra simple.

Vaya, es la versión ATMega168.
@Sketchy puede editar su pregunta si lo necesita, en lugar de agregar detalles en un comentario.
Para los afinadores de guitarra, hay una serie de preguntas en stackoverflow sobre la estimación de frecuencia. stackoverflow.com/questions/65268/… He respondido un montón de ellas y he publicado código de muestra para algunos métodos aquí: gist.github.com/255291

Respuestas (8)

No creo que puedas muestrear tan rápido a máxima resolución. El ATMega168 solo puede muestrear a 15 ksps en su máxima resolución.

Habiendo dicho eso, debería poder obtener una frecuencia de muestreo adecuada para obtener un afinador de guitarra que funcione. Lo más probable es que 44,1 kHz sea un poco más rápido de lo que necesitará, dado que la fundamental de la cuerda E alta de una guitarra es de alrededor de 330 Hz.

Brillante, eso responde a mi pregunta fácilmente. No pensé que el 168 sería capaz de muestrear el espectro de audio humano completo, pero si puedo obtener una frecuencia de muestreo de al menos 660 Hz, debería poder identificar la cadena e alta sin aliasing. Sin embargo, lo aumentaré un poco por seguridad y sensibilidad. ¡Gracias!
El sistema telefónico muestrea a 8000 Hz.

Se tarda unos 100 us (0,0001 s) en leer una entrada analógica, por lo que la velocidad de lectura máxima es de unas 10.000 veces por segundo.

http://arduino.cc/en/Reference/AnalogRead

Robar.

Google para 'afinador de guitarra AVR', hay un par de proyectos que ya hacen esto, y parecen ser capaces de hacerlo sin demasiados problemas con la velocidad del AVR.

Si usa un comparador analógico (ya sea el interno en el AVR o uno externo) que convierte la entrada analógica en una onda cuadrada, puede muestrear oscilaciones a velocidades mucho más altas. Si bien esto no es un verdadero muestreo de audio, para construir un afinador de guitarra a menudo es todo lo que necesita, ya que todo lo que su código haría de todos modos sería contar cruces cero por unidad de tiempo.

Creo que mi preocupación es que realmente necesita ejecutar una FFT para seleccionar el fundamental. Las guitarras producen todo tipo de frecuencias cuando se puntea una cuerda, y contar los cruces por cero solo le brinda suficiente información para construir una onda cuadrada, lo que hace que una FFT sea completamente inútil.
La salida de guitarra de una sola nota (especialmente eléctrica) es una aproximación cercana a una onda sinusoidal, una vez que pasa el transitorio inicial. No hay armónicos extraños en ningún lugar cerca de la amplitud de la fundamental. Todos los afinadores de guitarra digitales baratos simplemente hacen el tiempo de cruce por cero y no hacen nada en el dominio de la frecuencia. Aquí hay un ejemplo de la técnica en un AVR 2323 (pariente cercano de Arduino) myplace.nu/avr/gtuner/index.htm y aquí hay otro usando Arduino con salida MIDI youtube.com/watch?v=oGKE1vmAWCA
No creo que los afinadores de guitarra cuenten los cruces por cero, y ciertamente este no es un buen método. Ni siquiera está cerca de una onda sinusoidal, y puede haber muchos cruces por cero por ciclo: flic.kr/p/7ns9nu
Los sintonizadores que he visto tenían un filtro de paso bajo para convertir la señal de entrada en una onda sinusoidal tanto como sea posible.

Hay varios ADC disponibles que son seriales, I2S es el estándar de NXP basado en I2C. Le permiten extraer analógico con bastante facilidad incluso a velocidades mucho más altas. Este enlace debería llevarlo a una pieza de NXP diseñada para audio: UDA1361TS

Las muestras gratis son tu amigo :)

¡Muchas gracias! Eso va a ser un poco más de lo que necesito para poner en marcha un sintonizador simple, pero ese chip se ve perfecto para algunos de mis proyectos futuros. Eventualmente me gustaría obtener una plataforma DSP en línea simple para experimentar con el procesamiento de efectos. ¡Gracias!

Primero, para su aplicación particular, realmente solo necesita una frecuencia de muestreo de 1 kHz o más, suponiendo que esté sintonizando la frecuencia fundamental y no uno de los parciales inarmónicos ...

De todos modos, en cuanto a la tasa de muestreo máxima posible, el manual de Arduino dice:

Se tarda unos 100 microsegundos (0,0001 s) en leer una entrada analógica, por lo que la tasa de lectura máxima es de unas 10.000 veces por segundo.

Esto implicaría que la frecuencia de muestreo de 10 kHz es la máxima. Sin embargo. Puede obtener tasas de muestreo más altas accediendo directamente a los registros ADC . La página de procesamiento de audio en tiempo real de Arduino utiliza dos canales a 15 kHz, por ejemplo. Entonces, el máximo de 10 kHz es solo cuando se usa la función AnalogRead() incorporada, porque tiene mucha sobrecarga.

El ADC está optimizado para un mejor funcionamiento con una velocidad de reloj de entre 50 kHz y 200 kHz:

De forma predeterminada, el circuito de aproximación sucesiva requiere una frecuencia de reloj de entrada [reloj ADC] entre 50 kHz y 200 kHz para obtener la máxima resolución.

Dado que una conversión ADC requiere 13 ciclos de reloj, esta sería una frecuencia de muestreo de 4 kHz a 15 kHz. Según AVR120: Caracterización y Calibración del ADC en un AVR :

Para un rendimiento óptimo, el reloj ADC no debe exceder los 200 kHz. Sin embargo, las frecuencias de hasta 1 MHz no reducen significativamente la resolución del ADC.

No se caracteriza el funcionamiento del ADC con frecuencias superiores a 1 MHz.

Frecuencia de reloj de 1 MHz = frecuencia de muestreo de 77 kHz, por lo que ese es el máximo realista.

El hilo del foro ¿Lectura analógica más rápida? tiene más sobre esto.

El convertidor en chip funcionará para esta aplicación como han señalado otros, pero realmente debería considerar usar un ADC externo. Esto le ahorrará muchos problemas y liberará a su micro para muestrear a través de SPI o I2C a velocidades de datos mucho más altas, con menos ruido del reloj del micro y con mayor precisión que con el ADC interno. Si desea más resolución y/o una velocidad de datos más alta, use algo como el LTC1867, que le permitirá muestrear hasta 175 kHz (aunque puede sincronizarlo con la rapidez que desee) y luego lea los datos de 24 bits. a hasta 20 MHz sobre SPI. ¿Ves lo que puede hacer un ADC real? :) Con ese tipo de potencia (y un DSP de 24 o 32 bits), puedes comprimir y almacenar tu audio, filtrarlo, modularlo, reproducirlo... las posibilidades son infinitas.

¿Está interesado en una tasa de muestreo de 64K? Echa un vistazo aquí

¡Ahora elevado a 150 kHz, 10 bits, sin componentes adicionales!

echa un vistazo allí