Capter les graves et aigus d'un son et son intensité

Bonjour à tous,

J'ai acheté il y a peu de temps un capteur sonore : http://www.robotshop.ca/capteur-son-dfrobot-4.html J'arrive sans soucis à capter l'intensité du son. Vous me direz, normal c'est fait pour ça :) Pour la suite j'aimerai pouvoir savoir si le son qui est capté et plus dans les graves ou les aigus.

Mon but est de pouvoir jouer avec la lumière selon la fréquence, donc grave et aigu (corrigé moi si je me trompe :p ainsi que l'intensité. Je suis preneur de toutes informations que ce soit au niveau matériel et programmation afin d'orienter mes recherches pour la suite.

Merci d'avance de votre aide :)

audio spectrum analyzer...

cela doit être surement par là que je dois chercher :)

Éventuellement amplifier le signal si nécessaire. Séparer les graves et les aigus avec des filtres. Autant de bandes que tu voudras. Si tu veux juste l'amplitude il faut redresser filtrer et numériser avec les entrées analogiques de ton Arduino.

Niveau matériel ? Je suppose que le capteur sonore n'est pas suffisant ?

Salut chesnel -.^

Pour le “découpage” du son en fonction des fréquences tu peux utiliser les algo’ FFT. Enfin, c’est ce qui me semble le plus pratique (il y a d’autres moyens); c’est ce que j’utilise pour des projets… Sensiblement équivalent.

Regardes ici :
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1286718155
Il y a une librairie déjà toute cuite pour une analyse en 8bit -.^

merci ! Je vais commencer par regarder comme créer une librairie :) Mais tu me confirmes qu'un sensor comme celui que j'ai linker fait l'affaire ?

D'après ce qu'on voit ici : -> http://www.dfrobot.com/wiki/index.php?title=Analog_Sound_Sensor_%28SKU:_DFR0034%29 C'est un détecteur d'intensité de sons, avec mesure de l'intensité et renvoi sous forme analogique (tension 0->5V) en fonction de l'intensité du son. J'avoue que j'ai pas tout de suite intégré l'idée...

Mais d'après le schéma donné ici : -> http://www.dfrobot.com/image/data/DFR0034/DFR0034_SoundSensor_SC.pdf On y voit un LM358 monté en ampli-op, si je ne me trompe pas (?) ^.^

Par contre nous n'avons pas d'informations à propos de la sensibilité en fonction de la plage de fréquence...

Je pense que c’est le LM358 op-amp (qui est un amplificateur si je dis pas d’annerie) qu’il me manque.

Je viens de faire des essais avec la librairie que tu m’as fourni en lien.

   if (millis() > tt){
	if (i < 128){
	  val = analogRead(A0);
	  data[i] = val / 4 - 128;
	  im[i] = 0;
	  i++; 
         
	  
	}
	else{
	  //this could be done with the fix_fftr function without the im array.
	  fix_fft(data,im,7,0);
	  // I am only interessted in the absolute value of the transformation
	  for (i=0; i< 64;i++){
	     data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);     
          
	  }
        
        for (e=0; e< 64; e++){
    
          Serial.print(data[e], DEC);
          Serial.print(" ");

	  //do something with the data values 1..64 and ignore im
	  if(e == 63){ Serial.print("\n\n"); }
	}
       
    
       tt = millis();
       }
    }

j’affiche avec une boucle for chaque insérer dans le tableau data et voici ce qu’il me ressort en print

62 41 1 14 0 8 1 6 1 4 1 4 1 4 0 2 0 3 0 2 1 2 1 3 1 2 1 2 0 1 1 1 1 1 1 2 0 1 1 2 1 1 1 1 1 1 0 1 1 0 0 2 1 2 1 1 1 1 1 1 1 1 1 0 

62 41 1 14 0 8 1 6 1 4 1 4 1 4 0 2 0 3 0 2 1 2 1 3 1 2 1 2 0 1 1 1 1 1 1 2 0 1 1 2 1 1 1 1 1 1 0 1 1 0 0 2 1 2 1 1 1 1 1 1 1 1 1 0 

57 37 1 14 3 7 0 5 1 4 1 4 0 4 1 3 0 2 0 3 1 2 1 1 1 1 1 1 1 2 1 2 1 1 0 2 0 2 1 1 1 1 1 1 0 1 1 1 1 0 0 2 1 1 2 1 2 0 1 1 1 2 0 1 

40 28 1 12 3 4 3 3 3 7 7 3 2 2 2 2 2 2 0 2 1 1 2 3 2 1 1 0 1 1 3 3 1 0 0 0 0 1 1 1 1 3 1 1 1 1 1 1 1 2 1 2 2 3 3 2 0 3 2 1 0 1 0 1 

55 37 0 12 1 6 2 7 2 4 4 6 1 3 1 4 0 3 0 2 1 3 0 1 2 2 1 2 0 1 1 2 2 2 1 1 1 1 1 2 0 2 1 1 1 1 2 2 1 1 0 2 1 0 1 0 1 1 1 0 1 0 0 1 

55 38 0 12 0 6 2 5 2 5 1 3 1 4 1 3 1 1 0 2 2 1 0 3 1 1 1 2 1 1 1 1 1 2 1 3 0 2 1 1 1 1 1 1 1 2 0 1 2 0 0 1 1 1 1 1 1 1 1 1 0 1 0 1 

59 38 1 14 0 6 1 5 1 6 2 5 0 4 1 3 1 3 0 1 1 2 1 2 1 2 0 1 0 2 1 1 1 2 0 1 1 2 1 1 0 1 1 1 1 1 1 1 1 1 0 2 1 1 0 2 0 0 0 1 0 1 0 1 

59 40 0 13 2 8 1 6 0 4 0 4 1 4 1 2 1 3 0 2 0 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 0 2 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 2 1 1 1 1 1 1 

61 40 2 14 0 8 0 7 1 4 0 5 1 2 0 2 1 3 0 2 1 2 1 2 1 2 0 1 1 2 1 2 1 2 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 2 1 0 2 2 0 1 1 1 0 1 

61 41 0 14 1 8 0 7 1 4 0 4 1 3 0 4 0 3 0 3 1 2 0 3 1 2 0 1 1 1 1 1 2 1 1 2 1 1 0 1 1 1 0 1 1 2 0 1 1 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 

61 40 2 14 0 8 1 7 1 4 1 4 1 3 1 4 1 2 0 2 0 2 1 1 1 2 1 2 1 2 1 2 1 1 1 2 0 1 1 1 1 1 1 2 1 1 1 1 1 1 0 1 0 2 1 0 2 2 1 0 1 0 0 1 

61 41 0 14 1 9 0 7 1 5 0 5 1 5 1 3 1 3 0 2 1 2 1 3 1 2 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 1 1 1 2 1 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0

J’ai fait des essais en jouant des notes de guitare… Ont peut voir une variation mais elle est très faible… et d’ailleurs j’ai du mal a comprendre les changements… Quand il n’y à pas de bruit ce sont ses valeurs qui ressorte

62 41 1 14 0 8 1 6 1 4 1 4 1 4 0 2 0 3 0 2 1 2 1 3 1 2 1 2 0 1 1 1 1 1 1 2 0 1 1 2 1 1 1 1 1 1 0 1 1 0 0 2 1 2 1 1 1 1 1 1 1 1 1 0

tout ne devrait pas être à zéro ? Mais bon vus que je débute dans tout ça il est possible que je ne résonne pas comme il faut ><

Pour visualiser les harmoniques, j'ai fait un petit graphique; c'est souvent plus... "humain" de cette manière, bien qu'à force de voir des séries de chiffres on fini par "y voir les structures" :

(pour le signal lorsqu'il n'y a pas de sons)

C'est difficile de dire précisément ce qu'il en retourne car il nous faudrait connaitre l'amplitude maximum (j'ai arbitrairement fixé 100U. dans l'échelle), mais à priori il y a pas mal de bruits de fond. Surtout dans les basses fréquences.

Ce qu'il faudrait faire à moins que tu es un oscilloscope sous la main car dans ce cas c'est plus simple c'est récupérer toutes ces valeurs pour les visualiser sous forme graphique en temps réel (genre via Processing; il y a des outils déjà tout fait pour générer des histogrammes). De cette manière tu pourrais appréhender la relation de cause à effet sur le signal que tu récupères, et voir si/comment il faudrait adapter le signal reçu par l'Arduino. Tu aurais un intéressant analyseur spectrale -.^

En même temps, tout cela est assez complexe, surtout pour des débuts dans le domaine; il convient de se poser la question "n'est-ce pas plus simple d'utiliser un module plus adéquate". Bien que ceci soit fort intéressant et formateur.

Même en mettant le senseur du capteur sonore au plus bas les valeurs reste identique aux niveaux des harmoniques. Donc soit l'amplificateur est une obligation pour ce faire une idée de la réception du son et des différentes fréquences... ou ma programmation de base n'est pas correct :p

J'utilise un peu processing mais pour le moment je vais me contenter des chiffres pour visualiser :)

Bon la prochaine étape c'est de trouver un amplificateur audio LM358 et la boutique en ligne ou j'achète le matériel n'en n'a pas :S sauf dans un kit pour faire un multimètre.

Sinon la solution trouvé une alternative pour mon projet...

Vue la description du site, il s'agit bien d'un capteur d'intensité sonore, moi j'interprète ce qui est dit : ce n'est pas un micro. Je pense qu'en revanche en récupérant un micro quelque part et en y ajoutant si nécessaire un étage d'amplification à transistor, tu arriveras directement à faire ce que tu veux faire. Ce qui me semblerait même encore mieux ça serait de rajouter 3 filtres pour séparer chaque gamme sonore que tu veux mesurer. C'esttrès facile à faire et tu pourras mesurer directement ce que tu veux sans traitement logiciel complexe.

c'est peut être ceci que j'aurais dut acheter ? un microphone couplé de base avec un amplificateur x100 http://www.robotshop.ca/platine-deploiement-microphone-sfe-4.html

Arrives-tu à m'en dire plus sur les filtre sonore ?

Modif: Je viens de relire la description de celui que j'ai acheté...

This small breakout board couples a small electret microphone with a 100x opamp to amplify the sounds of voice, door knocks, etc loud enough to be picked up by a microcontroller's Analog to Digital converter.

C'est la même chose ^^

http://www.sonelec-musique.com/electronique_bases_filtre_audio.html

Je confirme; comme je le précisais plus haut, la description faite sur le site du constructeur à propos de ce module est légèrement... Ambigüe.

Mais, comme aussi je le soulignais, le montage avec le premier LM358 dans le module ressemble fortement à un pré-ampli'. En by-passant le deuxième LM358 (donc la fonction ne m'est pas évidente, adaptation de niveaux ?), cela revient à faire un montage micro + pré-ampli'. Enfin, si je ne m'abuse ^.^

Mais d'après le schéma donné ici : -> http://www.dfrobot.com/image/data/DFR0034/DFR0034_SoundSensor_SC.pdf On y voit un LM358 monté en ampli-op, si je ne me trompe pas (?) ^.^

Un micro avec deux étages d'amplification avec un gain de -10 (ampli inverseur). Donc gain global de 100. Tu peux doper un peu le gain en augmentant R3 et R7 si tu veux (mais faut rester raisonnable sinon tu vas saturer le second ampli).

En by-passant le deuxième LM358 (donc la fonction ne m'est pas évidente, adaptation de niveaux ?),

Deux amplificateurs avec un gain modéré c'est plus stable qu'un ampli avec un gain important et la bande passante est bien meilleur (le produit gain bande étant constant)

ouff.. bon bah cela devient un peut trop complexe pour moi ^^ Je pense que je vais repasser à cette idée une autre fois :) Merci quand même de votre aide !