return ekQuant;} /*! * \brief SimuDAC simule un DAC avec entrée non signée */ double SimuDAC ( double M, double Vmin, double Vmax, int nbBits) {
double q = (Vmax-Vmin)/(pow(2,nbBits)-1); return (Vmin + q*( (unsigned int)M % (1<<nbBits)) );} void test_conv(void) {
const double vmin = -3.3; const double vmax = 3.3; const int nbbits = 4; const int nbpts = 1000;
double ve[nbpts], caractADC[nbpts] ; double M[(int) pow(2,nbbits)], caractDAC[(int) pow(2,nbbits)];
for(int i=0;i<nbpts;i++) { ve[i]=vmin-1+(vmax+1-vmin+1)/(nbpts-1)*i; caractADC[i]=SimuADC(ve[i],vmin,vmax,nbbits); } for(int i=0;i<pow(2,nbbits);i++) { M[i]=i-5; caractDAC[i]=SimuDAC(i-5,vmin,vmax,nbbits); }
// Définissez les données à tracer DataATracer dataADC,dataDAC;
initDataATracer( &dataADC ,nbpts,ve,caractADC); initDataATracer( &dataDAC ,pow(2,nbbits),M,caractDAC);
// Créez une ou plusieurs fenêtres MainWindow *w1 = new MainWindow; MainWindow *w2 = new MainWindow;
styleTrace style1 = {Qt::red,QCPGraph::lsNone,QCPScatterStyle::ssCross}, style2 = {Qt::blue,QCPGraph::lsLine,QCPScatterStyle::ssNone};
w1->plot(dataADC,style2); w1->setLegend(0,"Ve","M"); w1->setWindowTitle("caractéristique E/S ADC"); w1->show();
w2->plot(dataDAC,style1); w2->setLegend(0,"M","Vs"); w2->setWindowTitle("caractéristique E/S DAC"); w2->show();} </file> === Visualisation de signaux quantifiés (45' max) ===
- Créez une nouvelle fonction. On souhaite visualiser sur une même fenêtre mais sur 2 axes différents (car les échelles sont différentes) l'impulsion et l'impulsion quantifiée pour 7 échantillons. Vous devez donc utiliser simuADC() pour quantifier échantillon par échantillon tout le signal impulsion et stocker le résultat dans un tableau impQuant. Simulez un CAN ayant une plage de conversion de 0/3,3V sur 4 bits (déclarez vmin, vmax, nbbits comme constantes globales).
- Afficher alors les deux signaux demandés.
- Superposer ensuite l'échelon et l'échelon quantifié.
- Vous pouvez constater que l'impulsion et l'échelon sont à la limite de la dynamique du CAN. Comme lors de l'utilisation de montage à AOp (souvenez-vous du télémètre !), il est préférable de centrer les signaux d'entrée sur la tension plutôt que sur 0V. Modifiez les signaux impulsion et echelon en conséquence. Quelle est la nouvelle valeur de repos des signaux quantifiés ?
- Générez un signal sinusoïdal d'amplitude 1,5V, de fréquence 1 kHz correctement centré. Dans une nouvelle fenêtre, visualisez ce signal, ce signal quantifié sur 4 bits et ce signal quantifié sur 8 bits (dynamique 0/3,3V).
- Faites valider votre travail.
- Reprenez la fonction tparchi1() et intégrez dans la fonction calculReponseFiltreEnLigne l'appel de ces 2 fonctions (dynamique 0/3,3V , 12 bits) pour les utiliser avec la fonction filtreUnEchantillon:
- appeler simuADC et stocker sa valeur de retour dans une variable du bon type.
- appeler filtreUnEchantillon en lui fournissant en paramètre la variable précédemment calculée.
- appeler simuDAC en lui fournissant la valeur fournie par filtreUnEchantillon et ranger la valeur de sortie de simuDAC dans le tableau sk.
- Vérifier le bon fonctionnement des 2 filtres du TP1. Expliquez l'amplitude de la réponse impulsionnelle du filtre RIF.
- Tester à nouveau le fonctionnement de calculReponseFiltreEnLigne() sur le filtre passe-bande de paramètres H0=2, f0=1000, Q=0,7. Il a été numérisé par transformée bilinéaire avec Fech=48000 : b[3]={0.1703 , 0.0000 , -0.1703}; a[3]={1.0000 , -1.8140 , 0.8297};
- Que constatez-vous ?
- Ce phénomène est provoqué par l'offset numérique de ek_quant (sa valeur de repos est différente de 0). Modifiez filtreUnEchantillon() pour respecter le schéma de la P11 du cours.
- Vérifiez que le fonctionnement du filtre est maintenant correct.
- Vérifiez que les deux premiers filtres fonctionnent toujours
- Définissez le nouveau filtre
- Tracez sa réponse indicielle. Quel problème constatez-vous ?
- Pour corriger ce problème, vous devez saturer le résultat du calcul de l'équation de récurrence avant de le retourner (donc avant la fin de filtreUnEchantillon())
- Testez le bon fonctionnement de l'ensemble sur la sinusoïde