Outils pour utilisateurs

Outils du site


Action disabled: diff
tptns2017

Ceci est une ancienne révision du document !


C ours architecture pour le TNS cours_Archi_TNS_intro5_6ppf.pdf

TP1 Codage du calcul de l'équation de récurrence

Principes

La démarche de développement est composée de deux grandes étapes. La première étape consiste en l'implémentation d'un filtre logiciel qui permet de vérifier si le filtre possède bien les propriétés temporelles et/ou fréquentielles souhaitées. Cette étape réalisée lors des séances de TNS est composée de la façon suivante:

  1. définition du filtre (coefficients stockés dans des tableaux, initialisation d'un sFiltre avec initFiltre() )
  2. définition des signaux (création de tableaux pour l'impulsion, l'échelon, sinus…) pour une durée fixée
  3. calcul de la réponse du filtre (avec calculReponseFiltre() )
  4. affichage des signaux d'entrée et de sortie
  5. affichage éventuel de la fonction de transfert
  6. fin du programme

La seconde étape consiste en la réalisation concrète du filtre en tenant compte du matériel utilisé, le programme devant assurer les tâches suivantes:

  1. définition du filtre
  2. acquisition d'un échantillon ek en effectuant une conversion analogique→numérique
  3. calcul de sk en appliquant l'équation de récurrence sur cet échantillon
  4. restituer sk en effectuant une conversion numérique→analogique
  5. recommencer indéfiniment en 2. jusqu'à l'arrêt du système !

Récupération du projet Qt de départ

homepages.laas.fr_bvandepo_files_iut_tp_tns_todo.jpg Pour récupérez le fichier zip du projet la première fois, ouvrir une console (alt+F2 et taper lxterm) puis taper dedans:

cd /mnt/etu/s4en/..... à compléter pour aller dans votre dossier étudiant, en pressant 2 fois la touche TAB

puis ENSUITE SEULEMENT copier coller (sélectionner le code qui suit puis clic sur le bouton central de la souris dans le terminal) :

wget http://homepages.laas.fr/bvandepo/files/iut/tp_tns/TP_ARCHI_TNS_2017.zip
unzip TP_ARCHI_TNS_2017.zip
cd TP_ARCHI_TNS
qtcreator TP_ARCHI_TNS.pro &
echo "C est bon !"

à l'ouverture de qtcreator, cliquer sur “Configurer le projet”

Description de la structure du projet

  1. filtre.h: contient les définitions de la structure de filtres (coefficients…), les prototypes des fonctions de filtrage et d'évaluation du filtre.
  2. filtre.cpp: contient l'implémentation des fonctions de filtrage et d'évaluation du filtre. C'est principalement ce fichier que vous devrez compléter.
  3. tparchi1.cpp: contient la fonction de test void code_tparchi1(void) qui appelle vos fonctions après avoir créé des échantillons pour les signaux d'entrée et trace les réponses impulsionnelle, indicielle et le module de la réponse fréquentielle.
  4. prototype_tp.h: contient les prototypes des fonctions de test
  5. main.cpp: contient le programme principal, qui appelle la fonction de test.
  6. mainwindow.h et mainwindow.cpp: contiennent la classe qui permet l'affichage de la fenêtre principale de l'application
  7. qcustomplot.h et qcustomplot.cpp: contiennent les classes qui permettent l'affichage de tracé graphique

Implémentation des fonctions pour un exemple simple

Jusqu'à ce TP, vous avez utilisé la fonction void calculReponseFiltre(sFiltre * pFiltre, double * ek, double * sk, int nbPts) pour appliquer le calcul de la réponse d'un filtre. Pour réaliser un filtre capable de traiter des échantillons en ligne, il faut que le processeur effectue le calcul de l'équation de récurrence échantillon par échantillon. La première partie du TP consiste donc à implémenter une fonction double filtreUnEchantillon(double ek) qui réalise le calcul de cette équation de récurrence.

Afin de pouvoir tester cette fonction, la fonction void calculReponseFiltreEnLigne(sFiltre * pFiltre, double * ek, double * sk, int nbPts):

  1. appelle la fonction initFiltreUnEchantillon(pFiltre)
  2. traite tous les échantillons du tableau ek (pour $k\in[0,nbEch-1]$) à l'aide de la fonction double filtreUnEchantillon(double ek) et range le résultat dans le tableau sk
void calculReponseFiltreEnLigne(sFiltre * pFiltre, double * ek, double * sk, int nbPts)
{
   initFiltreUnEchantillon(pFiltre);
    for (int k=0; k < nbPts; k++)    {
        sk[k] = filtreUnEchantillon(ek[k]);
    }
}

homepages.laas.fr_bvandepo_files_iut_tp_tns_todo.jpg Implémenter la fonction filtreUnEchantillon pour qu'elle retourne la valeur de l'échantillon e_k multiplié par 3. Compiler et exécuter le programme. Interpréter les réponses affichées. Quelle est l'équation correspondant à ce filtre.

Codage de l'équation de récurrence pour un filtre à réponse impulsionnelle finie (RIF)

On cherche maintenant à implémenter l'équation: $s_k=\sum_{i=0}^{N}b_i.e_{k-i}$.

Afin de faciliter la transition vers les filtres RII, on supposera que les $e_k$ sont équivalents aux $v_k$ et l'équation à coder sera donc: $s_k=\sum_{i=0}^{N}b_i.v_{k-i}$.

Pour calculer $s_k$, il est nécessaire de disposer des valeurs des coefficients du filtres $b_i$ et des échantillons d'entrée courant et précédents, stockés dans un buffer circulaire tel que présenté dans le cours.

La figure suivante illustre le fonctionnement d'un tel buffer de taille 6:

Le tableau memoireVk est utilisé pour stocker les échantillons. La variable globale indice_ecr est utilisée pour indiquer le numéro (indice d'écriture) de la case dans laquelle ranger l'échantillon le plus récent.

homepages.laas.fr_bvandepo_files_iut_tp_tns_todo.jpg Compléter la fonction double filtreUnEchantillon(double ek) pour qu'elle:

  1. range l'échantillon $e_k$ au bon endroit dans le buffer circulaire.
  2. calcule la valeur de $s_k$ en remontant les échantillons à partir de $e_k$. Pour cela, vous utiliserez une variable locale servant d'indice de lecture. Les coefficients du filtre sont au nombre de NB_COEFF_B et leurs valeurs se trouvent dans le tableau b.
  3. prépare l'itération suivante en mettant à jour l'indice d'écriture.

Dans le codage, vous tiendrez compte du fait que le tableau memoireVk est circulaire et de taille MEMORYSIZE éléments pour la mise à jour des indices de lecture et d'écriture.

homepages.laas.fr_bvandepo_files_iut_tp_tns_todo.jpg Tester votre fonction à l'aide du filtre dont les coefficients sont définis dans le tableau coeffB du fichier tparchi1.cpp.

homepages.laas.fr_bvandepo_files_iut_tp_tns_todo.jpg Vérifier l'exactitude des réponses impulsionnelles et indicielles pour le filtre fourni jusque $k=6$.

homepages.laas.fr_bvandepo_files_iut_tp_tns_bonus.jpg Appliquer ce filtre à deux sinusoïdes de fréquence 50 Hz et 500 Hz. Expliquez le résultat en vous aidant du module de la fonction de transfert.

Codage de l'équation de récurrence pour un filtre à réponse impulsionnelle infinie (RII)

On cherche maintenant à implémenter l'équation: $s_k=\sum_{i=0}^{N}b_i.e_{k-i}-\sum_{j=1}^{M}a_j.s_{k-j}$.

Pour cela, nous utiliserons la forme vue en cours: $s_k=\sum_{i=0}^{N}b_i.v_{k-i}$ faisant intervenir les termes $v_k$. Pour l'échantillon $k$, il est nécessaire d'évaluer la valeur de $v_k=e_k-\sum_{j=1}^{M}a_j.v_{k-j}$ qui utilise les valeurs des $v_k$ précédemment calculés.

homepages.laas.fr_bvandepo_files_iut_tp_tns_todo.jpg Compléter la fonction double filtreUnEchantillon(double ek) pour qu'elle permette de gérer ce type de filtre. Pour cela, vous y ajouterez avant le calcul de $s_k$:

  1. le calcul de $v_k$ à partir des valeurs précédentes de $v_k$ stockées dans le tableau memoireVk. Vous utiliserez le même principe que pour le calcul de $s_k$ réalisé pour le filtre RIF. Les coefficients du filtre à utiliser sont au nombre de NB_COEFF_A et sont situés dans le tableau a.
  2. l'enregistrement du $v_k$ calculé dans le tableau memoireVk, qui remplacera l'enregistrement de $e_k$.

homepages.laas.fr_bvandepo_files_iut_tp_tns_todo.jpg Tester l'implémentation de la fonction de calcul sur le filtre:

homepages.laas.fr_bvandepo_files_iut_tp_tns_todo.jpg Déclarer les variables nécessaires pour ajouter un second filtre d'équation de récurrence: $ s_k=e_k+0.3s_{k-7} $

homepages.laas.fr_bvandepo_files_iut_tp_tns_todo.jpg Calculer les réponses impulsionnelles et indicielles en utilisant la fonction calculReponseFiltreEnLigne et ajouter le code permettant de les afficher. Superposer l'affichage du module de la fonction de transfert de ce filtre à l'affichage précédent.

tptns2017.1489532526.txt.gz · Dernière modification : 2017/03/15 00:02 de hgilliard