Taux d'échantillonnage maximum d'Arduino Duemilanove?

11

Bonjour à tous!

J'ai un Arduino Duemilanove qui traîne en ce moment et j'ai pensé que je pourrais essayer quelques projets d'interface audio. Je me demande simplement quelle sorte de fréquence d'échantillonnage je peux atteindre en utilisant une seule entrée analogique et en appliquant des algorithmes simples sur la puce, puis en utilisant quelques sorties numériques liées aux LED.

J'aimerais échantillonner à ~ 44,1 kHz si possible.

Pour référence, la première chose que je veux essayer est un simple accordeur de guitare.

Sketchy Fletchy
la source
Oups - c'est la version ATMega168.
Sketchy Fletchy
4
@Sketchy, vous pouvez modifier votre question si vous en avez besoin, plutôt que d'ajouter des détails dans un commentaire.
Clint Lawrence
1
Pour les accordeurs de guitare, il y a un certain nombre de questions sur le stackoverflow concernant l'estimation de fréquence. stackoverflow.com/questions/65268/… J'ai répondu à un tas d'entre eux et publié un exemple de code pour certaines méthodes ici: gist.github.com/255291
endolith

Réponses:

15

Je ne pense pas que vous puissiez échantillonner aussi rapidement en pleine résolution. L'ATMega168 ne peut échantillonner qu'à 15 ksps à sa pleine résolution.

Cela dit, vous devriez pouvoir obtenir un taux d'échantillonnage approprié pour obtenir un accordeur de guitare fonctionnel. 44,1 kHz est probablement un peu plus rapide que ce dont vous aurez besoin étant donné que le fondamental de la corde de mi élevé et d'une guitare est d'environ 330 Hz.

Clint Lawrence
la source
Brillant - cela répond à ma question avec élégance. Je ne pensais pas que le 168 serait capable d'un échantillonnage complet du spectre audio humain, mais si je peux obtenir un taux d'échantillonnage d'au moins 660 Hz, je devrais être en mesure d'identifier la chaîne de haut e sans aliasing. Je vais cependant augmenter un peu la sécurité et la sensibilité. Merci!
Sketchy Fletchy
Le système téléphonique échantillonne à 8000 Hz.
joeforker
8

Il faut environ 100 us (0,0001 s) pour lire une entrée analogique, donc la vitesse de lecture maximale est d'environ 10 000 fois par seconde.

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

Rob.

robzy
la source
4

Google pour 'AVR guitar tuner', il existe déjà quelques projets qui le font déjà, et ils semblent pouvoir le faire sans trop de problèmes avec la vitesse de l'AVR.

davr
la source
3

Si vous utilisez un comparateur analogique (soit l'un interne de l'AVR ou un ampli op externe) qui transforme l'entrée analogique en une onde carrée, vous pouvez échantillonner les oscillations à des vitesses beaucoup plus élevées. Bien que ce ne soit pas un véritable échantillonnage audio, pour construire un accordeur de guitare, c'est souvent tout ce dont vous avez besoin car tout votre code ferait de toute façon serait de compter zéro passage par unité de temps.

todbot
la source
1
Je pense que je crains que vous ayez vraiment besoin de lancer une FFT pour sélectionner les fondamentaux. Les guitares produisent toutes sortes de fréquences lorsqu'une corde est pincée, et le comptage des passages par zéro ne vous donne que suffisamment d'informations pour construire une onde carrée, ce qui rend une FFT assez complètement inutile.
wackyvorlon
La sortie de guitare à note unique (en particulier électrique) est une approximation proche d'une onde sinusoïdale, une fois que vous avez dépassé le transitoire initial. Pas d'harmoniques étranges à proximité de l'amplitude du fondamental. Tous les accordeurs de guitare numérique bon marché font juste un timing de passage à zéro et ne font rien dans le domaine des fréquences. Voici un exemple de la technique sur un AVR 2323 (proche par rapport à Arduino) myplace.nu/avr/gtuner/index.htm et en voici un autre utilisant l'Arduino avec MIDI out youtube.com/watch?v=oGKE1vmAWCA
todbot
Je ne pense pas que les accordeurs de guitare comptent zéro croisements, et ce n'est certainement pas une bonne méthode. Il n'est même pas proche d'une onde sinusoïdale, et il peut y avoir plusieurs passages à zéro par cycle: flic.kr/p/7ns9nu
endolith
Les tuners que j'ai vus avaient un filtre passe-bas pour transformer le signal d'entrée autant en onde sinusoïdale que possible.
todbot
3

Il existe un certain nombre d'ADC disponibles en série, I2S est la norme NXP basée sur I2C. Ils vous permettent de tirer assez facilement en analogique, même à des vitesses beaucoup plus élevées. Ce lien devrait vous amener à une partie NXP conçue pour l'audio: UDA1361TS

Des échantillons gratuits sont votre ami :)

wackyvorlon
la source
1
Merci beaucoup! Ça va être un peu plus que ce dont j'ai besoin pour lancer un simple tuner, mais cette puce semble parfaite pour certains de mes futurs projets. J'aimerais finalement obtenir un simple deck DSP en ligne pour expérimenter le traitement des effets. Merci!
Sketchy Fletchy
1

Tout d'abord, pour votre application particulière, vous n'avez vraiment besoin que d'une fréquence d'échantillonnage d'environ 1 kHz, en supposant que vous accordez la fréquence fondamentale et non l' un des partiels inharmoniques ...

Quoi qu'il en soit, en ce qui concerne la fréquence d'échantillonnage maximale possible, le manuel Arduino dit:

Il faut environ 100 microsecondes (0,0001 s) pour lire une entrée analogique, donc la vitesse de lecture maximale est d'environ 10 000 fois par seconde.

Cela impliquerait que la fréquence d'échantillonnage de 10 kHz est la fréquence max. Pourtant. Vous pouvez obtenir des taux d'échantillonnage plus élevés en accédant directement aux registres ADC . La page de traitement audio en temps réel Arduino utilise par exemple deux canaux à 15 kHz. Donc, le 10 kHz max est uniquement en utilisant la fonction intégrée AnalogRead (), car elle a beaucoup de surcharge.

L'ADC est optimisé pour un fonctionnement optimal avec une vitesse d'horloge comprise entre 50 kHz et 200 kHz:

Par défaut, les circuits d'approximation successifs nécessitent une fréquence d'horloge d'entrée [horloge ADC] comprise entre 50 kHz et 200 kHz pour obtenir une résolution maximale.

Puisqu'une conversion ADC prend 13 cycles d'horloge, ce serait une fréquence d'échantillonnage de 4 kHz à 15 kHz. Selon AVR120: Caractérisation et étalonnage de l'ADC sur un AVR :

Pour des performances optimales, l'horloge ADC ne doit pas dépasser 200 kHz. Cependant, des fréquences jusqu'à 1 MHz ne réduisent pas la résolution ADC de manière significative.

Le fonctionnement de l'ADC avec des fréquences supérieures à 1 MHz n'est pas caractérisé.

Fréquence d'horloge de 1 MHz = fréquence d'échantillonnage de 77 kHz, c'est donc le maximum réaliste.

Le fil de discussion Faster Analog Read? a plus à ce sujet.

endolith
la source
0

Le convertisseur sur puce fonctionnera pour cette application comme d'autres l'ont souligné, mais vous devriez vraiment envisager d'utiliser un ADC externe. Cela vous évitera beaucoup de problèmes et libérera votre micro pour échantillonner sur SPI ou I2C à des taux de données beaucoup plus élevés, plus faibles, avec moins de bruit provenant de l'horloge du micro et avec une plus grande précision que l'utilisation de l'ADC interne. Si vous voulez plus de résolution et / ou un débit de données plus élevé, utilisez quelque chose comme le LTC1867, qui vous permettra d'échantillonner jusqu'à 175 kHz (bien que vous puissiez le synchroniser aussi rapidement que vous le souhaitez), puis lisez les données 24 bits jusqu'à 20 MHz sur SPI. Voyez ce qu'un véritable ADC peut faire? :) Avec ce genre de puissance (et un DSP 24 ou 32 bits), vous pouvez compresser et stocker votre audio, le filtrer, le moduler, le lire ... les possibilités sont infinies.

Kevin Vermeer
la source
0

Êtes-vous intéressé par un taux d'échantillonnage de 64K? Jetez un oeil ici

Maintenant porté à 150 kHz, 10 bits, aucun composant supplémentaire!

Jetez un oeil là-bas

Communauté
la source