L'objectif de ce TP est d'étudier l'influence de la quantification qui se fait lors de la conversion analogique-numérique. On étudiera le bruit de quantification et le rapport signal sur bruit associé. On verra aussi pourquoi la numérisation d'un signal de très faible amplitude nécessite une amplification de tension et comment réaliser cette amplification au moyen d'un amplificateur linéaire intégré (ALI).
Matériel :
La quantification d'un signal analogique intervient au cours de la conversion analogique-numérique : la tension u(t) à un instant t=tk est convertie en un nombre entier codé sur p bits. Le convertisseur analogique-numérique (CAN) et généralement précédé d'un amplificateur (dont on verra le fonctionnement plus loin). Supposons que le système amplificateur-CAN soit configuré pour numériser des tensions dont la valeur est dans l'intervalle [-Um,Um]. La largeur de la plage de tensions pouvant être numérisées est donc U0=2Um. On définit le pas de quantification par :
Les valeurs possibles des nombres entiers sont :
Le CAN donne le nombre entier n tel que uk=-Um+nδ soit la meilleure approximation de u(tk). Considérons l'écart entre cette approximation et la valeur exacte, nommée erreur de quantification :
On a par définition :
Lorsqu'on réalise un grand nombre de conversions (échantillonnage temporel du signal), l'indice k varie et l'erreur de quantification présente les propriétés d'une variable aléatoire (si l'amplitude du signal est beaucoup plus grande que δ). La valeur fournie par le CAN à l'instant tk=kTe s'écrit :
L'effet de la quantification est donc équivalent à ajouter au signal une variable aléatoire. Le signal est le bruit de quantification. Plus p est grand, plus δ est petit donc plus le bruit de quantification est faible.
[1]
Calculer la valeur de δ pour la carte Sysam SP5 (convertisseur 12 bits) utilisée avec le calibre [-10,10] volts.
On se propose de faire une simulation de Monte-Carlo du bruit de quantification. On utilise pour cela le module numpy.random.
[2] Attribuer des valeurs à p et Um et calculer U0 et δ. Au moyen de la fonction numpy.random.uniform, générer un tableau de N = 100 000 valeurs réelles de tension u réparties selon une loi de probabilité uniforme.
[3] Au moyen de la fonction numpy.around, calculer le tableau contenant le résultat de la quantification, c'est-à-dire les entiers n. Calculer le tableau contenant les valeurs de εk divisées par δ.
[4] Vérifier graphiquement que εk est bien dans l'intervalle .
[5]
Au moyen de la fonction matplotlib.pyplot.hist, tracer l'histogramme des valeurs de εk. Que peut-on en déduire sur la densité de probabilité de cette variable aléatoire ?
[6]
Démontrer que la variance du bruit de quantification est donnée par :
La valeur efficace du bruit de quantification est l'écart-type, c'est-à-dire σ.
[7]
Calculer l'écart-type des valeurs de εk et vérifier numériquement le résultat précédent.
[8]
Lorsque p augmente de 1 bit, de quel facteur l'écart-type σ est-il diminué ? Exprimer cette diminution en décibel.
On cherche à étudier expérimentalement le bruit de quantification lorsqu'on numérise un signal sinusoïdal. Voici le script Python pour effectuer la numérisation dans la plage de tensions [-10 V,10 V]. La carte Sysam SP5 effectue une numérisation en p=12 bits.
import numpy as np import matplotlib.pyplot as plt from numpy.fft import fft,ifft import pycanum.main as pycan can = pycan.Sysam("SP5") T=1.0 fe = 100000 te=1.0/fe N = int(T/te) Um = 10 can.config_entrees([0],[Um]) can.config_echantillon(te*10**6,N) can.acquerir() t=can.temps()[0] u=can.entrees()[0] can.fermer() N = len(u) te = t[1]-t[0] fe=1/te tfd = fft(u) spectre = np.absolute(tfd)*2/N freq = np.arange(N)*1/(N*te) A = spectre.max() SdB = 20*np.log10(spectre/A) plt.figure() plt.plot(freq,SdB) plt.xlabel('f (Hz)') plt.ylabel('S(dB)') plt.grid() plt.ylim(-120,0) plt.show()
[9] Effectuer avec ce script la numérisation d'un signal sinusoïdal d'amplitude A=1,0 V et de fréquence environ 1000 Hz.
[10] Ajuster l'échelle verticale du spectre afin que la totalité du bruit soit visible.
[11]
Outre le bruit de quantification, quelles sont les autres causes possibles du bruit ?
On définit le rapport signal sur bruit comme le rapport de la valeur efficace du signal par la valeur efficace du bruit. Pour un signal sinusoïdal d'amplitude A, ce rapport s'écrit :
Le rapport signal sur bruit est généralement exprimé en décibel, soit .
[12]
Dans le cas où le bruit est dominé par le bruit de quantification, exprimer en fonction de et de p. Ajouter dans le script le calcul et l'affichage de ce rapport signal sur bruit.
Pour mesurer la valeur efficace du bruit, il faut faire un filtrage afin d'éliminer la composante sinusoïdale. Ce filtrage peut être fait en annulant des termes de la TFD de manière à faire disparaître les deux raies associées à cette composante. Ce type de filtrage, qui consiste à modifier directement la TFD, est un filtrage dans le domaine fréquentiel. L'application de la transformée de Fourier inverse à la TFD modifiée permet d'obtenir la représentation temporelle du bruit. Voici le code python à ajouter au script pour faire ce traitement :
i = np.argmax(spectre[0:N//2]) f = i*fe/N print("f = %f Hz"%f) di = 100 # demi-intervalle à modifier tfd[i-di:i+di] = 1e-12 tfd[N-1-i-di:N-1-i+di] = 1e-12 spectre = np.absolute(tfd)*2/N SdB = 20*np.log10(spectre/A) bruit = ifft(tfd) # transformée de fourier inverse sigma_bruit = bruit[N//4:N-N//4].std() rdB = 20*np.log10(u.std()/sigma_bruit) print('rdB exp =%f'%rdB) plt.figure() # spectre modifié plt.plot(freq,SdB) plt.xlabel('f (Hz)') plt.ylabel('S(dB)') plt.grid() plt.ylim(-120,0) plt.figure() # bruit en fonction du temps plt.plot(t,bruit) plt.xlabel('t (s)') plt.ylabel('bruit (V)') plt.grid()
[13]
À quoi sert la ligne i = np.argmax(spectre[0:N//2]) ?
[14]
Observer le spectre modifié pour une amplitude A=1,0 V. Augmenter la valeur de di jusqu'à éliminer complètement
les deux raies du signal sinusoïdal.
[15]
Observer la représentation temporelle du bruit. Que constate-t-on ?
On constate que la représentation temporelle du signal filtré n'est pas correcte au début et à la fin de l'intervalle de temps. On s'intéresse à la partie du signal qui reproduit correctement le bruit.
[16]
Expliquer la ligne sigma_bruit = bruit[N//4:N-N//4].std().
[17]
Faire des mesures du rapport signal sur bruit (en décibel) pour une sinusoïde de fréquence d'environ 1000 Hz et pour les amplitudes A=1,0 V, A=100 mV et A=10 mV. Relever aussi
le rapport signal sur bruit théorique pour le bruit de quantification. Reporter ces valeurs dans un tableau. Refaire ces mesures pour une fréquence d'environ 10 kHz.
[18]
Conclusion : le bruit observé sur le signal numérisé est-il du bruit de quantification ?
Le filtrage du signal pour extraire le bruit peut aussi être fait dans le domaine temporel, au moyen d'un filtre de convolution. Cette méthode est présentée en annexe.
Lorsque le rapport A/Um est trop faible, le rapport signal sur bruit est trop faible. Pour l'augmenter, il faut augmenter l'amplitude du signal avant sa numérisation, au moyen d'un amplificateur de tension.
Pour réaliser un amplificateur de tension, on utilise un amplificateur linéaire intégré (ALI). Il s'agit d'un circuit intégré qui fonctionne avec une alimentation. Il comporte 5 bornes :
Le circuit interne de l'ALI TL081 est donné en annexe. Il comporte une quinzaine de transistors et quelques résistances.
Voici le schéma d'un ALI :
Figure pleine pageLa tension de sortie est comprise entre Vcc- et Vcc+. En conséquence, si l'on veut que la tension de sortie puisse prendre des valeurs négatives par rapport à la masse, la tension d'alimentation Vcc- doit être négative par rapport à la masse. On doit donc utiliser une alimentation double, par exemple une alimentation -15/0/+15 V. La borne -15 V de l'alimentation est connectée à la borne Vcc- de l'ALI, la borne +15 V à la borne Vcc+ et la borne 0 à la masse du circuit.
L'ALI est un amplificateur différentiel : la tension de sortie (par rapport à la masse) est égale à la différence des tensions entre IN+ et IN- multipliée par un gain. Le gain de l'ALI est très élevé (de l'ordre de 100 000) car l'ALI est conçu pour être utilisé avec une rétroaction. Par ailleurs, l'ALI se comporte comme un filtre passe-bas, c'est-à-dire que son gain diminue lorsque la fréquence augmente. Pour définir le gain de L'ALI, on introduit les tensions complexes en régime sinusoïdal : la tension de sortie, la tension de l'entrée inverseuse et celle de l'entrée non-inverseuse. Ces trois tensions sont des différences de potentiel par rapport à la masse. Il faut bien sûr que la masse soit à un potentiel déterminé par rapport aux tensions d'alimentation. L'ALI est caractérisé par la relation linéaire suivante :
μ est le gain à fréquence nulle, dont la valeur est de l'ordre de 105. La fréquence de coupure fc est de l'ordre de 10 Hz. Cette relation est valable lorsque l'ALI fonctionne en régime linéaire. Il peut arriver que l'ALI soit en régime non linéaire : dans ce cas, la tension de sortie est égale soit à Vcc+ (saturation positive), soit à Vcc- (saturation négative). En réalité, la tension de saturation est souvent légèrement inférieure en valeur absolue à la tension d'alimentation (d'environ 0,7 V). Dans le cas de l'amplification, la saturation devra être évitée et l'ALI devra fonctionner en régime linéaire.
L'ALI ne peut être utilisé en boucle ouverte car son gain est beaucoup trop grand et sa fréquence de coupure beaucoup trop faible. On doit lui ajouter une rétroaction. Voici le circuit amplificateur que nous allons utiliser :
Figure pleine pageCe circuit comporte une rétroaction de la sortie de l'ALI vers l'entrée IN-. Cette rétroaction est négative, ce qui est une condition nécessaire pour que l'ALI fonctionne bien en régime linéaire et que la relation soit vérifiée.
Les entrées IN- et IN+ de l'ALI fonctionnent avec des courants extrêmement faibles (micro ou nano ampères), en général négligeables devant les autres courants du circuit. Le courant qui traverse la résistance R1 (d'intensité ) traverse donc aussi la résistance R2. On a les relations suivantes :
Au moyen de ces trois relations et de la relation , on obtient :
Le rapport est inférieur à 1000 et . Lorsque f=0 on a donc :
Si R2>R1, ce circuit réalise bien une amplification de la tension. Cet amplificateur est qualifié d'inverseur car il introduit, en plus de l'amplification, un changement de signe du signal. La fonction de transfert est celle d'un filtre passe-bas du premier ordre (ce qui prouve la stabilité du système), dont la fréquence de coupure est :
Le gain dans la bande passante est :
[19]
Si le gain G0 est égal à 10, quelle est la fréquence de coupure ? Même question pour un gain de 100. Quelle relation simple existe-t-il
entre le gain et la largeur de la bande passante ?
Remarque : le gain dans la bande passante peut être obtenu rapidement à l'aide du modèle d'ALI idéal. Dans ce modèle, le gain μ est considéré comme infini donc, d'après la relation , le fonctionnement de l'ALI en régime linéaire suppose que . L'utilisation de cette relation et des trois relations écrites plus haut permet de retrouver rapidement la relation . Cependant, ce modèle d'ALI idéal ne permet pas d'étudier la stabilité de l'amplificateur ni de trouver sa bande passante. La stabilité est nécessaire pour que l'ALI fonctionne effectivement en régime linéaire (et non en saturation). D'une manière générale, la présence d'une rétroaction négative et l'absence de rétroaction positive (comme dans le circuit étudié ici) garantit la stabilité du système.
Pour un ALI de faible puissance, comme celui que nous allons utiliser, le courant de sortie ne peut dépasser environ 20 mA. Pour comparaison, le courant de sortie d'un générateur de signaux peut aller jusqu'à environ 200 mA sur les générateurs de laboratoire courants. En revanche, le montage amplificateur présenté ci-dessus présente une impédance de sortie extrêmement faible (très inférieure à 1 Ω), à comparer à la résistance de sortie de 50 Ω du générateur.
La référence de l'ALI utilisé est TL081 ou bien A741. Le premier est intéressant lorsqu'on cherche des courants d'entrée plus faibles mais le second convient aussi bien pour la réalisation de cet amplificateur. Dans les deux cas, l'ALI se présente sous la forme d'un circuit intégré de type DIP à 8 broches, dont voici le brochage :
Figure pleine pageLa borne 4 (Vcc-) doit être reliée à la borne négative de l'alimentation, la borne 7 (Vcc+) doit être reliée à la borne positive de l'alimentation. Attention : le non respect de la polarité de l'alimentation entraîne la destruction de l'ALI.
La borne 2 est IN-, la borne 3 est IN+ et la borne 6 est la sortie (OUT). La borne de tension nulle de l'alimentation double (-15/0/+15 V) n'est pas reliée à l'ALI mais elle doit être bien sûr reliée au circuit, en particulier à la masse du générateur de signaux.
[20] Réaliser l'amplificateur sur la plaque d'essai, au moyen des fils fournis, de la résistance R1=10 kΩ et de la résistance R2=100 kΩ.
[21] Tester le fonctionnement avec l'oscilloscope.
[22]
Relever le gain dans la bande passante et la fréquence de coupure. Ces valeurs sont-elles conformes aux valeurs théoriques ?
[23]
Quelle est la tension d'entrée maximale qui permet de maintenir le fonctionnement linéaire ?
[24]
Brancher l'entrée EA0 de la carte Sysam sur la sortie de l'amplificateur. Pour un signal sinusoïdal d'amplitude 100 mV et de fréquence 1000 Hz,
obtenir le spectre. Comparer le spectre du signal numérisé en sortie du générateur (spectre 1) avec celui numérisé en sortie de l'amplificateur (spectre 2). Conclure sur l'intérêt de l'amplificateur pour
augmenter le rapport signal sur bruit.
[25]
La comparaison des spectres 1 et 2 permet-elle de vérifier le fonctionnement parfaitement linéaire de l'amplificateur ?
[26]
Comparer le spectre 2 avec celui d'une sinusoïde d'amplitude 1 V numérisée directement en sortie du générateur. Quelle conclusion peut-on en tirer ?
Afin de déterminer la résistance de sortie de l'amplificateur, on place une résistance en sortie, appelée résistance de charge et notée Rc :
Figure pleine pageSoit Is l'intensité du courant qui sort de l'ALI. L'intensité du courant dans la résistance de charge est Ic=Is+I. Si la résistance de charge est inférieure à 1000 Ω, elle est au moins 100 fois plus petite que R2, ce qui fait que I est négligeable devant Ic. On a donc . L'intensité Is ne peut dépasser environ 20 mA.
[27]
Si la tension d'entrée Ve est sinusoïdale et d'amplitude A=10 mV, quelle valeur Rc doit-elle avoir au minimum
pour que Is reste toujours inférieure à 20 mA ?
[28]
Placer en sortie une résistance variable (boîte AOIP de 10 Ω). Vérifier le résultat précédent.
[29]
Faire varier Rc tout en maintenant le courant de sortie en dessous de sa limite. Que constate-t-on sur la tension Vs ?
[30]
Refaire la même expérience en plaçant Rc directement en sortie du générateur, avec une tension sinusoïdale d'amplitude 100 mV. Que peut-on en conclure sur la résistance de sortie du montage amplificateur ?
Voici le code qui permet de filtrer un signal sinusoïdal avec un filtre de convolution coupe-bande permettant d'éliminer la partie sinusoïdale du signal, afin d'extraire le bruit.
P=500 # 2P+1 = ordre du filtre c1=f*0.94/fe # fréquence de coupure basse c2=f*1.06/fe # fréquence de coupure haute b = scipy.signal.firwin(numtaps=2*P+1,cutoff=[c1,c2],pass_zero=True,window='hann',nyq=0.5) # calcul des coefficients y = scipy.signal.convolve(u,b,mode='same') # filtrage par convolution sigma_bruit = y[N//4:N-N//4].std() rdB = 20*np.log10(u.std()/sigma_bruit) print('rdB exp =%f'%rdB) plt.figure() plt.plot(t,y) plt.xlabel('t (s)') plt.ylabel('bruit (V)') plt.grid()
Le filtrage par convolution (domaine temporel) donne les mêmes résultats que le filtrage direct de la TFD (domaine fréquentiel). Les effets de bords (au début et à la fin de l'intervalle de temps) sont similaires. Le filtrage direct de la TFD est cependant plus facile à réaliser car on voit immédiatement l'effet sur le spectre. Si le signal à filtrer est périodique, avec plusieurs harmoniques à éliminer, le filtrage direct de la TFD est de loin la méthode la plus simple car il faudrait de toute façon utiliser la FFT pour calculer la réponse impulsionnelle du filtre de convolution (à partir de la réponse fréquentielle du filtre).
Les bornes du montages doivent être reliées aux fiches bananes femelles par des fils, en respectant les couleurs (couleur du fil = couleur de la fiche):
On branchera aussi un condensateur entre Vcc+ et GND et un condensateur entre Vcc- et GND. Il s'agit de condensateurs de filtrage, qui ont pour fonction d'éliminer d'éventuelles perturbations des tensions d'alimentation aux bornes de l'ALI.