Traitements audionumériques

 

    1. l’audionumérique : présentation générale

      1. Les données

        1. généralités

          Les données à traiter sont relativement simples. Il s’agit de suites d’entiers (ou de réels suivant les cas) échantillonnés à fréquence fixe. Ils représentent les ondes sonores qui sont transmises de façon électrique aux oreilles des auditeurs.

          Malgré sa structure simple, le son est un type de données assez exigeant : il ne doit y avoir aucune perte d’échantillons, sous peine d’entendre des " plops " très désagréables voire destructeurs pour le matériel de restitution (hauts parleurs, amplificateurs). Toute discontinuité ou perte de données ne peut être tolérée, contrairement à l’image.

        2. propriétés

          1. contenu

            La suite de nombres qu’est le flux audio ne contient que des composantes dont la fréquence est inférieure à la fréquence de Nyquist (moitié de la fréquence d’échantillonnage), conformément au théorème de Shannon. Ceci a de nombreuses conséquences sur les traitements que l’on peut appliquer au son échantillonné, et constitue la principale différence avec le son analogique qui peut contenir toutes les fréquences appartenant à .

          2. phénomène d’ "aliasing "

        Egalement appelé en français repliement de spectre, ce phénomène consiste en l’apparition de fréquences non contenues dans le signal d’origine lorsqu’on échantillonne un signal contenant des fréquences supérieures à la fréquence de Nyquist : si f est une fréquence contenue dans le signal d’origine supérieure à la fréquence de Nyquist, après échantillonnage il apparaît dans le spectre une nouvelle fréquence f’, inférieure à la fréquence de Nyquist, fonction de f.

        Ce phénomène apparaît à chaque rééchantillonnage du signal, ou lors de tout traitement temporel. Pour l’éviter, il faut filtrer le signal et éliminer toutes les composantes de fréquence supérieures à la nouvelle fréquence de Nyquist.

      2. Les traitements et les outils mathématiques

        Tous les outils de traitement du signal sont utiles pour modifier ces données : transformée en z, transformée de Fourier, filtres divers, transformée en ondelettes, rétroaction.

        On a également recours à des techniques d’électronique bien utiles ( le traitement audio était au départ effectué à l’aide de circuits électroniques) : schémas-blocs, schémas électroniques (pour la conversion de circuits en filtres numériques)... Toutes ces techniques sont développées et expliquées au paragraphe suivant.

      3. Notations et conventions

        Les notations ne sont pas vraiment normalisées, mais j’utiliserai celles que j’ai retrouvées le plus souvent dans la littérature, à savoir :

         : transformée en z de la suite

         : transformée de Laplace de la fonction

        : transformée de Fourier de la fonction

         : fréquence d’échantillonnage (" sampling rate ")

         : fréquence de Nyquist

         : fréquence d’un signal normalisée () on travaille plutôt avec cette variable qu’avec la fréquence.

      4. Propriétés générales des outils classiques

        1. transformée en z

          1. définition

            C’est l’outil de base du traitement audionumérique. Elle permet de manipuler des suites de nombres échantillonnés à fréquence constante très facilement. C’est l’équivalent de la transformée de Laplace pour les suites. Elle est définie ainsi :

          2. produit de convolution

            Le produit de convolution entre deux suites est équivalent au produit entre les transformées en z des deux suites :

            Si l’on définit par U et V les transformées respectives de u et v, on a ainsi :

          3. remarques

          En ce qui nous concerne (pour le son), k représente le numéro de l’échantillon (i.e. sa date). Par conséquent, puisque les traitements sont censés être en temps réel, nous ne travaillerons qu’avec un système causal, c’est à dire avec k>0.

          Une propriété intéressante de la transformée en z, c’est que si l’on se place sur le cercle unité (i.e., dans R) on retrouve la transformée de Fourier discrète du signal. Ceci permet de passer facilement de la représentation théorique spécifiquement numérique à une représentation plus classique et intuitive. On peut ainsi calculer la réponse fréquentielle d’un filtre directement à partir de ses coefficients (voir partie sur les filtres pour plus de détails). De manière générale la similitude entre transformée en z et transformée de Laplace est très intéressante et son exploitation conduit à des simplifications étonnantes.

          On remarque de plus que la multiplication par z-k correspond simplement à un retard de k échantillons, ce qui fait qu’il est extrêmement simple de passer de la transformée en z à l’implémentation. Ainsi on a un outil très simple et intuitif pour manipuler nos échantillons, et le passage de la théorie à l’implémentation ne nécessite aucun effort supplémentaire.

          Dans la plupart des cas on se ramènera à des suites comportant un nombre fini de termes, ce qui simplifie énormément les calculs.

        2. transformation bilinéaire

          1. définition

            La transformée bilinéaire est définie par la formule suivante (s et z sont des nombres complexes, et T est la fréquence d’échantillonnage) :

            ,

          2. utilisation

            Cette transformation permet d’effectuer un mapping de l’axe des imaginaires purs du plan complexe sur le cercle unité. Concrètement cela sert à passer des filtres analogiques dont la fonction de transfert est une transformée de Laplace aux filtres numériques.

          3. propriétés

          D’après la formule donnée en (1), en remplaçant z par (on se place sur le cercle unité, représentant la fréquence normalisée), on obtient après simplification :

          ,

          ou

          Le domaine de fréquence " analogique " compris entre 0 et l’infini est se trouve donc maintenant dans . C’est la propriété de " frequency warping " de la transformée bilinéaire.

        3. schémas blocs

          Ces schémas sont très utiles pour dessiner et concevoir des filtres. Ils permettent de visualiser les traitements de façon globale, comme des schémas de circuits électriques. Voici un exemple de schéma bloc :

        4. transformée de Fourier- FFT

          On utilise en général la transformée de Fourier discrète (DFT) pour les calculs et s’il est nécessaire de l’implémenter, c’est à un algorithme de transformée de Fourier rapide (FFT) que l’on fait appel. La DFT n’est que la version discrète de la transformée de Fourier continue :

          ,

          où T représente la période d’échantillonnage et x[n] représente x(nT), valeur du signal à t=nT. W est la fonction de fenêtrage. On multiplie le signal par cette fonction car tronquer le signal (on ne s’occupe que de N échantillons au lieu d’une infinité) provoque des déformations spectrales. Il existe de nombreuses fonctions de fenêtrage, les plus connues étant celles de Blackmann Harris, Gauss, Hanning.

        5. transformée en ondelettes

      Cette transformée est très intéressante en traitement du signal temps réel puisqu’elle permet d’avoir une résolution temps-fréquence bien meilleure que la FFT. De plus l’algorithme rapide (FWT), qui consiste en une succession de filtres et de décimations, est plus rapide et permet d’avoir une échelle en fréquence non linéaire (logarithmique pour la transformée la plus classique, ce qui nous intéresse le plus pour le son puisque notre oreille fonctionne de façon logarithmique).

    2. Théorie des filtres numériques

      1. Réponse impulsionnelle

        La réponse impulsionnelle d’un filtre est la suite des valeur de sortie du filtre lorsqu’on lui applique en entrée une impulsion. Elle est caractérisée par sa durée (nombre d’échantillons non nuls) et sa forme.

        En général on note la réponse impulsionnelle d’un filtre h.

      2. Fonction de transfert

        La fonction de transfert d’un filtre numérique est une fonction d’une variable complexe. On se contentera de développer ici les filtres linéaires dont la fonction de transfert est une fraction rationnelle de z. On peut monter que la fonction de transfert n’est rien d’autre que la transformée en z de la réponse impulsionnelle.

        Nous nous limiterons dans notre étude aux filtres implémentables et utilisables pour du temps réel, c’est à dire aux filtres causaux (pour k>0) et dont le nombre de coefficients est fini. La fonction de transfert sera donc sous la forme :

        D’après les propriétés de la transformée en z, si l’on remplace z par , on obtient la fonction de transfert fréquentielle du filtre. En séparant module et argument de on peut ainsi obtenir un diagramme de Bode complet.

      3. Application d’un filtre

        Appliquer un filtre à une suite de nombre, c’est simplement effectuer la convolution de la suite avec sa réponse impulsionnelle ou effectuer la multiplication de la transformée en z de la suite par la fonction de transfert du filtre :

        Remarque : k commence à 0 car nous ne nous occupons que de filtres causals, i.e h[k]=0 pour k<0.

      4. Les différents types de filtres linéaires

        1. les FIR

          les FIR sont des filtres à réponse impulsionnelle finie. C’est à dire que l’application d’une impulsion à leur entrée n’aboutit qu’à un nombre fini d’échantillons non nuls en sortie. Concrètement cela veut dire qu’ils ont une réponse finie du point de vue temporel. Ils sont caractérisés par leur ordre n.

          1. fonction de transfert

            Si l’on désigne par (an) la suite des échantillons de la réponse impulsionnelle du filtre, sa fonction de transfert peut s’exprimer de la façon suivante :

          2. schéma bloc

            c’est un simple montage en parallèle de retards et de multiplication par des coefficients :

          3. implémentation

          si l’entrée est une suite de nombres input[i], et la sortie output[i], pour tout i on a :

        2. les IIR " purs "

          Les IIR filtres dont la réponse impulsionnelle n’est pas finie. Dans ce cas l’implémentation précédente est impossible pratiquement (bien sûr, en théorie n peut tendre vers l’infini, mais cela n’est pas implémentable...).

          1. Fonction de transfert

            Si l’on connaît la réponse impulsionnelle du filtre on peut calculer sa fonction de transfert à l’aide des séries entières. De manière générale, les filtres implémentables simplement ont une fonction de transfert de type fonction rationnelle, et celle d’un IIR " pur " est du type :

          2. schéma bloc

            On est donc en présence d’un circuit toujours relativement simple, avec n boucles de rétroaction faisant intervenir chacune un retard et une multiplication par un coefficient. En pratique on prend b0=1 pour supprimer la boucle d’ordre 0 qui ne sert à rien. Pour cela il suffit de diviser tous les coefficients par b0.

          3. implémentation

            si l’entrée est une suite de nombres input[i], et la sortie output[i], pour tout i

          4. remarque

          Les IIR d’ordre supérieur à deux sont souvent instables, si bien que l’on préfère souvent utiliser plusieurs filtres d’ordre 2 en série pour fabriquer un filtre d’ordre supérieur.

        3. forme générale

          1. obtention de la fonction de transfert

            Si l’on place en série un IIR pur et un FIR on obtient un IIR dont la fonction de transfert est la forme générale donnée précédemment qui n’est rien d’autre que le produit des deux fonctions de transfert :

          2. implémentation

        si l’entrée est une suite de nombres input[i], et la sortie output[i], pour tout i

      5. Elaboration de filtres linéaires

        1. à partir des pôles et zéros

          1. définitions

            On appelle pôle de H(z) toute racine de son dénominateur, et zéro de H(z) toute racine de son numérateur.

          2. propriétés

            Pour obtenir une fonction de transfert réelle, il suffit que les racines complexes soient conjuguées.

            Si les pôles sont à l’extérieur du cercle unité, la fonction de transfert devient instable.

            Plus un pôle ou un zéro est proche du cercle unité, plus son influence est grande sur la fonction de transfert.

          3. conception de filtres

          En plaçant les pôles et les zéros dans le plan complexe, on peut ainsi dessiner une fonction de transfert relativement facilement. Il suffit de représenter chaque pôle et zéro sous la forme R, et on a ainsi des atténuations ou amplifications du signal pour la fréquence normalisée, dont l’influence est donnée par la proximité de R à l’unité.

          C’est une méthode assez efficace que j’ai implémentée dans un module. Il ne reste qu’à concevoir une interface graphique simple pour permettre l’utilisation aisée de ce genre de filtre

        2. à partir de filtres analogiques existants

          Pour concevoir des filtres numériques à partir de filtres analogiques, on utilise la transformée bilinéaire pour passer de la fonction de transfert " analogique " (transformée de Fourier continue de la réponse impulsionnelle) à la fonction de transfert " numérique " (transformée en z). On obtient ainsi un filtre de mêmes caractéristiques, mais dont la réponse fréquentielle est plaquée sur l’intervalle .

        3. en échantillonnant une fonction de transfert

          1. présentation

            Une méthode intéressante pour concevoir des FIR est l’utilisation d’une fonction de transfert échantillonnée que l’on transforme en réponse impulsionnelle par DFT inverse. Il suffit ensuite d’effectuer la convolution du signal avec cette fonction de transfert pour réaliser le filtrage.

            L’intérêt de cette méthode est que l’on peut dessiner à la main une réponse fréquentielle, et obtenir le filtrage voulu en ne prenant qu’un certain nombre de points. On n’a pas besoin de connaître la fonction analytique correspondant à la fonction de transfert.

          2. implémentation

            la fonction de transfert échantillonnée a pour coefficients H[n], et la réponse impulsionnelle correspondante h[n]. La réponse impulsionnelle est d’ordre N.

            1. Filtre à déphasage linéaire

              Pour éviter la déformation d’un signal au travers d’un filtre, le déphasage qu’il produit doit être une fonction linéaire de la fréquence :

              On démontre que pour cela la réponse fréquentielle soit symétrique par rapport à la fréquence de Nyquist, i.e.

              , et pour N pair.

            2. calcul des coefficients

            les H[n] sont donnés par échantillonnage de la fonction de transfert et symétrisation:

            , pour n< N/2.

            Les coefficients du filtre h[n] sont calculés par transformée de Fourrier inverse limitée à sa partie réelle (transformée en cosinus) :

            , où W est la fonction de fenêtrage

          3. inconvénients

      Le majeur inconvénient de cette méthode est le coût de calcul dès que l’on utilise beaucoup de points, ce qui est nécessaire lorsque la fonction de transfert est complexe. De plus les effets du fenêtrage sont parfois gênants.

    3. Bibliothèque d’effets

      Quelques exemples d’effets audio classiques.

      1. Delays

        C’est un effet très simple qui correspond à un écho. C’est l’effet de base pour construire des réverbérations et également des filtres, si le temps de retard est suffisamment faible. Il existe sous plusieurs formes :

        1. FIR

          1. schéma

            Pour produire un écho, on utilise un FIR très simple dont le schéma est le suivant :

          2. fonction de transfert

          La fonction de transfert de cet FIR est

          Où dry est la proportion de signal " brut " et wet celle du signal retardé. L’implémentation est donc très simple. A l’effet d’echo s’ajoute un effet de filtre dont la réponse fréquentielle est donnée par :

          qui donne, si wet=dry

          C’est ce que l’on appelle un filtre en peigne.

        2. IIR

          1. schéma

            Pour produire un écho " long " récursif, on emploie un IIR :

          2. fonction de transfert

        La fonction de transfert est proche de l’inverse de la précédente.

        L’espacement entre deux échos successifs est réglé par delayTimeInSamples et la durée totale de l’effet dépend de la valeur du multiplicateur de rétroaction " resonance ".

        L’echo ainsi produit a également une réponse fréquentielle " en peigne ", mais inversée par rapport à celle du FIR :

      2. Chorus

        1. description

          L’effet de chorus, comme son nom l’indique est censé simuler un effet de choeur. Lorsqu’un instrument est traité par cet effet, on a l’impression que plusieurs instruments identiques jouent en même temps

        2. principe

        Pour réaliser cet effet, on applique au signal un délai variable (FIR), modulé par un LFO, et l’on mixe le signal retardé avec l’original :

        Pour simuler plusieurs voix, il suffit d’employer plusieurs lignes à retard avec des LFOs de phases et/ou fréquences différentes.

        Généralement, pour un effet intéressant le temps de retard varie entre 20 et 30 ms, à la limite du temps d’intégration de l’oreille.

      3. Flanger

        1. description

          L’effet de Flanger est similaire à celui du Chorus en principe, mais le résultat à l’oreille est radicalement différent. C’est difficilement descriptible sur papier, mais généralement on le décrit comme un bruit de réacteur d’avion.

        2. principe

        De même que pour le Chorus on applique au signal un délai variable, modulé par un LFO, et l’on mixe le signal retardé avec l’original. Mais ici le temps de retard varie entre 1 et 20 ms, en dessous du temps d’intégration de l’oreille. Ainsi l’effet dominant à l’oreille n’est plus celui d’écho, mais de filtre en peigne dont l’espacement des dents varie avec le temps. C’est ce déplacement qui produit l’effet de réacteur.

        Bien souvent on rajoute à cela une rétroaction (IIR), ce qui accentue l’effet.

      4. Filtres " biquad "

        J’ai déjà décrit dans la partie Théorie des Filtres les méthodes permettant de créer un filtre à partir de ses caractéristiques. Ici je vais expliquer l’élaboration de certains filtres très utiles comme les passe bande, coupe bande, passe haut, passe bas qui sont utilisés en tant que tels ou combinés (pour réaliser un égaliseur par exemple). Tous les filtres développés ici sont des IIR d’ordre deux, que l’ont appelle communément " biquad filters ". Leur fonction de transfert est de la forme :

        1. topologie de Regalia & Mitra : filtres passe bande

          Une méthode originale pour concevoir des filtres passe/coupe - bande est d’utiliser un filtre déphaseur dit " passe tout " (" all pass filter ") pour déphaser le signal et d’ajouter ensuite le signal non déphasé, ce qui permet de modifier l’amplitude de certaines fréquences (si l’on déphase une composant fréquentielle de 180° elle se trouve ainsi annulée).

        2. autres filtres

On peut réaliser d’autres filtres à partir de leur fonction de transfert " analogique ", par transformation bilinéaire : filtre passe bas, passe haut, coupe bas, coupe haut etc... Tous sont des filtres analogiques d’ordre 2 et peuvent donc se mettre sous la forme de " biquad Filters ".

  1. Bibliographie sommaire, sources

    La bibliographie présentée ici est assez sommaire. Pour plus de détails, ne pas hésiter à me contacter. Un site Web devrait également être réalisé bientôt. Je suis prêt à communiquer mon " bookmark " internet à ceux qui seraient intéressées.

    1. domaine de l’informatique musicale

    1. traitement du signal, audionumérique

      1. Pour s’initier au traitement du signal

      1. ouvrages plus avancés