L'analyse spectrale

Qu'est-ce que l'analyse spectrale

La notion de spectre d'un signal

Nous avons déjà rencontré cette notion de spectre, mais revenons un peu longuement sur ce sujet. Dans la page qui lui est consacrée, nous avons découvert que l'analyse de Fourier permettait d'approximer n'importe quelle fonction en une somme de sinus ou de cosinus affectés de coefficients adéquates. La fréquence de chacune de ces fonctions trigonométriques élémentaires correspond à une composante fréquentielle de la fonction approximée. Cette composante est plus ou moins importante selon le coefficient affecté à la fonction élementaire.
Tracer le spectre d'une fonction, en faire son analyse spectrale, c'est donc identifier chacune de ses composantes fréquentielles et leur importance respective. Ce que j'appelle "importance" correspond en fait à la quantité d'énergie (ou de puissance) que chaque composante fréquentielle transporte.

Dans cette page, nous allons tracer le spectre de différents signaux, calculés ou réels. Nous pourrons ainsi observer la décomposition spectrale d'un signal mais aussi les effets, quelques fois nuisibles, de l'échantillonnage et des algorithmes de calcul du spectre. Commençons par le commencement, c'est à dire l'échantillonnage du signal analogique.

L'échantillonnage d'un signal

L'échantillonnage d'un signal réel

Du point de vue mathématique, un signal réel, un son par exemple, est une fonction continue du temps. Dans la plupart des cas, et je ne connais pas d'exception, c'est aussi une fonction bornée dans le temps: un signal possède un début et une fin. Pour pouvoir faire du calcul sur ce signal, autres que des calculs analytiques presque toujours impossibles, il faut transformer cette fonction continue en une série de points, qui représentera le plus fidèlement possible la fonction continue. Cette série sera bornée par le début et la fin du signal, et comprendra un nombre arbitraire de points. Cette transformation s'appelle l'échantillonnage. On pourrait aussi l'appeler "discrétisation", car il s'agit de transformer une fonction continue en fonction discrète, en s'assurant de ne perdre que le minimum d'information et de "coller" au plus près de la fonction continue.

Tous les problèmes rencontrés lorsqu'on échantillonne un signal se trouvent dans la définition donnée ci-dessus. Le premier consistant à ne pas perdre ou du moins à perdre un minimum d'information en échantillonnant. Pour cela, Shannon et Nyquist nous ont donné un théorème que nous verrons plus loin. Encore faut-il savoir déterminer la fréquence maximale du signal à échantillonner. Cela peut sembler trivial, mais votre signal, disons audio dont les fréquences utiles sont comprises entre 20 et 20 000 Hz, peut contenir des hautes fréquences parasites, qui perturberont le calcul du spectre.
Un signal mesuré et échantillonné est toujours borné dans le temps, alors que l'analyse de Fourier considère des signaux infiniment longs. Nous verrons que cela pose problème dans l'obtention d'un spectre représentatif.
Enfin, s'il vous arrivait l'envie de calculer le spectre d'un signal en temps réel, vous allez rapidement tomber sur un os: pour calculer le spectre d'un signal s avec une transformée de Fourier, il faut connaitre, par définition, les valeurs de s(t) pour toutes les valeurs de t, ce qui pose un léger problème pour un calcul en temps réel...
Nous verrons dans la suite comment remédier à ces obstacles.

L'échantillonnage d'un signal calculé

Le cas d'un signal calculé est beaucoup plus simple car il est discret et borné par construction. Il restera juste à déterminer sa durée par rapport à sa période pour ne pas avoir de soucis, sachant que la durée doit être grande par rapport à la période.

La limitation de la durée du signal nous permettra de constater son effet sur le spectre. Nous verrons en effet que les raies, que l'on pourrait attendre très fines, et même de largeur nulle car le signal est périodique, s'élargissent à leur base.
Nous verrons aussi que la durée de l'échantillon, qui détermine la résolution fréquentielle (c'est son inverse), influe sur la précision des hauteurs de raie, ce qui peut provoquer des erreurs de hauteurs relatives des raies.

Les conséquences de l'échantillonnage sur le calcul du spectre
Le théorème de Shannon et la fréquence d'échantillonnage

A quelle fréquence faut-il échantillonner ? La réponse à cette question, plus complexe qu'il n'y parait, est donnée par le théorème de Shannon-Nyquist, qui stipule que la fréquence d'échantillonnage doit être au moins deux fois supérieure à la fréquence maximale de son spectre. On appelle cette condition la condition de Shannon-Nyquist.
C'est la raison pour laquelle la fréquence d'échantillonnage du signal audio pour graver un CD est de 44 kHz, la fréquence maximale perceptible par l'oreille humaine étant de 20 kHz.

Voyons les conséquences pratiques de cette condition sur nos expériences. Imaginons que nous voulions échantillonner un signal de fréquence f, pour le stocker dans un vecteur à fin de traitement.
La condition de Shannon-Nyquist nous dit que sa fréquence d'échantillonnage \( f_e \) doit être supérieure à 2*f. Nous la prendrons 10 fois supérieure par prudence.
Supposons que notre signal a une durée de S secondes. Quelle devra être la taille de notre buffer d'échantillonnage, ou dit autrement, combien de points de mesures, N, nous seront nécessaires ?
La réponse est simple : \( N = \dfrac{S}{10 f_e} \), ce que nous retiendrons dans nos programmes.

Le recouvrement du spectre

Ceci serait parfait si nous étions sûr que notre signal ne contienne pas de fréquences supérieures à la fréquence maximale choisie. Or cette éventualité est très courante, le signal étant souvent entaché de bruits hautes fréquences. Le spectre calculé devient faux : on assiste à ce que l'on appelle un "recouvrement de spectre", comme si nous avions choisi une fréquence d'échantillonnage non conforme au critère de Shannon-Nyquist (ce qui est le cas d'ailleurs...).
Heureusement, il existe un remède efficace et bien connu : il suffit de filtrer le signal avant échantillonnage, avec un filtre passe-bas, qui coupera toutes les fréquences supérieures à une fréquence correctement choisie, par exemple 44 kHz dans le cas d'un signal audio à échantillonner.
Nous verrons plus loin un exemple de spectre victime d'un recouvrement.

La durée du signal échantillonné et le fenêtrage

Nous avons parlé de l'influence de la durée finie du signal sur le calcul du spectre et la largeur des raies. Il existe un moyen de réduire cet inconvénient, il s'agit du fenêtrage.
Imaginez une fenêtre à travers laquelle vous liriez le signal à échantillonner. Traiter un signal de durée finie tel que nous le faisons dans la suite revient à "lire" ce signal à travers une fenêtre rectangulaire, qui tronquerait brutalement ce signal au début et à fin de la fenêtre. Nous transformons notre signal en un signal périodique, dont la période est égale à la largeur de la fenêtre, c'est à dire en fait à la durée de l'échantillon, ce qui ne correspond évidemment pas à la réalité et donne donc un spectre qui n'y correspond pas non plus...
Alors, les ingénieurs ont cherché des formes de fénêtres un peu moins agressives. Nous verrons plus loin l'effet de l'application d'une fenêtre, la fenêtre de Hann pour l'exemple, sur le spectre d'un signal borné. Il existe bien sur d'autres formes de fenêtres que nous n'aborderons pas ici.

Le spectre de quelques signaux types

Le programme utilisé

Dans ce chapitre, j'utiliserai le script Python AnalSpectrale01.py, que j'adapterai en fonction des besoins. Ces adaptations se réduiront la plupart du temps à définir le signal à étudier dans une fonction particulière et à initialiser le vecteur signal avec cette fonction.
Les fonctions de calcul du spectre et de tracés du signal et du spectre seront inchangées, mais une adaptation des bornes d'affichage sera parfois nécessaire.

Spectre d'un signal "monofréquence" sinusoïdal

Le signal

Considérons un signal simple monofréquence \( f(t) = A_0\sin(\omega_0 t) \), de fréquence f0 = 5 Hz et d'amplitude 5 unités.
Notre signal contient donc par construction une seule composante fréquentielle de \( f_0 = \dfrac{\omega_0}{2 \pi} \), que nous devrions retrouver sur le spectre de f(t) avec le poids \(A_0\).

Son spectre

Le signal et son spectre se présentent ainsi:

Spectre01-1

Le tracé du signal est sans surprise, il s'agit d'une sinusoïde pure ! On sait au moins que notre script fonctionne ....
Voyons maintenant son spectre. Là aussi pas de surprise, on observe un seul pic pour la fréquence de 5 Hz, les composantes pour les autres fréquences étant nulles. Mais remarquez que notre raie est plutôt large, c'est à dire que le spectre laisse à penser que le signal ne contient pas qu'une seule fréquence, ce qui est bien sur faux. C'est la conséquence de la durée finie de l'échantillon que nous avons évoqué plus haut.

Spectre d'un signal composite sinusoïdal

Le signal

Considérons un signal composé par la somme de deux sinusoïdes \( f(t) = A_0\sin(\omega_0 t) + A_1\sin(\omega_1 t) \). Nous choisirons les fréquences des deux composantes suffisamment différentes pour les distinguer, par exemple 5 et 20 Hz. De même,les coefficients seront égaux à 5 et 1 respectivement.
Notre signal contient donc par construction deux composantes fréquentielles de \( f_0 = \dfrac{\omega_0}{2\pi} \) et \( f_1 = \dfrac{\omega_1}{2*\pi} \), que nous devrions retrouver sur le spectre du signal avec les poids respectifs \(A_0\) et \(A_1\).

Son spectre

Le signal et son spectre se présentent ainsi:

Spectre02-1

Le tracé du signal est sans surprise, il s'agit d'une somme de deux sinusoïdes !
Sur son spectre, nous observons maintenant deux pics: l'un pour 5 Hz avec la hauteur la plus importante et un autre à 20 Hz, avec une hauteur 5 fois moindre. Ces résultats correspondent aux données d'entrée : respectivement 5 et 20 Hz pour une amplitude respective de 5 et 1. Les composantes pour les autres fréquences étant nulles.
Ainsi, l'analyse spectrale montre bien la décomposition fréquentielle que nous avons adoptée dans la définition de notre signal.

Spectre d'un signal carré

Le signal

Plutôt que de programmer une fonction spécifique pour générer un signal carré, je vais utiliser une fonction existante dans le package scipy.signal. Cette fonction est la fonction square, qui génére un signal compris entre -1 et 1, avec une période de \(2\pi\). J'ai construit un signal de fréquence f0 à partir de cette fonction.
Dans l'exemple ci-dessous, le rapport cyclique, fixé par le paramètre duty de la fonction, est égal à 0.5 (valeur par défaut) et la fréquence f0 est égale à 2.0 Hz.
Attention, pour visualiser une étendue suffisante du spectre, la largeur d'affichage de la fréquence, définie par la variable Fmax dans le script doit être assez grande. Dans l'exemple ci-dessous, je l'ai réglé à 50*f0, ici donc 100 Hz.

Son spectre

Le signal et son spectre se présentent ainsi:

Spectre03-1

Le tracé du signal nous montre un beau signal carré (ou plutôt rectangulaire), qui correspond aux critères de fréquence et d'amplitude attendus.

Son spectre lui est très intéressant. Il montre une multitude de raies (en fait, une infinité) dont l'amplitude décroit très vite. La raie d'amplitude la plus grande est observée à la fréquence de 2 Hz, puis la suivante par ordre décroissant d'amplitude à 6 Hz, puis à 10 Hz, 14 Hz, 18 Hz, etc. L'amplitude de chaque raie diminue lorsque la fréquence croît. Pour visualiser ces fréquences, faites varier le paramètre Fmax .
Cela ne vous rappelle-t-il rien ? Nous avons étudié dans la page consacrée à l'analyse de Fourier, comment construire un signal carré avec une somme de sinusoïdes, chaque sinusoïde possédant une fréquence et une amplitude spécifiques, définies par les coefficients de Fourier. Et bien, vous retrouvez sur ce spectre les fréquences et amplitudes correspondantes à chacun de ces coefficients ! Pour vous en convaincre, faites donc le calcul sur les 2 ou 3 premiers ou, plus futé, faites le calcul avec Maple, cela sera un bon exercice...

Spectre d'une impulsion

Le signal

Construisons une impulsion d'amplitude A0 = 1 et de durée 500 millisecondes, puis traçons son spectre. La fonction Impulsion du script fait ça pour nous. Voyons ce que cela donne.

Son spectre

Le signal et son spectre se présentent ainsi:

Spectre04-1

Sur le tracé du signal, nous obtenons bien l'impulsion attendue. Son spectre présente aussi la forme attendue, celle d'une courbe que l'on appelle un sinus cardinal définie par \( \sin(x)/x \). Sur le tracé ci-dessus, j'ai utilisé une zone d'affichage de 0 à 50 Hz, pour apprécier la forme générale de la courbe. Pour en saisir les détails, je suis revenu à une zone de 10 Hz, ce que je vous encourage à faire dans votre script.
Notez une chose importante : nous n'avons pas ici un spectre de raies comme pour les signaux précédents, mais un spectre de bandes. La courbe que vous observez est la courbe enveloppe de l'infinité de raies qui constituent le spectre d'une impulsion unique, qui par définition n'est pas une fonction périodique.

Sur un spectre plus détaillé, on remarque que la courbe s'annule pour les fréquences 2 Hz, 4 Hz, 8 Hz et 10 Hz. Si vous changez la largeur de l'impulsion, vous remarquerez que ces valeurs varient.
Un peu de réflexion, mais bien sur cela se démontre, vous permettra de constater que la courbe s'annule pour toutes les valeurs de fréquence égales à k/largeur. Ici, largeur = 0.5 et donc notre courbe s'annule pour 2, 4, 8, 10 Hz.

Spectre d'un signal bruité en amplitude

Le signal

Imaginons un signal sinusoïdal pur, de fréquence f0 = 10 Hz et d'amplitude A0 = 1. Imaginons aussi que ce signal soit perturbé, bruité, par un signal bien connu, le "courant secteur", qui comme chacun le sait présente une fréquence fb = 50 Hz et d'une amplitude maxima Ab = 0.5 (pourquoi pas?). On va considérer que ce bruitage est aléatoire, par exemple provoqué par un faux contact.
La fonction BruitageAmplitude du script nous génère un tel signal.

Son spectre

Le tracé nous montre un signal assez complexe, d'amplitude variable, dont il est difficile de distinguer les composantes. Par contre, le spectre est beaucoup plus explicite:

Spectre05-1

On observe sur ce spectre deux raies attendues : une raie à 10 Hz, qui correspond au signal pur et une raie à 50 Hz du bruit. Pensez à modifier la valeur de Fmax dans le script pour bien visualiser les deux raies (la fixer à 60 Hz par exemple).
Vous noterez également les hauteurs relatives des raies, la hauteur de la raie de bruit étant aléatoire.

Spectre d'un signal bruité en fréquence

Le signal

Imaginons un signal sinusoïdal pur, de fréquence f0 = 10 Hz et d'amplitude A0 = 1. Imaginons aussi que ce signal soit bruité par un signal dont la fréquence varie aléatoirement.
La fonction BruitageFrequence du script nous génère un tel signal.

Son spectre

Vous constatez maintenant qu'on observe bien la raie de 10 Hz, mais que le reste du spectre se réduit à un bruissement de fréquences, d'amplitude variable, ce qui traduit l'aspect aléatoire du bruitage en fréquence. Aucune raie de fréquence ne se détache particulièrement, si ce n'est bien sur le signal fondamental.

Spectre06-1

Spectres d'un signal réel

Le La d'un piano
Le signal

J'ai enregistré dans un fichier audio au format .wav avec le logiciel Audacity, le La3 d'un piano droit, dont la fréquence est de 440 Hz, s'il est bien accordé. La fréquence d'échantillonnage est de 8 kHz. Je vous propose d'en tracer le spectre et de vérifier la structure du son qu'il produit.

Son spectre

J'ai tracé deux spectres afin de mieux distinguer les différents points que je veux accentuer. D'abord le spectre du signal, en prenant une échelle de entre 400 et 500 Hz :

SpectreLaPiano400Hz

Sur ce tracé, on distingue très nettement un pic à 437 Hz et un autre, moins important à 440 Hz (vous pouvez affiner la courbe en faisant varier les variables Fmin et Fmax). Conclusion immédiate : notre piano n'est pas très bien accordé ! Autre conclusion : on ne voit pas une raie unique mais un ensemble assez fluctuant autour de 440 Hz.

Traçons maintenant le même spectre entre 0 et 3000 Hz :

SpectreLaPiano3000Hz

Nous constatons que notre son n'est pas pur ! On retrouve bien la raie de la fondamentale vers 440 Hz mais aussi une raie moins importante vers 880 Hz. Si vous faites un zoom sur cette raie en modifiant Fmin et Fmax, vous apercevrez une double raie centrée sur 874 et 878 Hz. On aperçoit aussi une raie vers 1330 Hz (là aussi une double raie) puis une autre minuscule vers 1760 Hz, et encore une autre encore plus minuscule vers 2210 Hz.

Vous l'aurez deviné, il s'agit d'harmoniques de la fondamentale de 440 Hz : 880 Hz, 1320 Hz, 1760 Hz. En y regardant de plus près, vous aurez noté qu'il ne s'agit pas de raies pures mais d'une somme de raies assez complexes. C'est ce qui fait la richesse du son produit par un piano, richesse que l'électronique a du mal à reproduire.

En fait, il y a plusieurs raisons au fait que nous n'obtenions pas une seule raie, un son pur:

Le La d'un violoncelle
Le signal

Le violoncelle est un instrument à cordes merveilleux, qu'on dit le plus proche de la voix humaine. En fait, il émet entre 65 Hz et 1000 Hz environ. La corde de La du violoncelle (la corde A3) vibre en principe, lorsqu'elle est bien accordée, à 220 Hz (soit le La2 du piano).
Disposant d'une adorable violoncelliste et de son violoncelle, que j'espère correctement accordé à l'accordeur électronique (bouhh...), j'ai donc enregistré, avec le concours de ladite, le La du violoncelle dans un fichier audio dans les mêmes conditions que précédemment. Et je vous propose d'en tracer le spectre.

Son spectre

Pour avoir une idée de l'étendue du spectre du La, traçons le entre 0 et 3000 Hz, afin de situer les principales harmoniques :

SpectreLaVioloncelle3000Hz

Première remarque qui saute aux yeux, c'est que le spectre du violoncelle est plus riche en harmoniques que celui du piano ! Il faut se rappeler que le piano est un instrument à cordes frappées, contrairement au violoncelle qui est un instrument à cordes frottées. J'ai remarqué en manipant avec mon adorable violoncelliste que le spectre variait selon la manière dont elle "tirait" son La. Cela explique peut-être en partie la différence d'interprétation entre un Rostropovitch, qui sait tirer la quintessence de son instrument et un violoncelliste "normale".

Deuxième remarque, c'est que nous trouvons bien les raies que nous attendions, vers 220 Hz, 440 Hz, 660 hz avec une décroissance attendue de leur amplitude, mais aussi des raies d'amplitude relativement importantes vers 2000 Hz.

J'ai donc relevé plus précisément les harmoniques en faisant des zooms sur les valeurs de fréquence attendues. Et j'ai bien trouvé la fondamentale à 220,1 Hz (bravo pour l'accordage), la 1ere harmonique à 440 Hz (avec une double raie entre 440 et 441 Hz, double raie que l'on retrouve sur toutes les harmoniques), la 2eme à 660 Hz, la 3eme à 880 Hz, la 4eme à 1100 Hz, la 5eme à 1320 hz avec une amplitude curieusement plus élevée que la 4eme, la 6eme à 1540 Hz, la 7eme à 1760 Hz et la 8eme à 1980 Hz. Cette dernière avec une amplitude plus importante que les deux précédentes.
Ci-dessous, le spectre autour de la fondamentale, où l'on constate la précision de l'accord :

SpectreLaVioloncelle220Hz
Le La d'un hautbois
Le signal

Et enfin, parce que j'ai un hauboïste sous la main (oui aussi ! Merci Emilien pour ton concours..), examinons le spectre du La d'un hautbois. Il semble que le La du hautbois soit plutôt à 442 Hz. Et j'ai remarqué que c'est le hautbois qui donnait le La lorsqu'il joue dans un orchestre. Ce qui expliquerait que certains musiciens préfèrent accorder leur instrument sur 442 Hz. Mais bon, on s'éloigne du sujet !

Son spectre

Examinons d'abord son aspect entre 0 et 4000 Hz:

SpectreHautbois4000Hz

On remarque ici aussi la richesse du spectre de ce magnifique instrument !

Comment améliorer le calcul d'un spectre

Observer le repliement d'un spectre

Nous allons d'abord examiner l'effet d'un bruit haute fréquence sur un signal sinusoïdal composite. Reprenons notre signal formé d'une somme de sinus à 10, 50 et 100 Hz. La durée d'échantillonnage sera fixée à 10 secondes. En lançant le script AnalSpectrale03.py, il me demande la fréquence d'échantillonnage. Je la fixe à 300 Hz, donc supérieure au critère de Nyquist. Remarquez aussi dans le code l'instruction signal = Composite(A0,f0,A1,f1,A2,f2,False,t). Le booléen False me permet d'inhiber pour l'instant le bruitage HF. J'obtiens finalement le signal et le spectre suivants :

Spectre repliement 300

Le spectre présente bien les trois raies attendues à 10, 50 et 100 Hz. Vous noterez que j'ai normalisé l'amplitude afin de vérifier les hauteurs relatives des raies, qui sont correctes par rapport à la valeur des coefficents A0, A1 et A2 du signal.

Maintenant, relançons le script, mais en choisissant une fréquence d'échantillonnage égale au critère de Nyquist soit 200 Hz. Nous obtenons le spectre suivant:

Spectre repliement 200

Vous constatez que la raie à 100 Hz n'apparait plus clairement, alors que les raies de 10 et 50 Hz sont visibles. De plus, le signal est sensiblement déformé. il faut donc échantillonner à une fréquence supérieure, et même significativement supérieure, à la fréquence de Nyquist pour obtenir un spectre correct.

Choisissons enfin une fréquence d'échantillonnage inférieure au citère de Nyquist, par exemple 100 Hz. Le signal et le spectre obtenus sont:

Spectre repliement 100

Seule la raie de 10 Hz est visible et le signal est complétement déformé.
Conclusion : pour obtenir un spectre correct, choisissez toujours une fréquence d'échantillonnage très supérieure à la fréquence maximale du signal que vous analysez.

Mais que se passe-t-il si mon signal composite est bruité à haute fréquence, alors que j'ai choisi une fréquence d'échantillonnage supérieure à la fréquence max que je pense connaitre de mon signal, ici 100 Hz ? Pour illustrer le problème, vous allez modifier le booléen de l'instruction signal = Composite(A0,f0,A1,f1,A2,f2,False,t) en le portant à True. Cela introduit un bruit à haute fréquence (2270 Hz) dans mon signal. Relançons le script en choisissant une fréquence d'échantillonnage de 300 Hz.
Voyons l'effet sur le signal et son spectre :

Spectre repliement signal bruité HF

Vous voyez apparaitre une raie à 130 Hz, qui n'est pas du tout attendue, et qui provient du bruit haute fréquence. Votre spectre ne correspond donc plus à ce vous attendiez. Sur cet exemple simple, cela ne semble pas dramatique, mais dans la réalité, avec des bruits plus ou moins aléatoires et étalés en fréquence, cela donne des résultats absolument illisibles. D'où la nécessité de filtrer votre signal avant l'analyse avec un filtre passe-bas, pour éliminer les bruits HF. Reste que les filtres passe-bas ne sont pas parfaits, et qu'il est parfois difficile de déterminer la fréquence de coupure à utiliser...

L'influence du fenêtrage du signal

Reprenons notre signal sinusoïdal pur, d'une fréquence de 5 Hz, dont nous avions constaté que la raie de son spectre était plutôt évasée à sa base. Le schéma ci-dessous nous rappelle la forme de son signal et son spectre.

Spectre 5 Hz normalisé sans fenetre

Dans ce cas, nous appliquons de manière tout à fait implicite une fenêtre rectangulaire entre 0 et t secondes, soit dans notre cas 10 secondes.

Appliquons maintenant une fenêtre de Hann. Cela veut dire que je vais multiplier le signal brute par une fonction \(w(t) \) ppour tenter de corriger la périodicité articifielle introduite par l'échantillonnage. Plus particulièrement, la fonction de Hann est définie par \( w(t) = 0.5 - 0.5\cos(\dfrac{2\pi t}{T}) \) ou encore \( w(n) = 0.5 - 0.5\cos(\dfrac{2\pi n}{N-1}) \), avec N le nombre de points de l'échantillon. Notez que dans le script AnalSpectrale04.py, j'utilise la fonction hanning du package scipy.signal, qui génère automatiquement la fenetre dans un vecteur, que je multiplie membre à membre avec le vecteur signal.
Et voilà ce que cela donne :

Spectre 5 Hz normalisé Hanning 10 s

Vous notez que la forme du signal d'entrée a été modifiée par l'application de la fenêtre. La durée de l'échantillon est ici de 10 secondes. Vous notez que la raie est encore assez large, mais que sa base est beaucoup moins évasée. Le fenetrage n'est pas très sensible dans le cas d'un signal calculé pur, mais néamoins l'effet est visible.

Pour obtenir une raie plus étroite encore, la solution est d'augmenter la résolution fréquentielle, c'est à dire d'augmenter le temps d'échantillonnage. Sur le schéma ci-dessous, j'ai porté le temps d'échantillonnage à 40 secondes :

Spectre 5 Hz normalisé Hanning 40 s

On observe que la raie de 5 Hz est beaucoup plus étroite. C'est un compromis entre résolution temporelle (la durée de l'échantillon) et la résolution fréquentielle (la largeur de la raie). Le choix de la fenêtre est conditionné par ce que l'on veut faire : définir avec précision les fréquences des différentes raies, définir leur amplitude, estimer l'énergie portée par chaque fréquence, etc. Il existe une ou plusieurs fenêtres pour chacun de ces objectifs.
Néanmoins, le fenêtrage n'est pas la panacée. La longueur de la fenêtre est fixe, ce qui peut se révéler très handicapant lorsqu'il s'agit de traiter des signaux dont les ordres de grandeur de variation sont très ... variables. C'est le cas par exemple des signaux sismiques. Un mathématicien français, Yves Meyer, normalien et prof. de maths à l'X en 1980, a inventé un nouvel outil pour traiter le problème. C'est un géophysicien français, Jean Morlet (X52), qui appliqua cet outil au traitement du signal sismique (il bossait pour Elf) et lui donna son nom : les ondelettes. Mais c'est une autre histoire...

Les scripts Python

Pour réaliser les différents graphiques ci-dessus, j'ai utilisé plusieurs scripts Python, qui sont disponibles dans le package AnalSpectrale.rar :

Pour conclure

L'analyse spectrale, que je viens d'aborder très sommairement, est un domaine de recherche et d'application en physique et en sciences de l'ingénieur très vivace. J'aurais sans doute l'occasion d'y revenir. En attendant, je vous encourage à maniper, en particulier à étudier le package scipy.signal de python qui est très riche en informations et expériences possibles.

Encore merci à Nadine et à Emilien pour leur très aimable concours musical. Il n'est pas évident d'avoir une violoncelliste et un pianiste hautboïste sous la main pour produire des fichiers .wav... Pour la petite histoire, j'ai réalisé ces fichiers avec le très performant (à mon avis) logiciel Audacity, avec un échantillonnage 16 bits à 8 kHz, en mono.

Contenu et design par Dominique Lefebvre - www.tangenteX.com décembre 2014   Licence Creative Commons   Contact : PhysiqueX ou

Cette œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 3.0 France.