espace

Maîtrise d'informatique - Module 18
Traitement du signal - Travaux pratiques



Séance 2 :

  • 1. Avant-propos.
  • 2. Signal unidimensionnel : TFR et TFR inverse.
  • 3. Signal bidimensionnel : TFR et TFR inverse.

  • 1. Avant-propos.

    Vous ne pouvez aborder la deuxième séance de travaux pratiques que si le programme de TFR unidimensionnelle écrit lors de la première séance de travaux pratiques est exact. En effet, vous allez travailler à partir de ce programme. Si les tests de validation proposés à la fin de la première séance n'ont pas été concluants, veuillez cliquer sur le canot de sauvetage ci-dessous, afin de consulter la liste des erreurs les plus souvent commises. Si cela n'est pas suffisant, veuillez vous adresser à un enseignant.

    image canot

    2. Signal unidimensionnel : TFR et TFR inverse.

    Travaillez sur une copie tfr1D.c du fichier tfr.c écrit lors de la première séance de travaux pratiques.

    1- Modifiez signal_discret de telle manière que le signal discret soit à valeurs complexes. Modifiez aussi la fonction init_spectre :

    Dans la fonction main, on trouvera l'appel init_spectre(signal_discret,spectre) pour le calcul de la TFR et l'appel init_spectre(spectre,spectre) pour le calcul de la TFR inverse.

    2- Modifiez la fonction init_w :

    Dans la fonction main, on trouvera l'appel init_w(w,1) pour le calcul de la TFR, l'appel init_w(w,-1) pour le calcul de la TFR inverse.

    3- Modifiez la fonction tfr :

    Dans la fonction main, on trouvera l'appel tfr(spectre,w,1) pour le calcul de la TFR et l'appel tfr(spectre,w,-1) pour le calcul de la TFR inverse.

    4- Ecrivez une fonction affiche qui affiche les valeurs d'un tableau de complexes (partie réelle et partie imaginaire), ainsi que les modules de ces complexes :

    5- Modifiez la fonction main de telle façon que le programme contenu dans le fichier tfr1D.c :

    Validez votre programme en utilisant les données de test de la première séance de travaux pratiques.

    3. Signal bidimensionnel : TFR et TFR inverse.

    3.1. Quelques éléments de cours.

    La transformation de Fourier bidimensionnelle d'une fonction complexe de deux variables réelles f(x,y) a été vue en cours : c'est une généralisation de la transformation de Fourier unidimensionnelle, dans laquelle l'intégrale simple devient une intégrale double :

    image 1              (1)

    Or, on peut réécrire l'égalité (1) sous la forme suivante :

    image 7              (2)

    Cette écriture peut être interprétée de la façon suivante : pour calculer la transformée de Fourier d'un signal bidimensionnel, on peut d'abord calculer la transformée de Fourier unidimensionnelle de chacune de ses lignes (c'est l'expression qui apparaît entre crochets dans (2)), puis calculer ensuite la transformée de Fourier unidimensionnelle de chacune des colonnes.

    Quant à la transformation de Fourier inverse bidimensionnelle, elle s'obtient par généralisation de la transformation de Fourier inverse unidimensionnelle, par la formule :

    image 2             (3)

    Il a été également vu en cours la définition de la transformation de Fourier discrète (TFD) unidimensionnelle, ainsi que la formule de la transformation de Fourier discrète inverse (TFD-1) unidimensionnelle. La TFD bidimensionnelle associe au signal complexe discret bidimensionnel image 3 le spectre complexe discret bidimensionnel image 4 donné par :

    image 5              (4)

    L'égalité (4) peut être réécrite sous la forme suivante :

    image 8             (5)

    Dans cette écriture, on réalise d'abord la TFD unidimensionnelle des lignes (expression entre crochets), puis la TFD unidimensionnelle des colonnes. Quant à la TFD-1 bidimensionnelle, on peut vérifier qu'elle est donnée par :

    image 6              (6)

    Là encore, on peut réécrire (6) sous la forme suivante :

    image 9              (7)

    Dans cette écriture, on réalise d'abord la TFD-1 unidimensionnelle des lignes (expression entre crochets), puis la TFD-1 unidimensionnelle des colonnes.

    Dans la suite de cette séance de travaux pratiques, vous allez programmer les algorithmes de la transformation de Fourier rapide (TFR) et de la transformation de Fourier rapide inverse (TFR-1) d'un signal bidimensionnel. Plutôt que de tout réécrire depuis le début, vous allez réutiliser le programme que vous avez déjà écrit, et vous vous servirez des définitions (5) et (7) de la TFD et de la TFD-1 bidimensionnelles. Pour éviter d'avoir à calculer tantôt la TFR des lignes, tantôt celle des colonnes, vous écrirez, un peu plus loin, la fonction de transposition d'une matrice à valeurs complexes, fonction qui permettra de transformer les lignes d'une matrice carrée en colonnes et vice versa.

    3.2. Le programme convert_tfr2D.

    Dans ce paragraphe, N désigne une constante (que vous fixerez à 256). Il vous est demandé d'écrire dans le fichier convert_tfr2D.c le source d'un programme de conversion : convert_tfr2D

    Lisez l'ensemble du paragraphe 3.2. avant de commencer à programmer.

    1- convert_tfr2D accepte trois paramètres :

    Si sens vaut 1...

    Si sens vaut -1...

    2- Dans convert_tfr2D.c, vous écrirez principalement les fonctions suivantes :

    La fonction ecrire_complexes stocke dans le fichier nom_fichier les NxN complexes pointés par s. La taille du fichier sera de NxNx2xsizeof(float) octets. La fonction lire_complexes effectue l'opération inverse : initialisation de s à partir des données lues dans nom_fichier.

    La fonction ecrire_modules  stocke dans le fichier nom_fichier les modules des NxN complexes pointés par s. La taille du fichier sera de NxN octets. La fonction lire_modules effectue l'opération inverse : initialisation de s à partir des données lues dans nom_fichier, chaque complexe étant supposé réel positif. Pour le calcul des (valeurs approchées des) modules, ecrire_modules  peut faire appel à une fonction modu_comp2 :

    Si vous éprouvez des difficultés pour manipuler les fonctions de lecture/écriture dans des fichiers en langage C, cliquez sur le canot de sauvetage ci-dessous :

    image canot

    3- Avant de passer à la suite, il est prudent de valider ce programme de conversion ! Vous pouvez par exemple utiliser le code ci-après (où N doit cette fois être fixé à 2). A vous bien sûr d'écrire affiche2 (en retouchant légèrement la fonction affiche définie dans le paragraphe 2, point 4).

    3.3. Le programme tfr2D.

    Travaillez sur une copie tfr2D.c du fichier tfr1D.c et fixez N à 256 et P à 8.

    1- Ecrivez une fonction transpose, qui transpose une matrice carrée de complexes :

    2- Supprimez la fonction affiche et remplacez-la par les fonctions ecrire_complexes et lire_complexes définies au paragraphe 3.2, point 2.

    3- Modifiez la fonction main de telle façon que le programme contenu dans le fichier tfr2D.c accepte trois paramètres :

    Si sens vaut 1, tfr2D.c :

    Si sens vaut -1, tfr2D.c :

    3.4. Tests de validation.

    Dans le répertoire /home/mod18g0/TS/tests, vous trouverez les fichiers tp02test01.brt et tp02test02.brt, pour lesquels les constantes N et P ont été fixées respectivement aux valeurs 256 et 8. Effectuez une recopie de ces deux fichiers sur votre compte.

    1- Lancez successivement les commandes suivantes :

    2- Le fichier tp02test02_bis.brt contient donc l'image "brute" de la transformée de Fourier de tp02test01.brt, et doit être identique au fichier tp02test02.brt. Quant au fichier tp02test03.brt, il contient l'image "brute" de la transformée de Fourier inverse de tp02test02_bis.brt, c'est-à-dire que son contenu doit être le même que celui de tp02test01.brt. Comparez ces fichiers visuellement, à l'aide de Khoros.

    Remarque :

    La prochaine séance de travaux pratiques débutera par l'intégration dans Cantata des opérateurs définis par tfr2D et convert_tfr2D.


    Ces pages ont été réalisées par Jean-Denis Durou et Pascal Matsakis.
    Pour tout commentaire, envoyer un mail à durou@irit.fr.