4-8-1. Caractéristiques des variables MUSTIG
4-8-2. Définir une variable
Définir une variable à partir du module d'entrée scalaire Valeur
Définir une variable en utilisant les modules de définition de variables
Utiliser une variable précédemment définie
Définir une variable dynamique
4-8-3. Changer les attributs d'une variable
Changer le pas d'échantillonage d'un signal
Changer la longueur d'une variable
Changer les attributs d'une variable dynamiquement
Changer les attributs Demi et Dual d'un signal
4-8-4. Manipuler les variables
Sous-échantillonnage et sur-échantillonnage d'un signal
Extraire une valeur d'un vecteur
Changer une valeur dans un vecteur
Convertir indices en dates, ou dates en indices
Séparer un signal en un groupe de sous signaux
Rassembler un groupe de sous signaux en un signal seul
Démultiplexer un signal en plusieurs sous signaux
Multiplexer des signaux en un seul signal
Étendre la dimension d'un signal
Obtenir une information générale sur les signaux portés par un fil
4-8-4. Transmettre l'information de variable à une boîte en paquet
Faire une boucle sur une variable existante
Faire une boucle sur une nouvelle variable
Comme on a vu dans le chapitre 2, chaque fil du graphe porte un signal qui, dans le cas le plus fréquent où ce n'est pas un scalaire seul, dépend d'une ou plusieurs variables. Le nom de la variable traitée par un module ou une macro est indiqué sur sa face avant. Il peut être édité et peut être changé en utilisant Majuscule+Ctrl+Cli pour traiter une autre variable.
4-8-1. Caractéristiques des variables MUSTIG
Chaque variable (aussi appelée une dimension) est définie par sept paramètres ou attributs qui peuvent être changés en utilisant individuellement les modules de la section Changements de variables de la Bibliothèque :
Le nom |
Apparaît dans le module d'entrée Valeur ou sur la face avant de macros et modules tout de suite après le signe ' / '. Ex.: /t dénote une variable nommée t (nom par défaut pour beaucoup de modules). Le nom d'une variable peut être édité et peut être changé (Majuscule+Ctrl+Clic). |
La longueur |
Le nombre d'échantillons du signal selon la dimension (pas de défaut, doit être mis explicitement par l'utilisateur). Se rappeler : l'index du premier échantillon le long d'une dimension est 0, et non1. Une valeur particulière est -1: le nombre d'échantillons est infini et les simulations seront faites jusqu'à ce que l'utilisateur clique dans la fenêtre Mustig pour l'arrêter. Attention à ne pas utiliser les macros de visualisation prévues pour des signaux finis pour regarder des signaux infinis, sinon la simulation ne pourrait pas être arrêtée ! Utilisez à la place des macros de la section Sorties / Temps réel de la Bibliothèque. |
L'origine |
Vraie date du premier échantillon (index=0). La valeur par défaut est 0. |
Le pas |
Le taux d'échantillonnage T en secondes (la valeur par défaut est 1 s), c.-à-d. intervalle du temps entre deux échantillons consécutifs. T=1/Fe où Fe est la fréquence d'échantillonage. Quand une Transformée de Fourier est faite, les caractéristiques de la variable de la fréquence produite sont fixées d'après le pas d'échantillonage, afin que le domaine de fréquence s'étende de 0 Hz à Fe/2 Hz . |
Dual |
La valeur par défaut est 0. Est changée en 1 si une Transformée de Fourier est faite sur le signal. |
Demi |
La valeur par défaut est 0. Est changée en 1 si le signal est constitué des N/2+1 premiers points d'un signal complexe de N échantillons avec symétrie Hermitienne (par exemple si le signal est issu d'une Transformée de Fourier d'un signal réel). |
L'Origine duale |
Fixe l'origine de la variable dans le domaine de la fréquence pour un signal du domaine temps, et inversement. La valeur par défaut est 0. |
Attention : Les indices de variables commencent à 0 comme dans le langage C.
Les Attributs qui n'ont pas de valeur par défaut (c.-à-d. nom et longueur de la dimension) doivent être définis quand on commence une nouvelle branche du graphe Mustig (voir Définir une variable).
Si un module exige au moins deux signaux à l'entrée, et si chacun de ces signaux dépend d'une variable avec le même nom, les caractéristiques des deux variables doivent être identiques.
Les variables peuvent être définies par l'utilisateur explicitement, ou automatiquement dérivées des caractéristiques d'une autre variable dans le graphe.
Définir une variable de la Valeur module de l'entrée scalaire
Bien que le module Valeur dans les Entrées de la Bibliothèque puisse entrer des valeurs scalaires, il peut être aussi utilisé pour définir commodément de petits vecteurs.
Pour cela, entrez les échantillons consécutifs le long de la dimension que vous voulez créer, en les séparant par un retour chariot, puis entrez le nom que vous souhaitez donner à cette nouvelle dimension sur la dernière ligne, juste après un signe ' / ' :
Dans l'exemple précédent, un vecteur est défini : il contient quatre éléments et la variable créée est nommée n. Le pas de l'échantillonage par défaut est 1 seconde, l'origine par défaut est 0 comme vu sur le graphe.
N.B. : Ce vecteur est regardé en utilisant la macro Visu/t standard : nous avons juste édité et changé le nom de la variable à traiter sur sa face avant (Majuscule+Ctrl+Clic), déplacé la fenêtre graphique sur la face avant pour commodité (voir Créer des images), et changé la ligne par défaut en une ligne rouge épaisse.
Définir une variable en utilisant les modules de définition de variables
Vous pouvez créer une variable comportant un nombre d'échantillons quelconque en utilisant l'un des deux modules suivants :
|
Crée une dimension selon une variable nommée t et contenant 256 échantillons. Le nom et le nombre d'échantillons peuvent être édités et changés (Majuscule+Ctrl+Clic). |
|
Fait exactement la même chose : le module N/t crée une variable nommée t qui contient le nombre d'échantillons sur la borne de l'entrée. Cela permet de créer une variable à partir d'un nombre d'échantillons dérivé d'un calcul. |
|
Permet de créer une variable nommée t. Tous les attributs (nombre d'échantillons, origine, pas d'échantillonnage, etc) sont accessibles en cliquant deux fois sur la macro :
|
Utiliser une variable précédemment définie
Tout fil dans le graphe MUSTIG contient l'information entière au sujet des variables qu'il porte. Donc, il est possible de créer une variable ayant les mêmes caractéristiques qu'une variable précédemment définie en connectant simplement un fil à un emplacement où l'information est présente.
Cette technique peut être utilisée pour construire plusieurs signaux sur la même variable. Vous êtes alors sûr que vous pouvez ajouter, multiplier, etc. les signaux, car ils ont exactement les mêmes caractéristiques.
Exemple : Supposons que vous voulez ajouter un bruit et une sinusoïde. Vous pourriez construire séparément les deux signaux comme dans le graphe ci-dessous :
Cependant, si vous changez l'une des caractéristiques de l'un des signaux (par exemple le pas d'échantillonage), vous devez exécuter les mêmes changements sur l'autre signal, autrement vous ne pourrez pas les ajouter.
Donc, c'est beaucoup plus efficace de récupérer toute l'information sur la variable t directement sur un fil pour construire les signaux :
ou
Vous pouvez aussi récupérer l'information sur une variable et changer quelques caractéristiques avant de l'utiliser :
Dans l'exemple précédent, deux signaux contenant 100 échantillons chacun avec une fréquence d'échantillonage de 1Hz par défaut est créé. Une sinusoïde est construite sur ce t variable (sommet). Dans la branche inférieure du graphe le taux de l'échantillonage est changé dans 100Hz avant de construire la sinusoïde avec le même nombre d'échantillons.
Définir une variable dynamique
Une variable est dite dynamique quand la longueur du signal selon cette variable dépend d'une autre variable. Les variables dynamiques peuvent être définies en entrant un vecteur de longueurs dans un module Partie ou Partie_décalée (voir Changer les attributs d'une variable dynamiquement).
Elles peuvent être aussi définies en utilisant directement le module Var_dyna/t dans la section Changements de Variables de la Bibliothèque :
Dans l'exemple précédent une variable dynamique nommée t est créée : sa longueur dépend d'une autre variable nommée x. Après le module Var_dyna/t, une sinusoïde de fréquence 0.1Hz est construite sur la variable dynamique créée. La sinusoïde est donc produite trois fois : une sinusoïde avec 64 échantillons, une avec seulement 32 échantillons et une avec 16 échantillons.
Noter que la macro de visualisation à deux dimensions Visu_2D_n/t/x permet de regarder des signaux portés par des variables dynamiques (la longueur des trois signaux affichés est différente). Dans l'exemple précédent, la fenêtre graphique a été glissée sur la face avant de la macro de visualisation pour créer une macro de prévisualisation (voir Créer une image). L'option Lignes composites individuelles a été choisie pour changer l'apparence des courbes individuellement.
4-8-3. Changer les attributs d'une variable
Des modules spécifiques permettent de changer les caractéristiques d'une variable (ou dimension) individuellement. Ils sont localisés dans la section Changements de Variables de la Bibliothèque.
Le module ChVar/u/v dans la section Changements de Variables de la Bibliothèque permet de changer le nom d'une variable de u à v. Vous pouvez éditer bien sûr et changer les anciens et nouveaux noms des variables.
Dans l'exemple ci-dessous une variable de 100 échantillons nommée t est créée et une sinusoïde est construite sur cette variable. Le nom de la variable est changé en tau avant de construire une autre sinusoïde selon la variable tau . Excepté leur nom, les deux variables ont les mêmes caractéristiques.
Changer le pas d'échantillonage d'un signal
Quand une variable est créée, le pas d'échantillonage par défaut est 1Hz (en supposant que cette variable dénote le temps). Vous pouvez le changer pour que vos simulations soient plus proches de la réalité. Vous pouvez faire ceci en utilisant le module Pas/t dans la section Changements de Variables de la Bibliothèque:
La valeur à l'entrée sur la borne du haut du module Pas est le nouveau pas d'échantillonage du signal, c'est-à-dire, l'intervalle (en secondes si la variable /t est le temps) entre deux échantillons consécutifs.
La fréquence de la sinusoïde est en Hertz, afin que le résultat dépende de la fréquence d'échantillonage Fe du signal : dans la figure du haut la fréquence de la sinusoïde est Fe/10, dans la figure du bas elle est seulement Fe/1000.
Noter que la macro Visu/t montre des dates sur son axe horizontal, pas des indices.
L'origine d'un signal est la date (en secondes si la variable /t est le temps) associée au premier échantillon du signal. Elle peut être changée en utilisant le module de Origine dans la section Changements de Variables de la Bibliothèque :
Changer la longueur d'une variable
Plusieurs modules existent pour changer le nombre d'échantillons selon une dimension. Ils permettent de sélectionner une partie d'un signal, ou augmenter sa longueur en ajoutant des zéros. Voir leur aide en ligne pour plus d'informations sur comment les utiliser.
|
Extrait un nombre donné d'échantillons consécutifs, à partir d'une position donnée (en échantillons). L'origine du vecteur extrait est modifiée en conséquence. Si le nombre d'échantillons extraits est plus grand que le nombre d'échantillons disponibles dans le signal, des zéros sont produits pour remplir l'espace. |
|
Comme ci-dessus, mais l'origine du vecteur est inchangée |
|
Comme dans le premier cas, mais la position (en échantillons) du premier et dernier échantillon à extraire sont données en cliquant deux fois sur la boîte. |
|
Comme ci-dessus, mais la position du premier et dernier échantillon à extraire est exprimée en secondes (si la variable traitée est le temps) au lieu d'échantillons. C'est-à-dire, la position des échantillons est dérivée du pas d'échantillonnage et de l'origine de la variable. |
Changer les attributs d'une variable dynamiquement
Les attributs d'une variable sont généralement statiques : ils ne peuvent pas dépendre d'une autre variable.
Dans l'exemple ci-dessous, un vecteur de trois éléments selon la variable /x est ajouté à un vecteur de quatre éléments selon la variable /t .
Cette opération est valide parce que les signaux ont des noms de variable différents : la sortie de l'additionneur est donc une matrice selon les variables /t et /x. Cette dernière peut être regardée comme un ensemble de trois vecteurs selon la variable /t, les indices de la variable /x dénotant le rang d'un vecteur : 0, 1 ou 2.
Puis, nous essayons de définir un pas d'échantillonage différent pour chacun des trois vecteurs en utilisant le module Pas avec trois valeurs selon la variable /x : une pour chacun des trois vecteurs.
Bien que ce graphe soit logique, le module Pas n'acceptera pas d'entrée non scalaire sur sa borne du haut, car le pas d'échantillonage d'un signal ne peut pas dépendre d'une autre variable. Si vous essayez d'afficher la matrice après le module Pas vous obtiendrez le message d'erreur suivant : Les définitions de variables doivent être statiques.
Une exception à ceci est la longueur d'un vecteur : dans quelques cas elle peut être dynamique. C'est-à-dire, la longueur d'un vecteur peut dépendre d'une autre variable. En réalité, les modules Partie et Partie_décaléeacceptent des entrées scalaires et vectorielles :
Dans l'exemple précédent, le module Partie_décalée coupe des vecteurs de longueur variable (3,1 et 2 éléments) à partir des lignes de la matrice d'entrée 3x4 . Cette sortie du module est donc un ensemble dynamique de vecteurs : la longueur d'un vecteur selon la variable /t dépend de son rang selon la variable /x .
Remarques sur les changements dynamiques de la longueur d'un signal
Changer les attributs Demi et Dual d'un signal
Vous pouvez changer les attributs dual d'un signal si nécessaire (voit les attributs de variables pour savoir ce à quoiservent les attributs Dual) :
|
Met l'attribut Dual d'une variable à la valeur entrée sur la borne du haut. |
|
Met l'attribut Demi d'une variable à la valeur entrée sur la borne du haut. |
Cependant, cela est rarement fait explicitement, car l'information sur une variable créée par une Transformée de Fourier peut être reprise généralement directement.
Exemple : Supposons que vous vouliez créer un filtre passe-bas très simpliste en sélectionnant seulement les coefficients de Fourier de basse fréquence d'un signal. Au lieu de créer le gabarit du filtre séparément comme dans le graphe ci-dessous :
C'est beaucoup plus intelligent d'extraire l'information au sujet de la variable fréquence f à partir d'un fil après la Transformée de Fourier. Vous n'avez pas à vous soucier de calculer le pas de la fréquence ni de mettre les attributs Dual et Demis à un : tous les attributs sont mis à leur valeur correcte par la Transformée de Fourier.
Le graphe correct est plus compact, plus général, et plus facile à comprendre :
Par conséquent, vous pourrez généralement éviter de changer les attributs dual d'un signal explicitement en vous reliant aux fils appropriés sur le graphe.
4-8-4. Manipuler les variables
Des modules supplémentaires sont disponible dans la section Changements de Variables de la Bibliothèque pour exécuter des opérations de base sur les variables, tels que:
Voir l'aide en ligne des modules décrits pour plus d'information sur comment ils opèrent et comment relier leurs bornes.
Sous-échantillonner ou sur-échantillonner un signal
Les modules sont disponible dans la section Changements de Variables de la Bibliothèque pour le sous - ou sur - échantillonage d'un signal. Voir leur aide en ligne pour savoir comme ils devraient être utilisés.
|
Sous - échantillonne un signal. Le facteur de sous - échantillonage est entré sur la borne du haut. Ce module exige que tout le signal d'entrée soit mémorisé. |
|
Sous-échantillonnage asynchrone : échantillonne un vecteur d'après un vecteur de conditionnement " logique ". |
|
Échantillonage asynchrone avec espacement régulier. |
|
Sur-échantillonne un signal par un facteur donné, insérant des zéros |
|
Sur-échantillonnage bloqueur |
|
Sur-échantillonnage avec interpolation linéaire entre échantillons. |
Extraire une valeur d'un vecteur
Les modules sont disponible dans la section Changements de Variables de la Bibliothèque pour extraire un échantillon donné d'un vecteur. Voir leur aide en ligne pour savoir comment ils doivent être utilisés. Se rappeler : Dans MUSTIG comme dans C, le premier élément d'un vecteur est référé par l'index 0, et non 1.
|
Extrait le premier élément selon la variable u . Le nom de la variable peut être édité et peut être changé (Majuscule+Ctrl+Clic). |
|
Extrait le dernier élément d'après la variable u . Le nom de la variable peut être édité et peut être changé (Majuscule+Ctrl+Clic). |
|
Extraits l'élément localisé à l'index entré sur la borne du haut(en échantillons). |
|
Comme ci-dessus de mais l'index de l'échantillon extrait est fixé en cliquant deux fois sur la boîte. |
Si l'index de coupe entré sur la borne du haut est plus grand que la longueur du signal, le résultat de la sortie est zéro.
Comme une seule valeur est extraite de la dimension entrée sur la face avant (par exemple /u sur les modules ci-dessus), les données de la sortie ne dépendent plus de cette variable. Si les données de l'entrée dépendent de deux variables ou plus, et une opération de " Coupe " est faite selon une dimension, l'opération de coupe est faite pour chaque occurence dur les autres dimensions.
Exemple : Extraction d'une colonne ou une ligne d'une matrice.
Ici, le signal à l'entrée est une matrice. Si vous coupez un échantillon selon les lignes (variable /li ) vous obtenez une ligne de la matrice (selon la variable /co ), car l'opération de coupe a été faite sur chaque colonne.
D'autre part, si vous coupez selon la variable /co , l'opération de coupe est faite sur chaque ligne de la matrice et vous obtenez un vecteur égal à une colonne particulière de la matrice.
Changer une valeur dans un vecteur
Dans quelques cas vous pouvez avoir besoin de changer la valeur dans un vecteur à un index donné. Vous pouvez faire ceci en utilisant directement le macro Ch_val/t dans la section Changements de Variable de la Bibliothèque. Dans l'exemple ci-dessous, la valeur du troisième élément du vecteur (index = 2) est changée en 200 :
Convertir indices en dates, ou dates en indices
Quand une variable est définie, un index de l'échantillon donné no est associé à une date donnée to en secondes qui dépend de l'origine et du pas d'échantillonage D t (les deux en secondes) fixés par l'utilisateur (voir Changer le pas d'échantillonage d'une variable) :
Quand vous exécutez des opérations telles qu'extraire une valeur d'un vecteur, sélectionner une portion d'un vecteur, etc., dans certains cas vous devez entrer les indices de(s) échantillon(s) sélectionné(s), et dans quelques autres cas vous devez entrer leur dates.
Les macros I - >V/t et V->I/t dans la section Changements de Variables de la Bibliothèque permettent de convertir respectivement des dates en indices , et indices en dates :
Découper un signal en un groupe de sous signaux
Pour certainesapplications il nécessaire de découper un signal en plusieurs parties plus courtes . Cela peut être fait automatiquement en utilisant le module Decoupe/t/b dans la section Changements de Variables de la Bibliothèque :
Recoller un groupe de sous signaux en un seul signal
Un groupe de signaux à deux dimensions peut être recollé en un seul signal, plus long en utilisant le module Recolle/t/b disponible dans la section Changements de Variable de la Bibliothèque:
Démultiplexer un signal en plusieurs sous-signaux
Vous pouvez découper un signal en plusieurs sous-signaux, en supposant que le signal original a été produit par un multiplexeur. Le module Demultiplex/t/p est disponible dans la section Changements de Variables de la Bibliothèque. Le module crée une nouvelle variable (/p dans l'exemple ci-dessous) lequel peut être considéré comme le numéro de canal après l'opération du demultiplexage :
Multiplexer des signaux en un seul signal
Vous pouvez regrouper un groupe de signaux en un seul signal comme c'est fait par un multiplexeur. Le module Multiplex/t/p est disponible dans la section Changements de Variables de la Bibliothèque:
Après l'opération de multiplexage, le signal dépend de seulement une variable. Comme montré sur l'exemple précédent, l'ordre dans lequel les échantillons sont fondus dépend de l'ordre des variables (/x/t ou /t/x) fixé par l'utilisateur sur la face avant du module Multiplex.
Le macro Concatenate/t dans Changements de Variables / Opérations sur les vecteurs de la Bibliothèque permet de concaténer deux signaux selon la même variable.
Dans l'exemple précédent une sinusoïde de 5Hz de 100 échantillons est concaténée à une sinusoïde de 1Hz de 150 échantillons. Le résultat est un signal de 250 échantillons (=2.5 secondes ici).
Les deux signaux doivent avoir le même nom de variable et les mêmes attributs, mais leur longueur peut être différente.
Étendre la dimension d'un signal
Vous pouvez étendre la dimension du signal, c'est-à-dire, créer un vecteur à partir d'un scalaire, une matrice à partir d'un vecteur, un tenseur 3D à partir d'une matrice, et ainsi de suite, en utilisant le module " = " dans la section Changements de Variables de la Bibliothèque :
Obtenir une information générale sur les signaux portés par un fil
Une macro très utile est la macro Info dans la section Changements de Variables de la Bibliothèque. Quand elle est connectée à un fil, cette macro terminale fournit à l'utilisateur l'information générale sur les signaux portés par le fil : type de données, nom, longueur, origine, etc. des variables :
Si vous calculez le macro Info en cliquant à droite sur elle, une nouvelle fenêtre s'ouvre :
Elle indique que ce fil contient les données réelles de 4 octets (R4), décrites par deux variables /t (longueur 256 échantillons, pas d'échantillonnage 100Hz, origine 10s) et /gain (longueur 4, pas d'échantillonage par défaut 1Hz). Ce groupe de données peut donc être vu soit comme une matrice 4x256, soit comme un groupe de 4 signaux qui contiennent 256 échantillons chacun.
Si la longueur est affichée entre parenthèses, la variable correspondante est une variable dynamique : sa longueur dépend d'une autre variable. La longueur affichée est la longueur maximale de la variable.
4-8-4. Transmettre l'information de variable à une boîte en paquet.
Les boîtes en paquet sont utilisées pour construire des algorithmes qui traitent les éléments d'un vecteur individuellement, au lieu de faire les mêmes opérations sur tous les échantillons d'un vecteur. Bien qu'un grand nombre d'opérations soit proposé dans la Bibliothèque, vous pouvez vous-même construire des paquets si cela est requis par votre application.
Voir : Compacter le graphe en paquets ou boucles
Créer des boîtes en paquet
Comme un paquet est un processus qui fait référence à une variable, l'utilisateur doit fournir au paquet l'information sur la variable qu'il doit traiter. Cette variable peut être une variable existante, ou elle peut être créée exprès.
Faire une boucle sur une variable existante
Si un signal n'est pas un scalaire, il porte l'information sur ses variables. Si un tel signal vient sur une borne latérale d'une boîte en paquet, et si le signal dépend de la variable de la boîte en paquet, l'information exigée aux calculs de la boucle est connue.
Par exemple, soit un signal une fonction de la variable t et calculons la somme des éléments de ce signal selon t. Le programme MUSTIG sera :
La variable de boucle est la même que celle apportée par le signal entrant. Cette variable est nommée /t et porte un signal de cinq échantillons. Donc, le paquet exécute cinq boucles, un pour chaque échantillon du signal de l'entrée, et donne la somme des éléments en conséquence.
Par conséquent, quand la variable sur laquelle vous voulez faire une boucle existe déjà, le graphe est assez simple à construire.
Faire une boucle sur une nouvelle variable
Si la variable de boucle n'est pas portée par un de ses signaux d'entrée, une variable spécifique doit être créée et doit être reliée à une borne latérale sur la frontière du paquet.
Pour ce faire, définissez la variable de boucle à l'extérieur de la boîte du paquet (voir Créer une variable), et créez un fil entre la sortie de cette définition de variable et une borne latérale de la boîte du paquet, pas déjà reliée (voir Créer une borne).
Supposez par exemple que vous voulez produire un vecteur fait des puissances consécutives d'un nombre donné : X={1,a,a2,a3,... ,aN-1}, où a est un scalaire. Une bonne façon de faire cela est de commencer avec une " graine " (a=3 par exemple), et la multiplier par elle-même un nombre donné N de fois.
Cela peut être fait facilement avec un paquet comme dans le programme ci-dessous (pour a = 3 et N = 5):
Comme vous commencez avec une graine scalaire (a), aucune variable n'est disponible pour faire une boucle. Cependant, vous devez dire au paquet combien de fois il doit faire la boucle ! Cela est fait en créant la nouvelle variable /x et la reliant à une borne latérale créée sur la frontière du paquet.
Cette variable /x a été définie mais elle ne contient pas de valeur, ce n'est pas un " signal ". Tout ce dont le paquet a besoin ici est sa longueur pour savoir combien de boucles doivent être faites. C'est pourquoi relier la borne latérale à un module de calcul à l'intérieur de la boucle n'est pas exigé.
Le résultat obtenu est pris de l'intérieur de la boucle. C'est donc un vecteur selon la variable de boucle /x . Il contient cinq échantillons qui correspondent aux valeurs portées par le fil à chacune des cinq itérations de la boucle (voir Compact le graphe en paquets ou boucles).