Cours 5 – Comment bien échantillonner le signal audio Jean-Paul Stromboni, durée 1heure, amphi est, octobre 2008, avec vidéo projecteur et son Après ce cours, vous devriez savoir : Décrire le problème posé par l'échantillonnage d'un signal. Expliquer la notion d'alias et le phénomène d'aliasing Prédire les recouvrements du spectre Établir la condition et la formule de Shannon Vérifier la condition de Shannon sur des signaux simples En travaux dirigés n°5, avec MATLAB et Goldwave, on expérimentera : l'échantillonnage d'une note pure, et la contrainte de Shannon le sous échantillonnage (ou décimation) et le sur échantillonnage
À quelle condition peut-on reconstituer en totalité un signal audio s(t) à partir des seuls échantillons s(nTe) prélevés ? On note S(f)=TF(s(t)), le spectre du signal s(t), et on appellera dans la suite S(f-a) l'alias de S(f) décalé en a. Pour répondre à la question, on utilise le signal dit "signal échantillonné" et noté traditionnellement s*(t) : * la fonction Peigne a été définie dans le cours de la semaine 4 et on a donné sa transformée de Fourier Le calcul du spectre de s*(t) sur la page suivante fait apparaître une relation avec le spectre S(f) de s(t). On obtient une somme d'alias de S(f) décalés autour des multiples entiers de la fréquence d'échantillonnage :
Le spectre de s*(t) est la somme des alias de S(f) autour des multiples entiers de la fréquence d'échantillonnage : Le calcul du spectre de s*(t) utilise plusieurs résultats tirés de cours sur la transformée de Fourier et le spectre : La transformée de Fourier du produit est le produit de convolution * La transformée d'un peigne temporel est un peigne fréquentiel, Le produit de convolution de S(f) par d(f-a) décale S(f), soit S(f-a)
Il faut donc distinguer deux cas pour le spectre de s*(t) 1er cas : Il n'y a pas de recouvrements des alias 2ème cas : Il y a des recouvrements, les alias "se mélangent" Quelle est la condition de non recouvrement ? alias fe
filtre reconstructeur de Shannon S'il n'y a pas de recouvrements, il suffit de récupérer S(f) pour reconstituer s(t), par transformée de Fourier inverse de S(f). S'il n'y a pas de recouvrements, le spectre TF[s*(t)] contient S(f)/Te entre -fe/2 et fe/2, c'est l'alias central en f=0Hz : Pour retrouver S(f), il suffit de supprimer du spectre de s*(t) les alias hors de l'intervalle [-fe/2, fe/2] et de multiplier par Te l'alias central. C'est la fonction d'un filtre dont l'effet en fonction de la fréquence est représenté ci-dessous graphiquement et donné par une expression mathématique: filtre reconstructeur de Shannon
On sait donc calculer s(t) fonction des s(nTe), en l'absence de recouvrements du spectre de s*(t), c'est la formule de Shannon On applique le filtre de Shannon au signal s*(t) On calcule s(t) par transformée de Fourier inverse D'où la formule de Shannon :
En résumé, bien échantillonner un signal audio … Signifie : être capable de reconstituer le signal s(t) entièrement à partir des seuls échantillons s(nTe) Implique de respecter la condition de Shannon, il ne doit pas y avoir de recouvrements du spectre du "signal échantillonné" s*(t) associé à s(t). On remarque : Pour reconstituer le signal s(t), on utilise la formule de Shannon. La formule de Shannon exprime que s(t) est obtenue par filtrage de s*(t) avec le filtre reconstructeur de Shannon. La condition de Shannon s'exprime généralement pour les signaux à bande limitée par : fe>2fMax Si fMax est trop grand, ou infini, on applique un filtre anti-aliasing ou 'prefilter' pour limiter la largeur du spectre à fe/2
On peut illustrer l’aliasing ou démultiplication du spectre sur le cas particulièrement simple d’un signal s1(t) sinusoïdal
Reprendre pour s2(t) ci-dessous et donner le spectre de s2*(t)
Retrouver le spectre de s2(t) avec le filtre de Shannon
Peut-on reconstruire s3(t) ci-dessous ? Pourquoi ?
Mise en œuvre de la formule de Shannon avec Matlab % script Shannon.m N=32; %nombre d'échantillons non nuls fe=8000; t=[0:63]/fe; %vecteur temps s=0.5*cos(880*pi*t); fenetre=zeros(size(t)); fenetre(1:N)=1; s=s.*fenetre%signal x=zeros(size(t)); for j=0:N-1 x=x+s(j+1)*sinc((t-j/fe)*fe); end subplot(2,1,1) stem(t,s) title('Mise en oeuvre de la formule de Shannon') xlabel('temps (s)') ylabel('échantillons') grid subplot(2,1,2) plot(t,x) ylabel('signal reconstitué')
Sous échantillonner (ou décimer) un signal audio numérique consiste à supprimer des échantillons On décime un signal x(n) dans un rapport M en conservant un échantillon sur M. Le signal décimé y est défini comme : Sur l'exemple ci-contre M=2, les échantillons conservés sont en noir. Tout se passe comme si on avait divisé la fréquence d'échantillonnage par 2 t s(nTe) La décimation provoque une division par M de la fréquence d’échantillonnage Par conséquent, décimer peut provoquer des recouvrements du spectre, en particulier si
Sous échantillonner a un effet sur le spectre Puisque conserver un échantillon sur M revient à diviser par M la fréquence d’échantillonnage fe devient : Il y a M fois plus d’alias et ils sont divisés par M Avec MATLAB, pour décimer le vecteur sig dans un facteur M: >> sdecime = s(1:M:length(sig))
Sur-échantillonner multiplie la fréquence d'échantillonnage Pour sur-échantillonner un signal x(n) dans un rapport M, on insère M-1 échantillons nuls entre deux échantillons de x : Avec MATLAB, pour sur échantillonner le vecteur x, on fait : xM = zeros(1, M*length(x)); xM(1:M:M*length(x)) = x;
Pour vous tester par vous-même Exprimer le signal échantillonné s* associé à : A quoi correspond la décimation d’un signal xn si M=2 ? Quel est le spectre du signal échantillonné s*(t) précédent ? Qu’appelle t’on alias ? Donner l'expression du filtre reconstructeur de Shannon pour s*(t) précédent Qu'appelle t'on recouvrement du spectre ? Peut-on décimer les signaux continus ? Dans quel cas le filtre de Shannon reste t’il inefficace ?