Go Down

Topic: Traiter un signal audio avec Arduino (Read 4431 times) previous topic - next topic

Wrex04

Bonjour,

J'ai récemment acheté l'electret breakout board de sparkfun (https://www.sparkfun.com/products/9964). Je souhaite récupérer le signal audio sur un CAN de mon Arduino MEGA pour le traiter. J'alimente le circuit avec le 5V de l'Arduino et je branche la broche "AUD" sur une entrée analogique. Sur le moniteur série, la valeur du signal semble centrée autour de 500. Cependant, lorsque je souffle sur le micro par exemple, le moniteur série affiche 2 valeurs : 0 et 1023. En effet, le micro délivre une tension alternative donc c'est normal, mais est-ce possible de ne récupérer que le 1023 ? En d'autres termes, est-il possible de n'obtenir que la plus haute valeur de la sinusoïde ?

Merci de votre attention :)

Cordialement,
Wrex04

Christian_R

Du bruit blanc n'est pas sinusoïdal, mais une superposition de plein de fréquences.
Tu peux récupérer la valeur maximale de ton entrée avec un simple if qui comparer la valeur mesurée à un seuil.

Il faudra sans doute bien choisir la fréquence d'échantillonnage, filtrer,  et un seuil correct pour ne pas mesurer trop n'importe quoi.
Christian

Wrex04


avec un simple if qui comparer la valeur mesurée à un seuil.


Un if  ? Je ne vois pas vraiment comment procéder :(


Plutôt qu'un if, tu peux aussi utiliser la fonction "max()":     

max(x,y)

retournera  la valeur la plus grande entre x et y.

http://electroniqueamateur.blogspot.ca/

Wrex04

En fait, je souhaite faire la moyenne du niveau sonore capté par le micro sur 5 acquisitions espacées chacune d'une seconde. Voici le code :
Code: [Select]
temps=millis();
        if((millis()-temps) > 1000)
        {
          mes1 = analogRead(micro);
        }
        if((millis()-temps) > 2000)
        {
          mes2 = analogRead(micro);
        }
        if((millis()-temps) > 3000)
        {
          mes3 = analogRead(micro);
        }
        if((millis()-temps) > 4000)
        {
          mes4 = analogRead(micro);
        }
        if((millis()-temps) > 5000)
        {
          mes5 = analogRead(micro);
        }
        moy = (mes1+mes2+mes3+mes4+mes5)/5;


Dans ce cas, où devrais-je mettre la fonction "max()" ?

Christian_R

les cas ne sont pas mutuellement exclusifs, si le délai est >5000 les 5 conditions sont validées à la fois...
Christian

Wrex04

Ah ... et donc si je veux que ces cas soient strictement exclusifs, que devrais-je changer si je veux que mon programme continue à tourner pendant ce temps ? parce qu'avec des fonction delay(), ce n'est pas possible

XavierMiller


fdufnews

Code: [Select]
temps=millis();
        if(millis()>(temps + 5000))
        {
          mes5 = analogRead(micro);
        }else if(millis()>(temps + 4000))
        {
          mes4 = analogRead(micro);
        }else if(millis()>(temps + 3000))
        {
          mes3 = analogRead(micro);
        }else if(millis()>(temps + 2000))
        {
          mes2 = analogRead(micro);
        }else if(millis()>(temps + 1000))
        {
          mes1 = analogRead(micro);
        }
        moy = (mes1+mes2+mes3+mes4+mes5)/5;
       maximum = max(mes1,max(mes2,max(mes3,max(mes4,mes5))));


ATTENTION sauf si tu as prévu un filtrage énergique à la sortie de la carte micro-electret chaque échantillon ne représentera qu'une toute petite portion de temps située 1s après le précédent échantillon. Cette fonction ne permet pas de faire une mesure de la moyenne sur 5 secondes.

Wrex04

En fait je voudrais juste savoir quel est le niveau sonore ambiant moyen capté par le micro sur 5 secondes, je n'ai strictement aucune idée de comment faire :(
Merci pour la correction fdufnews, mais parmi les 5 mesures faites, je peux avoir 1023, 1023, 1023, 0, 1023 aussi bien que 0, 0, 0, 0, 1023, donc je vois pas du tout comment faire pour avoir que des 1023.

fdufnews

Il faudrait faire un détecteur de crête.
La constante de temps doit être très supérieure à la fréquence d'échantillonnage mais ne doit malgré tout pas être trop longue car sinon les impulsions trop courtes seraient perdues. En effet pour que le niveau soit conservé dans le condensateur il faut que la source fournisse suffisamment de courant pour charger le condensateur ce qui risque d'être difficile avec l'ampli de la carte micro.
Donc il est préférable d'avoir une constante de temps pas trop longue (disons de quelques millisecondes à quelques dizaines de millisecondes), d'échantillonner plus souvent et de conserver le maximum à chaque fois. Toutes les 5s tu mémorises le maximum pour ton besoin.

Wrex04

Merci beaucoup pour ton aide ! Pour la détection de crête j'y avais pensé, mais je dois chercher un diode à mon lycée demain. Désolé de mon ignorance, mais que sont la "constante de temps" et la "fréquence d'échantillonnage" dans ce cas ?

Christian_R

La fréquence d'échantillonnage est le nombre de fois par seconde que tu fais une mesure.
Dans ton cas, tu peux faire une boucle qui mesure durant 5 secondes, par exemple 5x1000 mesures, et faire une moyenne du signal chaque 0.1 sec (c'est juste un ordre de grandeur, ça dépend du son à traiter).
Christian

Wrex04

#13
May 12, 2014, 07:31 am Last Edit: May 12, 2014, 06:59 pm by Wrex04 Reason: 1
Ah d'accord ! Et on gère ça comment au niveau du programme ?

Edit : J'ai trouvé une diode, je vais essayer le montage du détecteur de crête.

Wrex04

Sur le schéma du détecteur de crête de fdufnews (http://jmpodvin2000.free.fr/terminale/Terminale%20physique/speph/ondeselec/Dmodul/demodula.htm), la diode est branchée sur la sortie du préampli et la résistance et le condensateur sont branchés entre la masse et la sortie, c'est ça ?

Go Up