Frecuencia máxima de muestreo de Arduino Duemilanove?

11

G'day todos!

Tengo un Arduino Duemilanove dando vueltas por el momento y pensé que podría intentar 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 unas pocas salidas digitales conectadas a los LED.

Me gustaría probar a ~ 44.1 kHz si es posible.

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

Sketchy Fletchy
fuente
¡Vaya! Es la versión ATMega168.
Sketchy Fletchy el
44
@Sketchy puede editar su pregunta si lo necesita, en lugar de agregar detalles en un comentario.
Clint Lawrence el
1
Para los afinadores de guitarra, hay una serie de preguntas sobre stackoverflow sobre la estimación de frecuencia. stackoverflow.com/questions/65268/ ... He respondido un montón de ellos y publicado código de muestra para algunos métodos aquí: gist.github.com/255291
endolith

Respuestas:

15

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

Dicho esto, debe 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ás, dado que el fundamental de la cuerda E alta de una guitarra es de alrededor de 330 Hz.

Clint Lawrence
fuente
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 ser capaz de identificar la cadena e alta sin alias. Sin embargo, lo aumentaré un poco por seguridad y sensibilidad. ¡Gracias!
Sketchy Fletchy el
El sistema telefónico toma muestras a 8000 Hz.
joeforker
8

Se necesitan aproximadamente 100 us (0,0001 s) para leer una entrada analógica, por lo que la velocidad máxima de lectura es de aproximadamente 10,000 veces por segundo.

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

Robar.

robzy
fuente
4

Google para el "sintonizador de guitarra AVR", hay un par de proyectos que ya lo hacen, y parecen ser capaces de hacerlo sin demasiados problemas con la velocidad del AVR.

davr
fuente
3

Si utiliza un comparador analógico (ya sea interno en el AVR o 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 haría su código sería contar cero cruces por unidad de tiempo.

todbot
fuente
1
Mi preocupación, creo, es que realmente necesitas ejecutar una FFT para elegir lo fundamental. Las guitarras producen todo tipo de frecuencias cuando se toca una cuerda, y contar los cruces por cero solo le da suficiente información para construir una onda cuadrada, lo que hace que una FFT sea completamente inútil.
wackyvorlon
La salida de guitarra de nota única (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 cerca de la amplitud de lo fundamental. Todos los afinadores de guitarra digital más baratos simplemente sincronizan el paso 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 a Arduino) myplace.nu/avr/gtuner/index.htm y aquí hay otro usando el Arduino con salida MIDI youtube.com/watch?v=oGKE1vmAWCA
todbot
No creo que los afinadores de guitarra cuenten con cero cruces, y este ciertamente no es un buen método. Ni siquiera está cerca de una onda sinusoidal, y puede haber muchos cruces por ciclo por ciclo: flic.kr/p/7ns9nu
endolith
Los sintonizadores que he visto tenían un filtro de paso bajo para convertir la señal de entrada lo más posible en una onda sinusoidal.
todbot
3

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

Las muestras gratis son tu amigo :)

wackyvorlon
fuente
1
¡Muchas gracias! Eso será un poco más de lo que necesito para poner en marcha un simple sintonizador, 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!
Sketchy Fletchy 01 de
1

Primero, para su aplicación particular, realmente solo necesita una frecuencia de muestreo de aproximadamente 1 kHz, 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 necesitan aproximadamente 100 microsegundos (0,0001 s) para leer una entrada analógica, por lo que la velocidad máxima de lectura es de aproximadamente 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 de ADC . La página Arduino Realtime Audio Processing utiliza dos canales a 15 kHz, por ejemplo. Entonces, el máximo de 10 kHz es solo mientras se usa la función incorporada AnalogRead (), porque tiene mucha sobrecarga.

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

Por defecto, los circuitos de aproximación sucesivos requieren una frecuencia de reloj de entrada [reloj ADC] entre 50 kHz y 200 kHz para obtener la resolución máxima.

Dado que una conversión ADC toma 13 ciclos de reloj, esta sería una frecuencia de muestreo de 4 kHz a 15 kHz. De acuerdo con 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 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, así que ese es el máximo realista.

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

endolito
fuente
0

El convertidor en chip funcionará para esta aplicación como otros han señalado, pero realmente debería considerar el uso de 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 mayores, 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, utilice algo como el LTC1867, que le permitirá muestrear hasta 175 kHz (aunque puede cronometrarlo con la rapidez que desee) y luego lea los datos de 24 bits a hasta 20MHz sobre SPI. ¿Ves lo que un verdadero ADC puede hacer? :) Con ese tipo de potencia (y un DSP de 24 o 32 bits), puede comprimir y almacenar su audio, filtrarlo, modularlo, reproducirlo ... las posibilidades son infinitas.

Kevin Vermeer
fuente
0

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

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

Echa un vistazo allí

Comunidad
fuente