Académique Documents
Professionnel Documents
Culture Documents
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.
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
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
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'])
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))
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')
#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
Analyse spectrale
4/8
Polytech Grenoble IESE4
plt.figure()
plt.plot(s1),plt.title(['s1 ', np.str(N), ' points']); #affichage sans axe des temps, à faire
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 ?
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 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.
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
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 :
qui est égale à la fonction d’autocorrélation temporelle (ergodicité) pour une observation sur 𝐾
points :
𝐾−|𝑘|−1
1
𝛾𝑥𝑥 [𝑘] = ∑ 𝑥[𝑛]. 𝑥[𝑛 + 𝑘] , |𝑘| < 𝐾 − 1
𝐾
𝑙=0
𝑙=−(𝐾−1)
On montre que :
𝐾−1 2
1 𝑘
−2𝜋𝑗𝑓𝐹
𝑆𝑥𝑥 (𝑓) = |∑ 𝑥[𝑘]. 𝑒 𝐸|
𝐾
𝑙=0
𝑓
et en fréquence normalisée 𝜆 = :
𝐹𝐸
𝐾−1 2
1
𝑆𝑥𝑥 (𝜆) = |∑ 𝑥[𝑘]. 𝑒 −2𝜋𝑗𝜆𝑘 |
𝐾
𝑙=0
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.
Analyse spectrale
7/8
Polytech Grenoble IESE4
𝑀−1 2
1
𝑆𝑥𝑥,𝑙 (𝜆) = | ∑ 𝑥[(𝑙 − 1) × 𝑀 + 𝑘]. 𝑒 −2𝜋𝑗𝜆𝑘 | , 𝑙 = 1 … 𝐿
𝑀
𝑘=0
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