Table des matières PDF

Analyse d'un signal audio

1. Introduction

L'objectif de ces travaux pratiques est de réaliser l'analyse fréquentielle d'un signal audio. Dans le cas d'une analyse en temps réel, le signal est délivré par un microphone. Si le signal est enregistré dans un fichier audio (type WAV), il est possible de faire l'analyse du signal numérique enregistré.

On se propose de réaliser un système capable d'analyser en temps réel le signal délivré par un microphone. Cependant, pour des raisons pratiques, le signal électrique ne sera pas délivré par un microphone mais proviendra soit d'un générateur de signaux, soit de la sortie audio de l'ordinateur (prise jack).

Matériel disponible :

On précise que les signaux audio ont le plus souvent une fréquence fondamentale comprise entre 100 et 1000 Hz et que la fréquence d'échantillonnage typique pour une analyse complète de ces signaux est de 40 kHz, car l'oreille humaine entend les sons jusqu'à environ 20 kHz.

Le script acquisition.py permet de faire une numérisation sur la voie EA0 de la carte Sysam SP5, avec un déclenchement par seuil. Le signal échantillonné est enregistré dans un fichier texte (temps en première colonne, tensions en seconde colonne).

La fonction donnée ci-dessous calcule le spectre d'un signal échantillonné, en utilisant la transformée de Fourier discrète et la méthode de complément par des zéros :

import numpy as np
from scipy.signal import blackman
from numpy.fft import fft
              
def spectre(t,x):
    '''
        t : tableau des temps
        x : tableau des échantillons
    '''
    N=len(x)
    te=t[1]-t[0]
    zeros=np.zeros(6*N)
    X = np.concatenate((x*blackman(N),zeros))
    NN=len(X)
    spectre = np.absolute(fft(X))*2.0/N/0.42
    freq = np.arange(NN)*1.0/(NN*te)
    return (freq,spectre)             
              

2. Analyse d'un signal périodique

2.a. Objectif

Afin de mettre au point l'analyseur et de valider son fonctionnement, on commence par un signal audio parfaitement périodique et de forme connue. On utilisera pour cela le signal en dents de scie délivré par le générateur de signaux. La tension ne devra pas dépasser +/- 2 volts. On se fixe comme objectif de réaliser une analyse spectrale avec une précision de ±0,5Hz .

Lorsqu'on calcule le spectre d'un signal échantillonné, il y a un risque de repliement de spectre. Afin de repérer facilement les raies provenant du repliement, il faut, si possible, que les fréquences des raies repliées ne coïncident pas avec celles des raies du signal analogique.

2.b. Analyse d'un signal en dents de scie

[1] Choisir la fréquence d'échantillonnage et la fréquence du signal à analyser (signal en dents de scie). Faire en sorte que les fréquences des raies repliées ne coïncident pas avec les raies du signal analogique.

[2] Réaliser l'acquisition du signal pour une durée que l'on choisira. Donner la précision en fréquence de l'analyse spectrale qui sera effectuée à partir de cet enregistrement.

[3] Écrire le script qui réalise l'analyse spectrale et trace le spectre à partir du signal numérique enregistré dans le fichier texte.

[4] Tracer un spectre en échelle linéaire et un spectre en échelle décibel (voir annexe). On ajustera de manière pertinente l'échelle de fréquence du tracé. Imprimer ces graphiques. Repérer les raies de repliement si elles sont visibles.

[5] Le repliement de spectre peut être atténué avec un filtre passe-bas analogique qui filtre le signal juste avant sa numérisation. Proposer un filtre RC en justifiant les valeurs de R et C choisies.

[6] Mettre en place le filtre anti-repliement et obtenir à nouveau les spectres. Commenter le résultat. Quel est l'inconvénient du filtre anti-repliement ? Proposer et mettre en œuvre un moyen d'y remédier.

[7] Déduire du spectre un tableau donnant l'amplitude des harmoniques jusqu'au rang 10 par rapport à l'amplitude du fondamental (rapports A(n)/A(1) ). Ces résultats sont-ils conformes au spectre théorique d'un signal en dents de scie ?

3. Analyse d'un signal audio réel

3.a. Objectif

Le système d'analyse étant mis au point, on se propose de faire l'analyse d'un son enregistré, une note joué au piano. Ce son est disponible dans le fichier : son.WAV. Pour émettre le son contenu dans ce fichier, on utilisera le logiciel Audacity. On obtiendra ainsi un signal électrique sur la sortie audio de l'ordinateur, qui sera visualisé sur l'oscilloscope et numérisé avec la carte Sysam SP5, comme dans la partie précédente.

Le signal analysé n'est pas périodique sur sa durée totale mais il l'est approximativement sur un intervalle de temps réduit. On sera donc amené à faire l'analyse sur un intervalle de temps [t1,t2], sachant que plus cet intervalle de temps est petit, moins l'analyse fréquentielle est précise.

3.b. Analyse du signal

[8] Effectuer l'acquisition de la totalité du signal audio (plusieurs secondes).

[9] Compléter le script d'analyse afin qu'il calcule le spectre sur un intervalle de temps [t1,t2]. Ajouter une ligne qui affiche la précision en fréquence du spectre.

[10] Réaliser l'analyse de la première seconde du signal. En déduire la fréquence du signal et donner, sous forme d'un tableau, les amplitudes relatives de ses harmoniques.

[11] Refaire l'analyse de t1=1s à t2=2s . Comparer les deux spectres.

[12] Comparer le spectre obtenu par analyse de l'intervalle [0,0.1] à celui de l'intervalle [0.9,1].

[13] Conclusion : le signal audio analysé est-il périodique ?

3.c. Synthèse du son

Le script synthese.py permet de faire la synthèse d'un son périodique de fréquence choisie, à partir des amplitudes de ses harmoniques. Le résultat est enregistré dans un fichier WAV qu'il sera possible d'écouter avec Audacity.

[14] À partir du spectre obtenu par analyse de l'intervalle [0,1], générer un son de synthèse.

[15] Comparer à l'oreille le son enregistré et ce son de synthèse ? Comment expliquer une aussi grande différence de timbre ?

[16] À votre avis, comment fait-on pour simuler le son d'un instrument de musique (par ex. la guitare ou le piano) avec un synthétiseur électronique ?

4. Annexe : représentation des spectres

Soit A l'amplitude, c'est-à-dire le module de la transformée de Fourier discrète. Une représentation linéaire du spectre consiste à tracer A en fonction de la fréquence. Dans un premier temps, on trace le spectre sur toute la gamme de fréquences, de 0 à fe (fréquence d'échantillonnage), ce qui permet de vérifier que la partie la plus significative du spectre du signal est bien dans l'intervalle [0,fe/2]. Dans un second temps, on réduit l'échelle de fréquence afin que les raies des harmoniques du signal soient bien discernables.

Une représentation en échelle décibel consiste à tracer AdB=20log(A) en fonction de la fréquence. Cette représentation permet de voir les harmoniques de très faible amplitude. De plus, si AdB(n) est l'amplitude en décibel de l'harmonique de rang n, le rapport d'amplitude entre cet harmonique et le fondamental s'obtient par la soustraction suivante :

AdB(n)-AdB(1)=20log(A(n)A(1))(1)

On dira par exemple que l'harmonique de rang 2 est à -2 dB par rapport au fondamental, ce qui correspond à un rapport de 0,79.

Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.