Partage
  • Partager sur Facebook
  • Partager sur Twitter

Deduire le volume sonore a partir d'une onde

    28 juillet 2011 à 13:06:35

    Bonjour,

    Je développe actuellement un logiciel et je butte sur une question de physique.

    L'utilisateur du logiciel parle dans le micro et je souhaite récupérer le volume.
    Or tout ce que j'arrive a récupérer c'est le signal du micro (cf. image pour un exemple).

    Image utilisateur

    Ma question est donc, comment a partir d'un signal, en déduire le volume (en décibel par exemple) de l’entrée du micro a un instant t ?

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      28 juillet 2011 à 13:50:43

      Salut,

      Tu trouveras de bonnes explications sur wikipédia :
      http://fr.wikipedia.org/wiki/D%C3%A9cibel

      À partir de ça, je pense que tu dois pouvoir trouver une valeur de référence à partir de laquelle tu pourras calculer ton volume sonore : le <math>\(X_{dB}\)</math> sur Wikipédia ! :)
      • Partager sur Facebook
      • Partager sur Twitter
        28 juillet 2011 à 16:47:55

        Si j'ai bien compris, un calcul de décibel dépend d'une référence. Or lorsque l'on dit qu'un avion émet 130 dB au décollage, on ne précise jamais de référence. Pourquoi ?
        • Partager sur Facebook
        • Partager sur Twitter
          28 juillet 2011 à 18:33:29

          Je pense que ce qu'il faudrait c'est pouvoir "apprendre" à ton logiciel quelle intensité correspond par exemple à 30 dB. A partir de là, il suffit de comparer l'intensité de ton son et celui qui correspond à 30dB, et le tour est joué !

          Quant au calcul des dB, ça ne dépend pas d'une référence ! Seulement, un auditeur situé à 3km de l'avion en question ne pourra pas savoir quel niveau sonore celui-ci délivre.
          • Partager sur Facebook
          • Partager sur Twitter
          Id quad factum est, factum est.
            29 juillet 2011 à 10:41:25

            Quand je parle de référence, je parle du <math>\(P_0\)</math> dans l'article de Wikipédia (et non d'une référence géographique).


            Citation : http://fr.wikipedia.org/wiki/D%C3%A9cibel#D.C3.A9finition

            P1 étant la puissance étudiée et
            P0 la puissance de référence.




            Et après quelques recherches :


            Citation : http://fr.wikipedia.org/wiki/Son_%28physique%29#Unit.C3.A9_de_mesure

            On utilise deux grandeurs pour mesurer l'intensité : l'intensité, mesurée en watts par mètre carré et pour laquelle l'intensité de référence est <math>\(I0 = 10^{-12}W.m^{-2}\)</math>, et la pression, mesurée en pascals et pour laquelle la pression de référence est P0 = 2.10-5 Pa. En dB, la première est toujours le double de la seconde, et c'est a priori celle qui est utilisée en l'absence de précision.



            Donc a mon avis, lorsque l'on parle de decibel sans rien preciser, il s'agit en fait de dBSPL

            Donc pour avoir le volume en dB, il faut que je calcul <math>\(LI = 10 \log \left ( \frac{I}{I_0} \right )\)</math> avec <math>\(I_0 = 10^{-12}W.m^{-2}\)</math>

            Donc il me reste a savoir : Comment calculer l’intensité de mon signal a un temps donnée ?
            • Partager sur Facebook
            • Partager sur Twitter
              31 juillet 2011 à 15:47:17

              L'intensité c'est (à une constante multiplicative près) le module de ton signal au carré !
              • Partager sur Facebook
              • Partager sur Twitter
                1 août 2011 à 10:03:29

                Et c'est quoi le module du signal ?

                Le seul module que je connaisse s'applique au nombre complexe, ce qui n'est pas le cas ici.
                • Partager sur Facebook
                • Partager sur Twitter
                  2 août 2011 à 18:14:32

                  Tes manipulations de données audios et sont donc numérisés à une certaine fréquence d'échantillonage. La représentation d'un son sur une durée donnée se fait donc par un nombre fini de points.

                  Citation : http://fr.wikipedia.org/wiki/D%C3%A9cibel#D.C3.A9finition

                  On utilise deux grandeurs pour mesurer l'intensité : l'intensité, mesurée en watts par mètre carré et pour laquelle l'intensité de référence est <math>\(I0 = 10^{-12}W.m^{-2}\)</math>, et la pression, mesurée en pascals et pour laquelle la pression de référence est P0 = 2.10-5 Pa. En dB, la première est toujours le double de la seconde, et c'est a priori celle qui est utilisée en l'absence de précision.


                  Là, on parle de notions dans le domaine acoustique analogique. C'est difficilement transposable au numérique. Je propose une autre solution.

                  Citation : miniblin

                  L'intensité c'est (à une constante multiplicative près) le module de ton signal au carré !


                  Notons les points du signal X de cette façon :<math>\(X=(x(1)x(2)...x(n))\)</math>
                  On peut calculer l'énergie (ou intensité) du signal :<math>\(E(X)=\sum_{i=1}^k x(i)^2\)</math>

                  La puissance d'un son se calcule communément en décibel :<math>\(P_{X} = \log_{10}\left({P_1\over P_0}\right)\)</math>
                  On voit que la puissance d'un signal ne se fait que de façon relative par rapport à un autre signal de référence. L'idée est de prendre comme référence le bruit de fond de la pièce.

                  Avant de continuer, remarquez qu'on a écrit comment calculer l'énergie d'un signal mais pas sa puissance. C'est la même chose divisé par la durée du signal. Donc, si l'énergie des deux signaux est calculé sur la même durée <math>\(T\)</math> :
                  <math>\(P_{X} = \log_{10}\left({P_1\over P_0}\right)=\log_{10}\left({\frac{E_1}{T}\over \frac{E_0}{T}}\right)=\log_{10}\left({E_1\over E_0}\right)=\log_{10}\left({\sum_{i=1}^k x_1(i)^2\over \sum_{i=1}^k x_0(i)^2}\right)\)</math>

                  Je pense que tu as envie de faire une application qui tourne en temps-réel. Pourquoi tu veux connaitre le volume ?

                  Pour calculer une énergie, on a besoin de <math>\(k\)</math> points. L'idée serait de calculer la variation de l'énergie au cours du temps, mais comme on a besoin de plus d'un point pour calculer l'énergie, on calcule l'énergie sur des fenêtres (c'est à dire des groupes de points) à différentes positions dans le temps :
                  Image utilisateur
                  L'énergie <math>\(E_0\)</math> de référence sera calculé à partir de la première fenêtre en estimant que le bruit de fond ne change pas et que personne ne parle. Ensuite on ne le recalcule plus.
                  Ensuite, au cours du temps, la fenêtre va bouger et à chaque mouvement, tu peux calculer l'énergie <math>\(E_1\)</math> et donc en déduire un niveau en décibel. Un niveau proche de 0dB correspond aucune parole. Et plus la valeur augmente, et plus il y a de parole.

                  Il reste une question en suspens : comment choisir le nombre de points <math>\(k\)</math>. Trop de points et on ne verra pas passer les phénomènes courts et trop petite, les mesures seront biaisés. Typiquement en audio processing, les fenêtres d'analyse sont communément entre 10 et 25ms. <math>\(k\)</math> peut se déduire comme ça : <math>\(k = T*f_e\)</math> où <math>\(f_e\)</math> est la fréquence d'échantillonnage du signal.

                  En espérant t'avoir aidé. Et je repose ma question : Pourquoi tu as besoin du volume ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 août 2011 à 10:26:09

                    Et bien je veux permettre aux utilisateurs de mettre une limite. En dessous de cette limite, les signaux ne sont pas pris en compte. ce qui permettra par la suite de détecter quand l'utilisateur commence et s’arrête de parler

                    Pour l'instant, j'affiche la valeur absolue du signal reçu et les utilisateurs peuvent déplacer une barre horizontale pour marquer la limite bruit-parole. Mais je ne suis pas trop convaincu par cette méthode d'un point de vue théorique (pas encore tester en pratique).

                    Si je ne suis pas convaincu par cette technique, c'est juste que je ne sais pas ce que signifie ce signal, et notamment pourquoi il a des valeurs positive puis négative. Donc je ne sais pas si prendre la valeur absolue est correct ou non. Si quelqu'un pouvait m’éclairer sur cette histoire de signal qui oscille entre valeur positive et négative se serait génial.

                    Et oui je souhaite le faire en temps réel.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 août 2011 à 12:25:11

                      Ok, on reprend du début.

                      Un son en physique correspond à la vibration d'un milieu. Un milieu est composé d'atomes agencés de différentes manières (air, bois, métal, papier). Quand un atome est frappé, il entre en vibration, c'est à dire qu'il bouge autour de sa position d'origine et comme il est lié aux autres atomes, cette vibration se transmet entre atomes voisins. C'est comme ça qu'un son se propage dans l'air ,à travers les murs,... La vitesse de vibration correspond à la fréquence du son (son grave = basse vibration, son aigu = haute vibration). Il y a aussi plein de fréquences qu'on ne peut pas entendre (typiquement au dessus de 20 kHz).

                      La technologie des micros utilise cette propriété de propagation. Ils ont une membrane qui capte la vibration de l'air pour la retranscrire la plus fidèlement possible en signal électrique. Et c'est pourquoi tu as un signal oscillant autour de la valeur zéro. La propagation du son correspond à d'infimes vibrations des atomes de notre environnement autour de leur position d'origine (= la valeur zéro).

                      Tu as bien vu que si tu prenais la valeur absolue, tu allais souvent retomber à zéro. Le calcul de l'énergie comme je l'ai décrit plus permet de s'affranchir de ce problème. Et cette approche est tout à fait justifiable. Tu peux calculer l'énergie ou le niveau en décibels et laisser l'utilisateur régler son niveau de détection via un slider. Le problème de détection automatisé étant un autre problème pas trivial.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 août 2011 à 12:37:24

                        En effet, si je prends la valeur absolue, je retombe souvent a zéro. Mais peu importe puisque ce qui est important pour moi, c'est de capter le début et la fin du moment où l'utilisateur parle.
                        C'est a dire le moment où l'amplitude du signal sera supérieur a la limite fixé par l'utilisateur (via la barre horizontal) pour la première (début de la parole) et dernière (fin de la parole) fois.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 août 2011 à 14:16:15

                          Ce que tu veux faire, c'est ça : http://en.wikipedia.org/wiki/Voice_activity_detection

                          Je peux te conseiller la lecture de cette article : Ramírez, J.; J. M. Górriz, J. C. Segura (2007). "Voice Activity Detection. Fundamentals and Speech Recognition System Robustness"

                          Je ne connais pas ton niveau en maths et en anglais, donc je sais pas si tu peux le lire. Mais tu peux voir page 8, figure 6 que l'objectif du papier est bien le même que toi. Il y a une courbe très intéressante page 12, la première. Il calcule le SNR ou Signal Noise Ratio, c'est à dire le rapport signal sur bruit et c'est exactement la puissance du son en décibel que j'ai défini dans mon premier message (<math>\(P_X = ...\)</math>). Tu peux remarque que l'axe temporel est noté en frame et non en secondes car comme je l'ai dit, une énergie se calcule sur un groupe de points (frame = fenêtre). Le threshold (=seuil) est fixé comme règle de décision. Au dessus du seuil, on détecte de la parole, en dessous non. Le résultat est affiché sur la figure du dessous.

                          Comme je l'ai dit, le choix du seuil de décision n'est pas du tout une question simple à résoudre. Dans ton cas, tu peux le fixer via l'interface utilisateur ce qui est un bon choix.

                          Pourquoi c'est mieux de passer par le calcul de l'énergie ou du RSB (Rapport Signal sur bruit) ? Difficile à expliquer dans un post comme ça, mais ça va apporter une certaine stabilité du fait de la taille de la fenêtre d'analyse. La parole n'est pas un signal à amplitude constante. Même dans un mot où on a l'impression de le dire d'une seule traite, il y a des stops, des silences infimes. Tu vas avoir pour effet de couper la parole en plein de morceaux si tu restes sur le signal original (même en valeur absolue). Le calcul de l'énergie sur une fenêtre a pour effet de "lisser" cet effet, car on prend en compte un voisinage autour de chaque point.

                          Quoi qu'il en soit, je ne peux t'en dire plus sans connaitre les objectifs de ton logiciel. Pourquoi détecter la voix ? Est ce que tu as besoin du signal en aval pour le traiter ? Ou simplement pour situer vaguement où sont les zones d'intêret ? ... ?

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Deduire le volume sonore a partir d'une onde

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown