Outils pour utilisateurs

Outils du site


td1_tns

Ceci est une ancienne révision du document !


TD 1 Architecture pour le TNS : Dimensionnement

L'objectif de ce TD et de savoir dimensionner les calculs (opérandes, résultats intermédiaires et finaux) pour l'implémentation d'équation de récurrence de filtres RIF en virgule fixes. Il est la suite du TD papier: TDcalculVfixeV2.doc

Nous souhaitons progressivement permettre l'évolution du filtre réalisé au TP1 pour le porter sur microcontrôleur avec des calculs en virgules fixes. Pour cela, nous allons “simuler” numériquement le fonctionnement des périphériques de conversion à l'aide de fonctions. Ensuite, nous coderons (quantifierons) les coefficients du filtre en virgule fixe et listerons les opérations nécessaires pour pouvoir effectuer les calculs sur ces nombres.

Quantification des entrées analogiques

Déterminer les types adéquats pour les paramètres d'entrée et de retour de la fonction simuADC. Cette fonction prend en entrée:

  1. une valeur de tension analogique
  2. un facteur multiplicatif
  3. un offset
  4. une valeur maximale admissible pour la sortie
  5. une valeur minimale admissible pour la sortie

La fonction retourne:

  1. la valeur numérique convertie.
  1. Déterminer les valeurs min et max pour un ADC sur nbBitsQuantADC bits fournissant une valeur au format UQnbBitsQuantADC.0
  2. Déterminer les valeurs facteur et offset pour une correspondance de la valeur 0 pour une entrée à 0 V et $2^{nbBitsQuantADC}$ pour une tension de 3.3V.

Génération des valeurs de sorties analogiques

Déterminer les types adéquats pour les paramètres d'entrée et de retour de la fonction simuDAC. Cette fonction prend en entrée un valeur numérique correspondant à la sortie du filtre pour un échantillon, un facteur et un offset et retourne la valeur numérique convertie correspondant à une valeur analogique.

  1. Déterminer les valeurs d'échantillons d'entrée min et max pour un DAC sur nbBitsQuantDAC bits au format UQnbBitsQuantDAC.0. Déterminer les valeurs des paramètres min et max si le DAC est capable de générer des tensions entre 0 et 3.3V.
  2. Déterminer les valeurs facteur et offset pour une correspondance de la valeur 0 pour une sortie à 0 V et $2^{nbBitsQuantDAC}$ pour une tension de 3.3V.

Quantification des coefficients du filtre

Les coefficients du filtre sont stockés dans des tableaux de valeur codés en double. Nous souhaitons maintenant les approximer par codage en virgule fixe au format Q0.15.

Déterminer les types adéquats pour les paramètres d'entrée/sortie de la fonction quantCoeffsShortInt. Cette fonction prend en entrée:

  1. un tableau tabDouble des coefficients à convertir.
  2. un tableau tabInt pour ranger les coefficients convertis en virgule fixe.
  3. un tableau tabDoubleQuant pour ranger les coefficients convertis en virgule fixe exprimés en virgule flottante. Ce tableau permettra de comparer les valeurs flottantes avant et après conversion.
  4. un nombre de coefficients nbCoeffs indiquant le nombre de case du tableau tabDouble à traiter.
  5. une valeur nbBitsFractionnairenbCoeffs indiquant le nombre de bits utilisés pour la partie fractionnaires des nombres en virgule fixe.

Coder en C cette fonctions. On utilisera l'arrondi plutôt que la troncature pour le calcul.

Le code ci dessous devra être intégré dans la fonction quantCoeffsShortInt pour permettre la vérification des calculs:

simu3.cpp
 tabDoubleQuant[i]=tabInt[i] / (double)(1<<nbBitsFractionnaire);
 printf("coefficient %d valant %lf codé avec %d bits pour la partie fractionnaire: %d soit %lf\n",
               i,tabDouble[i],nbBitsFractionnaire,tabInt[i],tabDoubleQuant[i]
               ); fflush(stdout);      

Opérations de calcul en virgule fixe

Pour le RIF, le tableau memoireVk contient les échantillons d'entrée $e_k$, interprété au format UQn.0.

On considère que les coefficients du numérateur de la fonction de transfert (b[i]) sont codés en Q0.15.

On utilisera ici un entier 32 bits pour stocker le résultat de $s_k=\sum_{i=0}^{N}b_i.e_{k-i}$

Indiquer le format de $s_k$ par application du calcul sur les entiers codant les nombres en virgule fixe.

On souhaite un résultat entier au format UQN.0 pour piloter le DAC. Avant l'ajout d'offset numérique sur la sortie dû au référencement par rapport au zéro, on utilise donc le codage au format Q(N-1).0. Quelle opération doit on effectuer pour convertir le résultat de $s_k$ à ce format?

En déduire l’intérêt d'avoir effectué les calculs intermédiaires sur 32 bits pour obtenir un résultat sur 16 bits.

Si la sortie de la fonction d'application du calcul doit être utilisée pour piloter un DAC 10 bits, indiquer les opérations à effectuer pour s'assurer que le résultat obtenu après conversion puisse être codé au format UQ10.0 (et donc Q(N-1).0 avant ajout d'offset numérique).

td1_tns.1457524295.txt.gz · Dernière modification : 2016/03/09 12:51 de bvandepo