Comment compresser avec le CODEC mlaw Jean-Paul Stromboni, mardi 4 mai 2004 ESSI 1, module SSI , 1h, amphi est Objectifs de la séance : • • • • • Rappeler comment on quantifie un signal audio avec B bits Montrer comment on évalue le bruit de quantification Calculer le rapport signal sur bruit SNRdB(B) Justifier l’emploi d’une loi de quantification non uniforme Evaluer le CODEC mlaw à l’aide d’un exemple 1 Pour vous tester sur ce cours On annonce un rapport signal Donner l’expression de la loi m sur bruit de 48dB. Qu’est ce que inverse : cela signifie précisément ? En général, le CODEC mlaw est- Quel est l’effet d’une réduction il plus performant que le d’amplitude du signal x sur le CODEC MPEG audio layer 3 ? SNR ? Un signal aléatoire x présente Quand l’erreur de quantification une répartition uniforme dans augmente, quel est l’effet sur le [-1,1]. Que peut-on en déduire ? rapport signal sur bruit ? Si le nombre de bits utilisés B diminue, quel est l’effet sur le rapport signal sur bruit ? On ramène nombre de bits de 12 à 8 avec le CODEC mlaw. Quel est le taux de compression résultant ? Page 2 Comment quantifier le signal issu du micro • Quantifier l’échantillon : 1 x(nTe ) 1 • c’est le contraindre à une valeur parmi 2B possibles. • L’intervalle [-1,1[ est découpé en 2B intervalles Ii avec i = 0,1,2,… 2B-1 de la forme Ii = [ai,ai+D[ • Si x(nTe) appartient à l’intervalle i, on lui associe dans la suite de ce cours : – la valeur xi au centre de l’intervalle et – le code binaire i sur B bits • On définit ainsi l’erreur de quantification e(nTe) : e(nTe ) xi x(nTe ) Pour B = 8 bit, que vaut D ? Et dans ce cas que vaut l’intervalle I0 ? Page 3 Ce n’est pas la seule façon de quantifier -2-B et 2-B 2. on choisit pour xi dans un CAN, la borne inférieure de l’intervalle. L’erreur est donc toujours < 0. Elle varie entre ? 0 et -2-B+1 Deux lois de quantification (B=3 bits( 1 loi centré e erreur <0 lieu d'erreur nulle 0.8 valeur xi quantifiée 1. Ici, xi est le centre de l’intervalle (loi rouge). L’erreur est donc tantôt > 0, tantôt < 0, et nulle en moyenne. Elle varie entre ? 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 Amplitude x de l’échantillon à quantifier Préciser i, xi , et l’erreur de quantification avec les deux lois pour les valeurs • x= 0.2 , • x= -0.2, • x= 0.9 Page 4 On illustre la quantification avec Matlab s (t ) sin( 880t ) f e 44100 Hz La fonction numerise quantifie sur 8 bits les échantillons de s(t) et permet d’analyser l’erreur de quantification : t=[0:1000]/44100; s=sin(880*pi*t); sq=numerise(s,8); %calculons l'erreur eq=sq-s; % étude de l'erreur max(eq) = 0.004 min(eq) = -0.004 mean(eq) = -3.6*10-5 std(eq) = 2.2*10-3 hist(eq, 64) signal à quantifier signal quantifié 1 1 0.5 0.5 0 0 -0.5 -0.5 -1 5 0 0.01 0.02 0.03 -3 x 10erreur de quantification -1 0 0.01 0.02 0.03 histogramme de l'erreur 20 15 0 10 5 -5 0 0.005 0.01 0 -4 -2 0 2 4 -3 x 10 Qu’observe t’on pour l’erreur ? Page 5 La qualité de la quantification se mesure en décibel au moyen du rapport signal sur bruit (ou SNR). L’erreur de quantification est centrée (à valeur moyenne nulle) : 2 B E[e] 2 2 2 e p ( e ) de 0 E [ e ] E [ e ] E [ e ] e 2 2 B On en tire la variance de l’erreur e 2 2 2 1 B 1 2 2 B e de 2 B 2 12 2 3 22 B 2 B et l’expression du rapport signal sur bruit (en décibel) : x2 SNRdB 10 log 10 ( 2 ) 20 log 10 (2 B 3 x ) e SNRdB 6.02 B 4.77 20 log 10 ( x ) Page 6 On doit gérer l’erreur comme un signal aléatoire B B • L’erreur de quantification e(nTe) est notée e : 2 e 2 • Elle est traitée comme un signal aléatoire, on dit aussi un bruit. • On lui associe donc une densité de probabilité p(e) c’est-à-dire que la probabilité d’avoir e0 e e0 de est p(e0 )de 2 B – d’où la valeur moyenne de e : E (e) ep(e)de 2 B – et la variance e ou l’écart-type e qui mesurent l’écart moyen de e à la valeur moyenne E(e) : 2 e E ((e E (e)) 2 ) E (e 2 ) E (e) 2 2 2 B E (e 2 ) 2 e p(e)de 2 B Page 7 Hypothèse d’une erreur uniformément répartie L’hypothèse que p(e) est constante dans [-2-B,2-B] est B d’autant plus plausible que 2 1 : p(e) e 2 B 2 B p(e) cte, e [2 B ,2 B ] B 1 2 B p ( e ) 2 et p(e)de 1 2 B Quelle est la probabilité que 2 B e 2 B ? Page 8 Il faut évaluer x à partir du signal x(nTe) Pour calculer précisément le rapport signal sur bruit, on fera une étude statistique du signal, comme pour l’erreur de quantification. En pratique, x(nTe) n’occupe qu’une partie de l’intervalle [-1,1]. 1 xmin x(nTe ) xmax 1 p (x ) p ( x) : densité de probabilit é de x 1 xmax 1 xmin E[ x] xp( x)dx xp( x)dx x E[ x] 0 x E[ x 2 ] E[ x]2 2 1 x 2 p ( x)dx 1 x 1 xmin E[x] xmax 1 évaluer p(x) et x si x est centré et uniformément réparti dans [-1,1[ Page 9 On illustre avec le fichier piano_c3.wav fe = 44100 Hz b = 16 bit N= 77566 max(y)= 0.8533 min(y)= - 0.9999 mean(y) = - 0.0012 std(y) = 0.1528 Nombre d’échantillons [y,fe,b]=wavread('../Sons/piano_c3.wav'); disp(num2str(fe)) disp(num2str(b)) 3500 N=length(y) 3000 mean(y) std(y) 2500 hist(y,100) 2000 1500 1000 500 0 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 Valeurs des échantillons entre -1 et 1 Le signal x est il centré et uniformément réparti ? Quel est l’effet sur x ? Page 10 Abaque donnant SNRdB(B) pour x=1/3 L’écart type x mesure l’occupation de l’intervalle [–1, 1] par le signal x. Voici le script Matlab qui trace l’abaque ci-contre avec x=1/3 : sigx=1/3 b=0:16; SNR=6.02*b+4.77+20*log10(sigx); plot(b,SNR) grid xlabel('b=nombre de bits') ylabel('Signal to noise ratio (dB)') title('Tracé pour \sigma_x=1/3') Quel est l’écart de rapport signal sur bruit entre B=8bits et B=12bits ? Page 11 mlaw: loi de quantification non uniforme • Les niveaux de quantification sont mal utilisés par le signal x(nTe) quand la répartition des échantillons n’est pas uniforme, il en résulte une chute de x, donc du rapport signal sur bruit. • Le CODEC mlaw applique une non linéarité Q[.] (voir cidessous) au signal x pour répartir mieux les valeurs des échantillons et donc augmenter le rapport signal sur bruit. y Q[ x] xQ sgn( x) ln( 1 m x ) ln( 1 m ) , m 28 1 • Si on quantifie y= Q[x], on peut réduire le nombre de bit B en dégradant un peu le SNR, d’où on tire des taux de compression • de l’ordre de C=3/2 (12 bits 8 bits) sur le signal vocal en téléphonie ou C=2 (16 bits 8 bits). Page 12 Tracé avec Matlab de y =Q[x] (ici m=28-1) function [y]=invmulaw(xmu) mu=255; N=1+mu; y=sign(xmu).*(exp(log(N)*abs(xmu))-1)/mu; function yn=numerise(y,b) % code y sur b bit, retour dans yd % y est supposé varier entre -1 et 1 N=2^b; yn=(1+2*fix((y+1)*N/2))/N - 1; yn(length(yn))=yn(length(yn)-1); function ymu=mulaw(x) mu=255; N=1+mu; ymu=sign(x).*log(1+mu*abs(x))/log(N); % puis dans l’interpréteur Matlab x=[-1:0.01:1]; plot(x,mulaw(x)) y Q[x] 1 0.8 0.6 0.4 0.2 x 0 -0.2 -0.4 -0.6 -0.8 -1 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 Page 13 Comment mlaw transforme piano_c3 mlaw mlaw inverse Quantifier b = 8 bit y Q[x] x y8 xDEC SNR hist(x,64) hist(y,64) hist(xdec,64) hist(y8,64) 1200012000 14000 12000 12000 10000 10000 8000 8000 6000 6000 3000 4000 2000 3500 3000 3000 3000 2500 2500 2000 2000 1500 1500 1000 1000 500 0 -1 0 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 4000 3500 2000 500 -0.8 -0.6 -0.4 -0.2 0 0.2 1 Que démontre cette chaîne ? 0.4 0.6 0.8 1 0 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 0 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 Page 14 On vérifie que mlaw améliore le SNR x(nTe ) Klf1.wav m y (nTe ) 8 bit B 16 bit 8 bit [x,f,b]=wavread('../Sons/klf1.wav'); x8=numerise(x,8); std(x) y=mulaw(x); std(y) y8=numerise(y,8); xrec=invmulaw(y8); % calcul du rapport signal sur bruit er=x-x8; snr1=20*log10(std(x)/std(x-xrec)) snr2=20*log10(std(x)/std(er)) y8 (nTe ) B 8 bit m-1 xrec (nTe ) snr1 x8 (nTe ) B 8 bit snr2 Résultats de MATLAB std(x) = 0.0541 std(y) = 0.3567 snr1 = 37.7157 dB snr2 = 27.5937 dB Page 15 Comment on utilise mlaw pour compresser piano_c3 B 16 bit x(nTe ) 1/8 m y (nTe ) 8 bit y8 (nTe ) -1 8 bit m B 8 bit xrec (nTe ) x8 (nTe ) B 8 bit [x,fs,b]=wavread('../Sons/piano_c3.wav'); xdiv8=x/8; % on divise le signal par 8 pour dégrader SNR x8=numerise(xdiv8,8); % on numérise sur 8 bit % numérise est une fonction à écrire par ailleurs % compression : on applique la loi mu y=sign(xdiv8).*log(1+255*abs(xdiv8))/log(256); y8=numerise(y,8); % décompression : on applique la loi mu inverse xrec=sign(y).*(256.^abs(y8)-1)/255; sound([8*x8;8*xrec],fs) % on joue les deux sons Comparer x8 et y8 et évaluer le taux de compression Page 16