Vous êtes sur la page 1sur 8

Polytech Grenoble IESE4

Département IESE4 Traitement Numérique du Signal


TP Analyse spectrale

Dans de nombreux systèmes physiques (optique, acoustique, radio-astronomie, communication


…), la simple représentation temporelle des signaux se révèle insuffisante. Aussi utilise-t-on
souvent une représentation fréquentielle. L’analyse de spectre fournit cette représentation sous
forme d’une répartition de la puissance du signal en fonction de la fréquence.

Dans le cadre de ce TP, vous allez travailler avec différents fichiers sons correspondant à des
notes de musique, qu’il vous faudra retrouver à l’aide d’une analyse spectrale. L’objectif de ce
TP est d’utiliser différentes méthodes d’analyse spectrale comme le périodogramme et le
périodogramme moyenné pour comprendre (i) leur intérêt en fonction du signal à traiter et (ii)
l’influence de leur réglage sur la représentation fréquentielle obtenue. Les fichiers à analyser
comportent une unique note, deux notes jouées simultanément, deux notes jouées dans un
environnement perturbé par du bruit, puis une mélodie (une succession de notes).

Pour chaque signal, vous devrez tester ces méthodes d’analyse spectrale afin de déterminer
quelle est la méthode et les réglages qui vous semblent les plus aptes à répondre au problème
posé. Une analyse des résultats obtenus et la justification des choix effectués seront
indispensables.

Un rappel de cours sur l’analyse spectrale est disponible en fin de ce document (à lire
impérativement avant de débuter le TP). Ce TP débute par une partie préliminaire sur l’analyse
spectrale avec des signaux simples noyés dans du bruit de façon à comprendre les différentes
fonctions permettant l’analyse spectrale avant d’aborder le cœur du TP avec les analyses
spectrales sur les fichiers de notes de musique.

Préparation du TP à effectuer avant la séance


On considère un signal bruité de type sinus d’amplitude 𝐴 de fréquence 𝑓0 tel que 𝑥(𝑡) =
𝐴. 𝑠𝑖𝑛(2𝜋𝑓0 𝑡) + 𝜎. 𝑛(𝑡) avec 𝑛(𝑡) un bruit blanc gaussien de variance unitaire. Le signal est
échantillonné à la fréquence 𝐹𝑒 . On rappelle que la puissance du signal utile est ici 𝐴2 /2 et celle
du bruit 𝜎 2 . On choisira comme valeurs numériques pour les fréquences 𝐹𝑒 = 1000 Hz, 𝐹0 =
20 Hz, et pour les amplitudes 𝐴 = 1, et 𝜎 = 1.

• Calculer théoriquement la puissance de signal bruité observé de -∞ à +∞, considérant


que le bruit 𝑛(𝑡) est indépendant du signal.
• Dans ces conditions, donner l’expression de la densité spectrale de puissance du signal
bruité. La tracer.
• Donner l’expression du rapport Signal à Bruit 𝑅𝑆𝐵 (sans unité) et donner son
expression en dB 𝑅𝑆𝐵𝑑𝐵 .
• Calculer le 𝑅𝑆𝐵𝑑𝐵 avec les valeurs numériques fournies.

Compléter le programme fourni à la page suivante, afin de :


• visualiser le signal 𝑥[𝑘] sur 𝑁 échantillons (𝑁 = 1024),

Analyse spectrale
1/8
Polytech Grenoble IESE4

• calculer à partir des échantillons x[k], la puissance du signal observé dans le domaine
temporel.
• Comparer avec la valeur théorique attenue.

Python
périodogramme, périodogramme moyenné
periodogram, welch
Programme de la partie préliminaire – Fonctions utiles
import numpy as np
import scipy.signal as scs
import matplotlib.pyplot as plt
import numpy as np

# fonctions numpy : fft


# fonctions scipy : periodogram, welch

plt.close('all')
N=1024 #Nombre d’échantillons
F0 = 20 #Fréquence du signal [Hz]
Fe= 1000 #Fréquence d’échantillonnage [Hz]
TSignal = N/Fe #Durée d’acquisition [sec]
A= 1 #Amplitude du sinus
Sigma2 = 1 #Variance du bruit

k=np.arange(0,N) #Vecteur des indices des échantillons

#Génération du signal bruité


x=A*np.sin(2*np.pi*F0*k/Fe)+np.sqrt(Sigma2)*np.random.standard_normal(N)

Compléter le programme afin de visualiser le périodogramme en dB calculé à partir des 𝑁


échantillons de 𝑥[. ].
• Quel est le pas fréquentiel ? Commenter le spectre obtenu.
• Calculer la puissance du signal à partir de la DSP.
• Comment pourriez vous calculer la puissance du bruit à partir de la DSP obtenue.
Faire le calcul et comparer avec la valeur théorique attendue.

Compléter le programme afin de visualiser le périodogramme en dB calculés à partir des 𝑁/4


premiers échantillons de 𝑥[. ].
• Quel est le pas fréquentiel ?
• Calculer la puissance du signal à partir de la DSP.

Compléter le programme afin de visualiser le périodogramme moyenné en dB en utilisant les


𝑁 échantillons de 𝑥[. ]. On fixera la taille des segments à N/4 avec un recouvrement de N/8.
• Quel est le pas fréquentiel obtenu ?
• Sur combien de périodogrammes est effectuée la moyenne ?

Analyse spectrale
2/8
Polytech Grenoble IESE4

Afficher les 3 estimateurs de la DSP en les superposant sur le même graphe. Les comparer
qualitativement. Le théorème de Parseval est-il vérifié ?

Pour évaluer la variance des estimateurs, écrire un programme permettant de calculer sur un
nombre NE d’estimations, la puissance du signal selon les quatre méthodes précédentes. Faire
une boucle avec 𝑁𝐸 itérations et ranger dans quatre « array »s, les résultats de l’estimation de
la puissance. Afficher le boxplot de ces quatre distributions.

Python
#Affichage des boxplot pour 4 methodes d'estimation de la puissance
plt.figure()
plt.boxplot([Pxt, PxSxx1, PxSxx2, PxSxx3])
plt.title(str(NE) + ' estimations de la puissance')
plt.gca().xaxis.set_ticklabels(['Px t', 'Px Sxx N', 'Px Sxx N/4', 'Px Sxx N/4 Welsh'])

• Conclure sur les avantages et inconvénients du périodogramme moyenné.

Partie « Notes de musique »


Une note pure est une vibration sonore de type sinusoïdal à une fréquence. Vous trouverez le
tableau des fréquences de notes musicales ci-dessous. Le « La » de référence pour ce tableau
est de 440 Hz, mais souvent les instruments sont encore accordés à 437Hz, et parfois l’accord
n’est pas parfait…
Un instrument de musique produit pour chaque note une fréquence fondamentale 𝑓0 et des
harmoniques 𝑓𝑛 = 𝑛. 𝑓0 , 𝑛 ∈ ℕ∗ . La hauteur de la note est la fréquence fondamentale qui a la
contribution la plus forte dans le signal émis. Souvent la qualité d’un instrument repose sur sa
capacité à produire de bons harmoniques.

Entre deux octaves successives, la hauteur d’une même note aura sa fréquence fondamentale
multipliée par 2 dans l’octave supérieure. Au sein d’une même octave, les 12 notes d’une
gamme tempérée du do au si ont des hauteurs telles que : 𝑓0 (𝑘) = 𝑓0 (1). 2(𝑘−1)/12 , avec 𝑘
l’indice du ton de la note, numéroté de 1 à 12, comme indiqué au tableau ci-dessous.

Analyse spectrale
3/8
Polytech Grenoble IESE4

La à 437 Hz octave 4
Re# Mi Fa Fa# Sol Sol# La Sib Si do Do# Re Re#
309 327.38 346.85 367.47 389.32 412.47 437 462.99 490.52 519.68 550.59 583.325 618.01

Pour information, si vous souhaitez connaître la hauteur des notes pour les 12 tons inférieurs et
les douze tons supérieurs à un note donnée, vous pouvez exécuter le code ci-dessous (fourni
dans le programme Python ‘TP_son_etu.py‘).

Python
La=440
k=np.arange(-12,12,1)
r=np.power(np.float64(2),np.float64(1.0/12))
f=La*np.power(r,(k))

1 Une note (fichier ‘une_note.wav’)

Installer sound device avec l’instruction pip install sounddevice à taper dans une fenêtre
anaconda.
Objectif : Retrouver, à l’aide du tableau ci-dessus, la note jouée.

Ecrire un programme qui affiche le signal en temporel. Sélectionner une partie où le signal est
stationnaire. Préciser la durée minimale (en nombre de points) du signal nécessaire pour
distinguer deux notes successives. Calculer la densité spectrale de puissance du signal, en V2/Hz
et en dB, à l’aide du périodogramme. Précisez le pas fréquentiel obtenu. On fera très attention
à la bonne définition des axes. L’axe des temps sera gradué en seconde et celui des fréquences
en Hertz.

Python
fonction wavfile.read de scipy.io
Contenu du fichier TP_son_etu.py
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
import sounddevice as sd
#attention il faut installer la package sounddevice si vous voulez l'utiliser
# pip install sounddevice dans la console Anconda

plt.close('all')

[sampFreq, sndinit] = wavfile.read('./LesSons/Deux_notes.wav')


sd.play(sndinit, sampFreq) #faire jouer le tableau numpy de son donc le signal brut
#sd.stop()

#Signal à analyser
snd = np.float64(sndinit) / (2.**15) #normalisation des données, fichier son 16 bits
entiers, il faut transformer en float pour les calculs
[N,channel]=snd.shape #récupère le nbr d'échantillons, et le nombre de canaux

s1 = snd[:,0] #on ne prend que le premier canal pour le signal à analyser

Analyse spectrale
4/8
Polytech Grenoble IESE4

#s1 = snd #dans le cas mono


#N = s1.size #Nombre d'échantillons

plt.figure()
plt.plot(s1),plt.title(['s1 ', np.str(N), ' points']); #affichage sans axe des temps, à faire

#Observer le signal et choisir empiriquement si nécessaire


#N0, l'indice du premier échantillon de la fenêtre d'observation
#N1, l'indice du dernier

Il est préconisé pour une interprétation plus aisée d’afficher les spectres en centrant les
fréquences pour que la fréquence nulle soit au centre de la représentation.

Pourquoi le spectre semble-t-il être nul à 16kHz alors que la fréquence d’échantillonnage est de
44,1 kHz ? Que pouvez-vous en déduire ?

2 Deux notes (‘Deux_notes.wav’)


Retrouver la fréquence fondamentale des deux notes jouées. A l’aide du tableau de
correspondance des notes, retrouver alors les deux notes jouées. Indiquer leur puissance
respective. En déduire leur rapport de puissance pour ces deux fréquences fondamentales.

3 Deux notes et du bruit


A partir du fichier ‘ Deux_notes_attenuees.wav’, retrouver à l’aide du tableau ci-dessus, les
notes jouées. L’une des notes est jouée en sourdine. Indiquer leur rapport de puissance. On
prendra soin de bien régler les paramètres de la fonction périodogramme (longueur du signal,
nombre de points pour calculer la fft, fenêtre d’apodisation).

Même chose avec le fichier ‘Deux_notes_bruit_blanc.wav’. On utilisera le périodogramme


moyenné en ayant soin de bien régler les paramètres de la fonction welch (longueur du signal,
nombre de points pour calculer la fft, fenêtre d’apodisation, longueur des segments, taille du
recouvrement).

4 Une mélodie – Vers le temps/fréquence


A partir du fichier ‘ melodie.wav’, retrouver les notes successives jouées. Peut-on utiliser
directement les méthodes vues précédemment ? Proposer une solution adaptée.

Analyse spectrale
5/8
Polytech Grenoble IESE4

RAPPELS DE COURS

1. DEFINITIONS
a- Cas des signaux certains à Puissance finie
La densité spectrale 𝑆𝑥𝑥 (𝑓), transformée de Fourier de la fonction d’autocorrélation, décrit la
représentation fréquentielle de la puissance du signal.

Pour les signaux périodiques (fréquence fondamentale f0 = 1/T0 ), 𝑥(𝑡) admet une
décomposition en série de Fourier

𝑎0
𝑥(𝑡) = + ∑ 𝑎𝑛 𝑐𝑜𝑠(2𝜋𝑛𝑓0 𝑡) + 𝑏𝑛 𝑠𝑖𝑛(2𝜋𝑛𝑓0 𝑡)
2
𝑛=1

𝑇 𝑇 𝑇
2 2 2 2 2 2
a0 = ∫ 𝑥(𝑡)𝑑𝑡 , a𝑛 = ∫ 𝑥(𝑡)cos(2𝜋𝑛𝑓0 𝑡)𝑑𝑡 , b𝑛 = ∫ 𝑥(𝑡)cos(2𝜋𝑛𝑓0 𝑡)𝑑𝑡
𝑇 −𝑇 𝑇 −𝑇 𝑇 −𝑇
2 2 2

La transformée de Fourier de 𝑥(𝑡) est un spectre de raie qui s'écrit ainsi :



𝑎0 1
𝑋(𝑓) = . 𝛿(𝑓) + ∑(𝑎𝑛 − 𝑗𝑏𝑛 ). 𝛿(𝑓 − 𝑛𝑓0 ) + (𝑎𝑛 + 𝑗𝑏𝑛 ). 𝛿(𝑓 + 𝑛𝑓0 )
2 2
𝑛=1

La densité spectrale de 𝑥(𝑡) sera donc également un spectre de raies en 𝑛𝑓0 pour 𝑛 ∈ ℤ, la raie
de rang 𝑛 ayant pour amplitude la puissance moyenne de l’harmonique de rang 𝑛, soit (𝑎𝑛2 +
𝑏𝑛2 )/4.

b- Cas des signaux aléatoires


Soit X(t) un processus aléatoire à puissance moyenne finie. On note 𝑥𝑇,𝑘 (𝑡) sa kième réalisation
sur une durée d’observation 𝑇. La densité spectrale de puissance moyennée est définie par :
2
|𝑋𝑇,𝑘 (𝑓)|
𝑆𝑥𝑥 (𝑓) = E [ lim ]
𝑇→+∞ 𝑇

avec 𝐸[. ] l’espérance mathématique sur toutes les réalisations k du processus aléatoire observée
sur une durée T et 𝑋𝑡,𝑘 (𝑓) la transformée de Fourier à émergie finie de 𝑥𝑇,𝑘 (𝑡).
Si le processus est ergodique (moyennes temporelle et statistique égales), alors :

|𝑋(𝑓)|2
𝑆𝑥𝑥 (𝑓) = lim
𝑇→+∞ 𝑇

Analyse spectrale
6/8
Polytech Grenoble IESE4

2. ESTIMATION DE LA DENSITÉ SPECTRALE DE PUISSANCE

Il existe plusieurs méthodes pour estimer la DSP d’un signal, dont celles basées sur la
Transformée de Fourier.

Nous allons observer la différence des résultats obtenus avec l’approche périodogramme et
l’approche périodogramme moyenné.

2.1. Le périodogramme
L’estimateur spectral le plus simple est la transformée de Fourier Discrète de l’estimateur de la
fonction d’autocorrélation. On sait par le théorème de Wiener-Khintchine que la transformée
de Fourier de la fonction d’autocorrélation est la densité spectrale de puissance.

Soit un processus aléatoire discret de réalisations 𝑥[𝑛] réelles, stationnaire au second ordre et
centré. On définit la fonction d’auto-corrélation statistique du processus :

𝑅𝑥𝑥 [𝑘] = E[𝑥[𝑛 + 𝑘]. 𝑥[𝑛]∗ ] = E[𝑥[𝑛 + 𝑘]. 𝑥[𝑛]]

qui est égale à la fonction d’autocorrélation temporelle (ergodicité) pour une observation sur 𝐾
points :
𝐾−|𝑘|−1
1
𝛾𝑥𝑥 [𝑘] = ∑ 𝑥[𝑛]. 𝑥[𝑛 + 𝑘] , |𝑘| < 𝐾 − 1
𝐾
𝑙=0

et sa densité spectrale de puissance (𝐹𝐸 fréquence d’échantillonnage) :


𝐾−1
𝑘
−2𝜋𝑗𝑓𝐹
𝑆𝑥𝑥 (𝑓) = TFTD{𝛾𝑥𝑥 [𝑘]} = ∑ 𝛾𝑥𝑥 [𝑘]. 𝑒 𝐸

𝑙=−(𝐾−1)

On montre que :
𝐾−1 2
1 𝑘
−2𝜋𝑗𝑓𝐹
𝑆𝑥𝑥 (𝑓) = |∑ 𝑥[𝑘]. 𝑒 𝐸|
𝐾
𝑙=0
𝑓
et en fréquence normalisée 𝜆 = :
𝐹𝐸
𝐾−1 2
1
𝑆𝑥𝑥 (𝜆) = |∑ 𝑥[𝑘]. 𝑒 −2𝜋𝑗𝜆𝑘 |
𝐾
𝑙=0

𝑆𝑥𝑥 (𝜆) est appelé périodogramme.

Caractéristiques de l’estimateur
- Le périodogramme est un estimateur asymptotiquement sans biais de la DSP. C’est-à-dire
que son espérance tend, pour toutes valeurs de 𝑓, vers 𝑆𝑥𝑥 (𝑓) quand 𝐾 tend vers l’infini.

- En revanche, le périodogramme reste un mauvais estimateur de la DSP car sa variance ne


tend pas vers zéro lorsque K tend vers l’infini. La variance de cet estimateur simple est
indépendante de la durée d’observation (taille 𝐾 de l’échantillon). Le périodogramme fluctue
autour de la vraie DSP. Même pour 𝐾 très grand, l’amplitude des fluctuations reste de l’ordre
de grandeur de la DSP à estimer.

Analyse spectrale
7/8
Polytech Grenoble IESE4

Le périodogramme correspond à la commande ‘periodogram’ de scipy.signal.

2.2. Le périodogramme moyenné


La variance du périodogramme ne tend pas vers 0 quand la taille de l’échantillon tend vers
l’infini. La variance tendant vers 0 peut être obtenue par moyenne de plusieurs
périodogrammes. On parle de ‘périodogramme moyenné’ :

1. On fragmente l’échantillon 𝑥[𝑛] de longueur 𝐾 en 𝐿 sections de durée 𝑀 chacune.


2. On applique éventuellement une fenêtre de pondération sur chacun des L sous-
intervalles (estimateur de Welsh)
3. On évalue L périodogrammes.

𝑀−1 2
1
𝑆𝑥𝑥,𝑙 (𝜆) = | ∑ 𝑥[(𝑙 − 1) × 𝑀 + 𝑘]. 𝑒 −2𝜋𝑗𝜆𝑘 | , 𝑙 = 1 … 𝐿
𝑀
𝑘=0

4. On effectue la moyenne suivante sur les L sections :


𝐿
̅̅̅̅̅̅̅̅ 1
𝑆𝑥𝑥 (𝜆) = ∑ 𝑆𝑥𝑥,𝑙 (𝜆)
𝐿
𝑙=1

Si l’on admet que les 𝐿 estimateurs simples sont indépendants, on montre alors que la variance
de cet estimateur est proportionnelle à 1/𝐿 = 𝑀/𝐾 et donc décroît proportionnellement à la
durée d’observation 𝐾 ou au nombre 𝐿 de sections.
Les sections peuvent se chevaucher (overlapping). Le taux de recouvrement le plus
couramment utilisé est 50%.
Le périodogramme moyenné correspond à la fonction ‘welch’ de scipy.signal.

Analyse spectrale
8/8

Vous aimerez peut-être aussi