• Aucun résultat trouvé

TP Traitements Numériques

N/A
N/A
Protected

Academic year: 2022

Partager "TP Traitements Numériques"

Copied!
17
0
0

Texte intégral

(1)

TP Traitements Numériques

Kit de développement TEXAS C6711

Le kit de développement est constitué d’une carte TEXAS "C6711 DSK" intégrant le processeur de

traitement de signal (DSP) TEXAS TMS320C6711 ; reliée à un PC via une liaison parallèle et du logiciel de développement TEXAS "Code Composer Studio".

C6711 DSK

La carte de traitement du signal "C6711 DSK" est une carte proposée par TEXAS pour l’évaluation de son processeur flottant TMS320C6711.

Elle contient suffisamment de mémoire pour mettre en œuvre des programmes assez complexes. Elle est équipée également du circuit d’entrée-sortie analogique TEXAS AD535 16 bit dont la fréquence

d’échantillonnage est de 8kHz. Cet ensemble permet la mise en œuvre de programmes simples de traitement du signal ; notamment des filtres.

Code Composer Studio

"Code Composer Studio" est un environnement de développement logiciel qui intègre l’ensemble des éléments nécessaires à l’élaboration et à la mise au point des programmes :

• Editeur de texte multi-fenêtres

• Paramétrage du projet

• Assembleur, Compilateur C et C++, Editeur de liens

• Téléchargement dans la carte

• Exécution et débogage

• Aide

Démarrage

Il est impératif d’effectuer les opérations dans l’ordre où elle sont décrites ci-après.

Mise sous tension de la carte

Vérifier que la carte est bien connectée au PC grâce au câble parallèle.

Mettre sous tension la carte en connectant le jack d’alimentation. Si elle était déjà sous tension, vérifier qu’elle réagit correctement en pressant le bouton "Reset" (bouton blanc situé sur la carte près des deux connecteurs d’entrée-sortie analogiques). Les diodes (USER_LED 1,2 et 3) doivent clignoter. Si ce n’est pas le cas, débrancher puis rebrancher le jack d’alimentation de la carte.

Démarrage de "Code Composer Studio"

La carte étant sous tension et réagissant correctement, on peut démarrer le logiciel de développement

"Code Composer Studio". Double cliquer pour cela sur l’icône intitulée "CCS 2 ('C6000)" . L’image de lancement du logiciel apparaît au centre de l’écran. Patienter le temps que la fenêtre de Code Composer Studio apparaisse. Si un message d’erreur "Can’t Initialize Target CPU" apparaît : choisir "Abandonner", vérifier les connexions de la carte puis relancer "Code Composer Studio".

L’étape suivante est la création d’un projet ou l’ouverture d’un projet existant.

Ouverture du Projet

Dans le cadre des TP, le temps étant compté, un projet de départ est fourni. Pour l’ouvrir, sélectionner le menu "Project" puis "Open". Puis sélectionner le fichier :

C:\ti\myprojects\filter\filter.pjt

Les fichiers constituant le projet apparaissent alors sous forme d’une arborescence dans la fenêtre de gauche de "Code Composer Studio" ; comme dans l’explorateur Windows.

Le projet, tel qu’il est, permet de programmer la carte de façon à transmettre les échantillons obtenus du convertisseur analogique-numérique d’entrée au convertisseur numérique-analogique de sortie.

Avant d’examiner en détail les fichiers constituant le projet et de les modifier pour mettre en œuvre des traitements plus complexes, nous pouvons l’utiliser tel qu’il est.

(2)

Produire un exécutable

Pour cela, sélectionner le menu "Project" puis "Build" (ou utiliser le bouton ). Une fenêtre apparaît au bas de l’écran, rendant compte des tâches effectuées pour construire le projet. Si tout ce passe bien, le

message suivant apparaît finalement : Build Complete,

0 Errors, 0 Warnings, 0 Remarks.

Téléchargement

L’étape suivante consiste à télécharger l’exécutable dans la carte. Pour cela, sélectionner le menu "File"

puis "Load Program…". Sélectionner alors le fichier "filter.out" (dont le nom est basé sur celui du projet). Le téléchargement s’effectue.

Démarrage du traitement

Pour faire fonctionner le programme téléchargé, sélectionner le menu "Debug" puis "Run" (ou utiliser le bouton ).

Vérifier alors le bon fonctionnement du traitement en appliquant un signal à l’entrée analogique de la carte et visualiser le signal obtenu en sortie. Le signal de sortie doit être identique au signal d’entrée à une phase près. Ceci dans la mesure où il n’y a pas d’écrêtage ([-1.5v ; +1.5v]) et que la fréquence d’entrée est sensiblement inférieure à la demi-fréquence d’échantillonnage.

Arrêt du traitement

Avant de télécharger tout nouveau traitement, il faut impérativement (sous peine de plantage) stopper le traitement actuel. Pour cela, sélectionner le menu "Debug" puis "Halt".

Modification du traitement

De nombreux fichiers constituent le projet. Néanmoins, ce dernier a été construit de telle façon qu’un seul fichier est à modifier pour modifier le traitement. Il s’agit du fichier qui se nomme actuellement "pass.c".

Celui-ci se trouve dans l’arborescence du projet sous le nœud "Sources". Pour l’éditer, double cliquer sur ce nœud puis sur le fichier "pass.c". Une fenêtre d’édition apparaît. Elle présente le contenu du fichier :

#include "dspio.h"

// Definition des variables globales // Initialisations des variables globales void Init() {

}

// Traitement des echantillons void Process(float *io) { }

Il s'agit d'instructions écrites en langage C.

Le fichier contient essentiellement deux fonctions : Init() et Process().

La fonction Init() n’est appelée qu’une seule fois au début de l’exécution du traitement. Elle est destinée à effectuer les initialisations des variables globales éventuellement nécessaires au traitement comme nous le verrons par la suite.

La fonction Process() est appelée à chaque nouvel échantillon reçu de l’interface analogique-numérique.

Elle reçoit l’échantillon courant en paramètre : variable e. Attention il s’agit d’un pointeur (autrement dit, e contient l’adresse de la variable contenant la valeur de l’échantillon). La valeur de l’échantillon s’obtient donc en écrivant "*io". En retour, cette fonction fournit la valeur de l’échantillon du signal de sortie via cette même variable en "écrasant" la valeur de l’échantillon d’entrée (c’est-à-dire en écrivant cette valeur dans "*io").

Dans le cas du programme "pass.c", c’est inutile car la valeur de l’échantillon de sortie est simplement celle de l’échantillon d’entrée.

Nous allons maintenant modifier ce fichier pour mettre en œuvre un filtre récursif du deuxième ordre : ( ) ( 2) (1 ) ( )

y n = −λy n− + −λ x n

Pour cela, de façon à ne pas perdre l’ancien traitement, nous allons sauver le fichier "pass.c" sous un nouveau nom : "rii1.c" par exemple (menu "File" puis "Save as…").

(3)

Puis nous allons modifier son contenu de la façon suivante :

#include "dspio.h"

// Definition des variables globales float lambda=0.99 ;

float y,y1,y2 ;

// Initialisations des variables globales void Init() {

y=y1=y2=0 ; }

// Traitement des echantillons void Process(float *io) {

y=-lambda*y2+(1-lambda)**io ; y2=y1;

y1=y;

*x=y ; }

Avant de construire le nouveau traitement, il faut encore inclure le nouveau fichier dans le projet. Pour cela, sélectionner le menu "Project" puis "Add Files to Project…".

On peut maintenant construire le nouveau programme (menu "Project" puis "Build"). S’il y a des erreurs de syntaxe dans ce que nous avons saisi, elles sont listées par le compilateur. Il faut les corriger et lancer à nouveau la reconstruction.

L’édition de liens produit une erreur en nous indiquant que les fonctions Init() et Process() sont définies plusieurs fois. C’est normal, car elles sont définies à la fois dans le fichier "pass.c" et dans le nouveau fichier

"rii1.c".

Il faut donc supprimer le fichier "pass.c" du projet. Pour cela, il suffit de sélectionner le fichier "pass.c" dans l’arborescence du projet et de presser la touche "Suppr" du clavier (ou d’utiliser le menu contextuel (bouton droit de la souris)). Le fichier est supprimé de l’arborescence mais il n’est pas effacé du disque pour autant.

Nous pourrons donc le réintégrer au projet si nous avons besoin de revenir à l’ancien traitement.

On peut maintenant reconstruire le projet pour obtenir l’exécutable "filter.out", le télécharger et le "lancer".

Le résultat devrait être un filtrage passe-bande du signal ; plus ou moins sélectif autour de Fe/4. Si ce n’est pas le cas, et que l’on ne découvre pas d’erreurs, on peut déboguer le programme en plaçant des points d’arrêt. Pour cela, arrêter le traitement puis placer le pointeur de la souris dans la zone grise de la fenêtre contenant le fichier "rii.c" en regard de l’instruction :

y=-lambda*y2+(1-lambda)**io ;

et double cliquer. Un point rouge apparaît. C’est un point d’arrêt (pour le faire disparaître, il suffit de double cliquer à nouveau dessus).

Relancer le programme. Une flèche jaune apparaît au niveau de l’instruction : le programme est arrêté à ce niveau. On peut alors examiner le contenu des variables pour déceler une erreur. Sélectionner par exemple la variable "y" puis dérouler le menu contextuel (bouton droit de la souris) puis sélectionner "Add to Watch Window". Une nouvelle fenêtre apparaît au bas de l’écran qui présente la liste des variables visualisées ainsi que leur valeur.

On peut relancer le programme et étudier les valeurs successives de ces variables.

Voilà pour l’essentiel. Procéder de façon analogue pour mettre en œuvre les autres traitements.

(4)

- TP DSP - - Prise en main -

Le but de cette première manipulation est de se familiariser avec le kit de développement Texas et de mesurer la fonction de transfert de la carte en absence de traitement numérique.

Préparation

Lire attentivement et entièrement le texte. Réfléchir à ce que signifie un traitement produisant une phase linéaire. Préparer, dans la mesure du possible, les réponses aux questions auxquelles il faudra répondre dans le compte-rendu.

Compte-rendu

Le compte rendu comprendra les préparations (2 par binômes), les listings des différents programmes, et les réponses aux différentes questions.

Prise en main

Programmer la carte de façon à transmettre sans traitement les échantillons d’entrée en sortie (programme pass.c). Puis appliquer un signal en entrée et observer le signal produit en sortie. La valeur moyenne du signal de sortie est-elle identique à celle du signal d'entrée ? Mesurer la différence.

Fonction de transfert globale

Il s'agit de déterminer la réponse en fréquence globale de la carte. Pour cela, appliquer un signal sinusoïdal en entrée de la carte et observer le signal en sortie. Mesurer le gain (ou l'affaiblissement) produit par la carte (module de la réponse en fréquence) ainsi que le déphasage (argument de la réponse en fréquence).

Mesurer ces grandeurs pour toutes les fréquences intéressantes de façon à pouvoir tracer la réponse en fréquence (module et phase) avec suffisamment de précision.

Module de la réponse en fréquence

Déterminer les fréquences de coupure basse et haute ainsi que les ondulations en bande passante. Tracer le module de la réponse en fréquence en utilisant une échelle linéaire.

Phase de la réponse en fréquence

Tracer la réponse en phase de la carte. Commenter la courbe obtenue (ruptures). S'agit-il d'un système à phase linéaire. Si oui, que peut-on en déduire ?

Proposer une méthode temporelle directe pour mesurer le retard introduit par la carte. Effectuer la mesure.

La valeur obtenue est-elle cohérente avec la fonction de transfert précédemment mesurée ?

Fonction de transfert d'entrée

Le but est de mesurer la contribution à la fonction de transfert globale du filtre anti-repliement situé en entrée avant le convertisseur analogique-numérique. Pour cela, il faut comparer le signal analogique

présent en entrée au signal numérique obtenu à l'intérieur du processeur. Intéressons-nous dans un premier temps au module de la réponse en fréquence pour déterminer si l'allure de la fonction de transfert globale provient principalement du filtre anti-repliement ou pas. Mesurer l'amplitude du signal analogique en entrée ne pose pas de problème. Par contre, la mesure de l'amplitude du signal discret à l'intérieur du processeur n'est pas immédiate. Pour cela, il faut mettre au point un petit traitement à l'intérieur du processeur pour mesurer l'amplitude du signal et l'imprimer à l'écran. Pour obtenir une mesure fiable, nous pouvons estimer la puissance du signal discret en calculant la quantité :

1 2

0

1 ( )

N n

P x n

N

=

=

puis imprimer la valeur de P ou la valeur efficace du signal déduite de P ou encore, la valeur crête du signal. L'affichage de la valeur de P peut être obtenu de la manière suivante :

LOG_printf(&trace, "%f\n",P);

(5)

L'affichage a lieu dans la fenêtre "Message Log" qui peut être activée dans le menu "DSP/BIOS" de Code Composeur Studio.

La fonction LOG_printf() fonctionne comme la fonction printf() en C à ceci près qu'une seule valeur peut être affichée à la fois ; l'instruction suivante ne fonctionne pas :

LOG_printf(&trace, "%f %f\n",P1,P2);

Ce programme fonctionnant, comparer dans un premier temps l'estimation obtenue pour différentes valeurs de N. Comment faut-il choisir cette valeur pour obtenir une estimation de qualité.

Après avoir réglé correctement cette valeur, relever et tracer le module de la réponse en fréquence du filtre anti-repliement. Comparer à la fonction de transfert globale.

Suggestion : Vous pouvez réfléchir à d'autres façon de procéder pour mesurer l'amplitude du signal numérique. Vos propositions seront appréciées.

Est-il possible de mesurer de manière équivalente, la contribution du filtre anti-repliement à la phase de la fonction de transfert globale ? Si oui, décrire de quelle façon procéder.

Fonction de transfert de sortie

Il s'agit de mesurer la réponse en fréquence du filtre de reconstruction présent en sortie de la carte. Nous ne nous intéresserons encore une fois, qu'au module de la réponse en fréquence. Pour mesurer cette

grandeur, il faut maintenant générer un signal sinusoïdal d'amplitude déterminée à l'intérieur du processeur et relever l'amplitude du signal obtenu en sortie de la carte. On attachera un soin particulier à la façon de générer ce signal. L'instruction suivante :

y=A*sin(2*pi*f*(n++)*Te);

pose problème du fait que la variable n grandit continuellement et peut arriver à saturation. Proposer un algorithme pour résoudre ce problème.

Le programme fonctionnant correctement, relever et tracer le module de la réponse en fréquence du filtre de reconstruction. Comparer à la fonction de transfert globale. Les fonctions de transfert d'entrée et de sortie confirment-elles la fonction de transfert globale ?

Que se passe-t-il si le signal sinusoïdal généré par le processeur est à une fréquence supérieure à 2 Fe.

Essayer avec 3 4

Fe par exemple puis avec d'autres fréquences. Expliquer le phénomène observé.

Rapport Signal à Bruit

Le but est d'évaluer la dégradation du rapport signal à bruit entre l'entrée et la sortie. Pour cela, injecter un signal sinusoïdal en entrée de la carte puis utiliser le module fft de l'oscilloscope pour caractériser le bruit introduit par la carte. Quelle est la nature de ce bruit (blanc, harmonique, etc …). Evaluer le rapport signal à bruit en sortie. Le comparer au rapport signal à bruit d'entré. En déduire la dégradation introduite par la carte. La puissance et la nature du bruit observé en sortie sont-elles normales ?

(6)

- TP DSP -

- Filtrage à Réponse Impulsionnelle Finie -

Préparation

Lire attentivement et entièrement le texte. Calculer les réponses en fréquences théoriques (module et phase) des filtres devant être mis en œuvre (lorsqu'elles ne sont pas fournies). Réfléchir au moyen de mettre en évidence la phase linéaire des différents filtres (en comprenant évidemment ce qu'est une phase linéaire ; point déjà abordé lors du premier TP). Préparer les réponses aux questions auxquelles il faudra répondre dans le compte-rendu.

Compte-rendu

Le compte-rendu comprendra les préparations (2 par binômes), les listings des différents programmes, et les réponses aux différentes questions.

Introduction

Commencer très simplement en implantant les réponses impulsionnelles : { 1 ; 1 } et { 1 ; -1 }. Il s'agit simplement de délivrer en sortie la somme ou la différence de deux échantillons successifs d'entrée. Les programmes C relatifs à ces deux filtres s'appelleront rif1.c et rif2.c. Vérifier rapidement les réponses en fréquence (module) de ces filtres très simples en les comparant aux réponses théoriques (utiliser une échelle linéaire).

La convolution des réponses impulsionnelles précédentes (mise en série des filtres) donne : { 1 ; 0 ; -1 }.

Implanter ce nouveau filtre via le programme rif3.c. Vérifier la justesse de sa réponse en fréquence.

Ce filtre est-il à phase linéaire ? Si oui, quelle est cette phase et quel est le retard introduit par ce filtre (théoriques et mesurés (attention au retard introduit par la carte elle-même)) ? Pour mesurer plus justement le déphasage engendré par le traitement numérique uniquement, on pourra délivrer en sortie de la carte alternativement le signal filtréy(n) puis le signal d'entrée x(n) (ou encore x(nL)L est un retard judicieusement choisi pour mettre en évidence la phase linéaire du traitement). Pour délivrer alternativement les deux signaux, on pourra procéder de la façon suivante :

if((n=(n+1)%16000)<8000) { *io=y;

} else {

*io=x_passe;

}

où n est un compteur déclaré en global. Les valeurs 8000 et 16000 représentent respectivement des durées de 1s et 2s.

Convolution

Ecrire un programme rif4.c destiné à mettre en œuvre des filtres R.I.F. de façon plus systématique, c’est- à-dire en effectuant l’opération de convolution :

=

= 1

0

) ( ) ( ) (

N i

i n x i h n y

Pour cela, définir la dimension du filtre grâce à un define au début du programme :

#define N 10

Et déclarer les tableaux destinés à recevoir les coefficients de la réponse impulsionnelle ainsi que les échantillons du signal d’entrée devant être mémorisés :

float h[N], x[N];

Puis initialiser la réponse impulsionnelle : h[0]= ...;

h[1]= ...;

h[N-1]= ...;

Remarque : on pourra également initialiser la réponse impulsionnelle en la déclarant :

(7)

float h[]={ 1 , 0, -1 };

Ces variables correctement déclarées et initialisées, programmer le traitement : y=0;

for(i=0; i<N; ++i){

y=y+ ...

}

ainsi que la mise à jour du tableau des échantillons d’entrée nécessaires au traitement.

Dans un premier temps, on pourra fixer N à 3 et chercher la réalisation du filtre précédent de réponse : { 1 ; 0 ; -1 } et vérifier le bon fonctionnement du programme.

Filtre passe bas

Le programme générique fonctionnant correctement, on pourra implanter facilement un filtre passe bas obtenu avec Matlab :

h=[ 0.0537 0 -0.0916 0 0.3131 0.5 0.3131 0 -0.0916 0 0.0537 ] de la façon suivante :

N = 11;

F = [ 0 2*0.2 2*0.3 2*0.5 ];

M = [ 1 1 0 0 ];

h=remez(N-1,F,M);

Les caractéristiques de ce filtre sont les suivantes :

0 0.5 1

0 0.5 1

1.5 |H(f)|

0 0.5 1

-80 -60 -40 -20 0

20 |H(f)| (dB)

0 5 10 15

-0.2 0 0.2 0.4 0.6

h(n)

0 0.5 1

-200 -100 0 100 200

Phase (°)

Il suffira pour cela d'adapter N à la dimension du filtre et d'initialiser le tableau contenant les coefficients du filtre. Le fichier contenant le programme s'appellera rif5.c.

On relèvera la réponse en fréquence et on la comparera à celle attendue. On vérifiera également la phase linéaire du filtre en mesurant le retard introduit par le filtre (utiliser éventuellement la sortie alternative décrite précédemment).

Filtre passe haut

Transformer le filtre passe bas précédent en filtre passe haut. Expliquer comment et pourquoi il faut modifier les coefficients de la réponse impulsionnelle. Mettre en œuvre le filtre (programme rif6.c)et vérifier la nouvelle réponse en fréquence. Peut-on appliquer une méthode analogue pour passer d'un filtre passe bas à un filtre passe bande ? Si oui, expliquer comment.

(8)

Filtre de Hilbert

Toujours avec la même structure de programme, on implantera un filtre de Hilbert (rif7.c) obtenu avec Matlab :

h = [ 0 -0.0513 0 -0.0762 0 -0.1169 0 -0.2060 0 -0.6346 0 0.6346 0 0.2060 0 0.1169 0 0.0762 0 0.0513 0 ]

de la façon suivante :

h= imag(hilbert([zeros(1,10) 1 zeros(1,10)]));

Les caractéristiques de ce filtre sont les suivantes :

0 0.5 1

0 0.5 1 1.5

|H(f)|

0 0.5 1

-100 -50 0 50

|H(f)| (dB)

0 5 10 15 20

-1 -0.5 0 0.5 1

h(n)

0 0.5 1

-200 -100 0 100 200

Phase (°)

Quelle est la particularité de ce genre de filtres (examiner le déphasage produit). A quoi peuvent-ils servir ? Calculer avec Matlab puis mettre en œuvre un filtre plus long et donc plus efficace (N=101 par exemple).

(9)

- TP DSP -

- Filtrage à Réponse Impulsionnelle Infinie -

Préparation

Lire attentivement et entièrement le texte. Déterminer les coefficients des filtres devant être calculés ainsi que les facteurs d’échelle. Préparer les réponses aux questions auxquelles il faudra répondre dans le compte-rendu.

Compte-rendu

Le compte-rendu comprendra les préparations (2 par binômes), les listings des différents programmes, et les réponses aux différentes questions.

Introduction

Les filtres à réponse impulsionnelle infinie sont plus délicats à implanter que les filtres à réponse

impulsionnelle finie car leur caractère récursif (contre réaction) les expose à la divergence. Ceci est d'autant plus vrai que leurs pôles sont proches du cercle unité. On dit alors qu'on a affaire à des filtres résonnants.

De tels filtres requièrent une grande précision au niveau de leurs coefficients, des échantillons et des calculs.

Cellule du second ordre purement récursive

Soit la fonction de transfert est la suivante :

2 2 1 1

1 ) 1

(

+

= +

Z b Z Z b

H

Calculer les coefficients du filtre pour que la résonnance ait lieu à la fréquence 4

Fe et que son amplitude soit de 10. Tracer la réponse en fréquence. Quel facteur d’échelle faut-il appliquer au signal pour qu’il n’y ait pas saturation en sortie ?

Programmer ce filtre (rii1.c) et comparer la réponse en fréquence obtenue à sa valeur théorique.

Quels seraient les coefficients pour que la résonnance ait lieu exactement en 8

Fe. Modifier le programme et vérifier la fréquence de résonnance.

De quel type de filtres s’agit-il ? A quoi peuvent-ils servir ? Comment varie leur phase ?

Cellule du second ordre générale

Soit la fonction de transfert est la suivante :

2 2 1 1

2 2 1 1

0

) 1

(

+ +

+

= +

Z b Z b

Z a Z a Z a

H

Conserver les coefficients du dénominateur déterminés précédemment pour obtenir une fréquence de résonnance de

4

Fe. Calculer les coefficients du numérateur pour obtenir des zéros sur le cercle unité en

4

Fe. Evaluer la réponse en fréquence grâce à l’interprétation géométrique. Quel facteur d’échelle faut-il appliquer au signal pour qu’il n’y ait pas saturation en sortie ?

Programmer ce filtre (rii2.c) et comparer la réponse en fréquence obtenue à sa valeur théorique.

Recommencer pour que l’effet du filtre apparaisse en 8 Fe.

De quel type de filtres s’agit-il ? A quoi peuvent-ils servir ? Comment varie la phase ?

(10)

Filtre elliptique passe-bas

Ordre 2

Il s’agit pour commencer d’un filtre d'ordre 2 obtenu avec la méthode elliptique sous Matlab de la façon suivante :

[N, Wn] = ellipord(0.3, 0.7, 0.9, 26); Î N = 2 Wn = 0.3 [B,A] = ellip(N, 0.9, 26, Wn);

Î B = 0.1744 0.2419 0.1744 Î A = 1.0000 -0.7400 0.3953

Les caractéristiques fréquentielles de ce filtre sont les suivantes :

0 0.5 1

0 0.2 0.4 0.6 0.8 1

|H(f)|

0 0.5 1

-80 -60 -40 -20 0

|H(f)| (dB)

0 0.5 1

0 0.5 1 1.5 2 2.5

Groupe delay

0 0.5 1

-200 -150 -100 -50 0 50

Phase (°)

Programmer ce filtre (rii3.c) et comparer la réponse en fréquence obtenue à sa valeur théorique.

Ordre élevé

Il s’agit d’un filtre elliptique d’ordre 6 obtenu de la façon suivante avec Matlab :

[N, Wn] = ellipord(0.4, 0.6, 0.09, 60); Î N = 6 Wn = 0.4 [B,A] = ellip(N,0.09,60,Wn);

Î B = 0.0207 0.0585 0.1060 0.1255 0.1060 0.0585 0.0207 Î A = 1.0000 -1.9673 2.9074 -2.5353 1.5771 -0.5972 0.1163 Les caractéristiques fréquentielles de ce filtre sont les suivantes :

(11)

0 0.5 1 0

0.5 1 1.5

|H(f)|

0 0.5 1

-100 -50 0 50

|H(f)| (dB)

0 0.5 1

0 5 10 15 20

Groupe delay

0 0.5 1

-200 -100 0 100 200

Phase (°)

Programmer ce filtre (rii4.c) et comparer la réponse en fréquence obtenue à sa valeur théorique. Que peut-on dire de sa phase ?

Passe-haut

Expliquer comment il faudrait modifier les coefficients du filtre passe-bas d’ordre 6 pour obtenir un filtre passe-haut de même largeur de bande. Justifier votre réponse.

Programmer ce filtre (rii5.c) et vérifier la justesse de la transformation.

Existe-il une méthode analogue pour obtenir un filtre passe-bande ? Si oui, laquelle ? Peut-on l’appliquer au filtre passe-bas d’ordre 6 ? Si oui, quelle est la bande passante du filtre ?

(12)

- TP DSP - - Prédiction Linéaire -

Préparation

Lire attentivement et entièrement le texte. Préparer les réponses aux questions auxquelles il faudra répondre dans le compte-rendu.

Compte-rendu

Le compte-rendu comprendra les préparations (2 par binômes), les listings des différents programmes, et les réponses aux différentes questions.

Introduction

Par opposition aux filtres analogiques dont les caractéristiques sont le plus souvent figées, les filtres numériques peuvent facilement évoluer au cours du temps. Il suffit pour cela de modifier leurs coefficients qui sont stockés dans la mémoire du processeur de traitement. Il est possible ainsi de passer d'un filtre passe bas à un filtre passe haut (ou quelconque) d'un instant à un autre en conservant le même programme de traitement. Il suffit pour cela de remplacer un jeu de coefficients par un autre (ou simplement de

commuter d'un jeu à un autre). Ce potentiel ouvre la voie à des traitements adaptés au cours du temps aux caractéristiques temporelles/fréquentielles ou statistiques du signal. Citons par exemple le cas d'une transmission radio d'un signal dans la gamme des fréquences HF.

La gamme HF s'étend de 2 à 30 MHz et permet l'établissement de communications à très longue distance (plusieurs milliers de kilomètres) grâce à la réflexion des ondes sur les couches ionosphériques de

l'atmosphère qui se situent à des altitudes allant de 100 à 300 km. De multiples réflexions faisant intervenir le sol peuvent apparaître et ainsi plusieurs trajets de propagation coexister en même temps avec des retards différentiels pouvant aller jusqu'à 5 ms. De plus, chaque trajet a des caractéristiques fluctuantes tant en amplitude qu'en phase du fait notamment du mouvement des couches ionisées ; la bande de fréquences de ces fluctuations est de l'ordre de quelques Hz.

Pour des débits supérieurs à 600 bit/s dans la bande 300-3000 Hz en modulations de phase, les taux d'erreurs en absence de traitement sont trop importants. L'amélioration de la qualité du signal reçu passe alors par l'emploi de filtres numériques adaptatifs dont le rôle est d'"égaliser" le canal de transmission non- stationnaire. Grossièrement, il s'agit de compléter le traitement variable que le signal a subi dans le canal de transmission par un traitement adaptatif de sorte que le traitement global (canal+égaliseur) apparaisse comme fixe et équivalent à un filtre à phase linéaire passe tout (retard pur).

Des principes équivalents peuvent être appliqués dès lors qu'un signal utile subit un traitement indésirable et variable (provoqué le plus souvent par un milieu naturel). Citons à titre d'exemple les applications médicales telles que l'échographie, l'écoute de phénomènes naturels (sismographie), l'annulation d'écho en téléphonie, etc.

Il est un autre domaine où les traitements adaptatifs sont beaucoup utilisés. C'est celui de la caractérisation et du codage des signaux. L'observation de base est que de nombreux signaux peuvent être vus comme des bruits blancs ayant traversés un filtre qui les a pourvus de caractéristiques fréquentielles particulières.

C'est le cas de nombreux sons émis par l'homme quand il parle. L'idée est alors de chercher à déterminer les caractéristiques du filtre qui aurait fourni un tel signal à partir d'un simple bruit blanc. A partir de là, s'il s'agit par exemple de transmettre à distance le signal, il suffit d'envoyer le filtre (le modèle), et

éventuellement le bruit blanc à l'origine du signal (l'excitation). De même s'il s'agit de reproduire le signal (synthétiseur par exemple), il est plus économique de mémoriser le filtre et éventuellement son excitation plutôt que le signal lui-même (souvent, l'excitation n'est pas nécessaire ; un simple bruit blanc synthétique peut suffire).

Dans la pratique, le modèle est obtenu indirectement en adaptant un filtre au signal étudié de façon à retrouver un bruit blanc :

b(n) : bruit blanc inconnu (excitation)

Modèle Filtre adaptatif

b(n) x(n) e(n)

(13)

x(n) : signal observé

e(n) : bruit blanc (b(n) estimé).

Plus précisément, le filtre est adapté en cherchant à "prédire" le signal observé s(n) à partir de ses échantillons passés { x(n-1) ; x(n-2) ; . . . . x(n-N) } (N : ordre du filtre). e(n) devient alors une erreur de prédiction :

) ( ) ( . ) (

1

n x i n x a n e

N i

i − −

=

=

ou encore

1 )

( . )

( 0

0

=

=

=

a avec i n x a n e

N i

i

La prédiction est correcte lorsque la puissance de l'erreur est minimale. Sous certaines conditions, cette dernière est alors également blanche. Le filtre constitué par les coefficients ai représente alors une estimation de l'inverse du modèle et donc indirectement une caractérisation de ce dernier.

L'adaptation des coefficients du filtre passe par l'emploi d'algorithmes plus ou moins compliqués. Le plus simple est celui dit du "gradient stochastique" qui, appliqué à la minimisation de l'erreur quadratique moyenne (Least Mean Squares ou LMS) conduit à l'équation d'adaptation suivante :

) ( ).

( . ) ( ) 1

(n a n xn i en

ai + = i −µ −

La quantité x(ni).e(n) est la dérivée partielle du carré de l'erreur de prédiction à l'instant n par rapport au coefficient ai. L'ensemble de ces quantités pour i allant de 1 à N forme le gradient de l'erreur. L'algorithme du gradient stochastique consiste à rechercher la minimisation de l'erreur en faisant évoluer les coefficients du filtre dans la direction opposée au gradient.

µ est une grandeur appelée "pas d'adaptation" qui doit être choisie très petite : 0.01 ou 0.001. C'est cette grandeur qui règle le compromis entre la vitesse de convergence du filtre et sa qualité.

Manipulation

Créer ou reprendre un programme réalisant un filtre à réponse impulsionnelle finie.

Compléter ce programme de façon à réaliser un filtre de prédiction adaptatif. Pour cela :

- Initialiser l'ensemble des coefficients à zéro à l'exception du premier qui doit être initialisé à -1.

- Programmer l'équation d'adaptation des coefficients (à l'exception du premier qui doit demeurer à -1).

Le filtre devra s'adapter au signal présent sur la première entrée de la carte constituée d'une ou plusieurs fréquences pures (signal carré par exemple). La première sortie devra délivrer l'erreur de prédiction.

Si elles sont présentes, les deuxièmes entrée et sortie de la carte pourront être utilisées pour observer les caractéristiques fréquentielles du filtre adaptatif grâce à l'analyseur de spectre. Pour que cela soit possible, il faudra évidement que le programme effectue également le filtrage de la deuxième entrée et délivre le résultat sur la deuxième sortie.

Si la carte de dispose pas d'une seconde sortie, on pourra arrêter l'adaptation au bout d'un certain temps (tout en maintenant le filtrage) de façon à analyser les caractéristiques du filtre après adaptation (générateur BF et oscilloscope en mode FFT). Une seconde manière plus élégante pour analyser les caractéristiques fréquentielles du filtre consiste à créer en interne un signal évoluant linéairement en fréquence depuis 0 jusque

Fe2 et de délivrer en sortie de la carte ce signal après filtrage.

A titre indicatif, voici comment peut être généré le signal évoluant en fréquence :

(14)

#include <math.h>

void Process(float *io) {

static float f=0,ft=0,df=2.0/8000;

if((f+=df)>=0.5) f=0.0;

ft+=f;

if((ft+=f)>=1.0) ft=0.0;

*io=sinf(2*pi*ft);

}

Observations

Observer le comportement du filtre adaptatif en fonction du signal d'entrée (sinusoïdal, carré, …), du pas d'adaptation et de la dimension du filtre. Commenter.

Comparer aux résultats obtenus avec un algorithme plus sophistiqué des moindres carrés récursif dont le programme est contenu dans le fichier mcr.c. Commenter.

(15)

- TP DSP -

- Egalisation Aveugle -

Préparation

Lire attentivement et entièrement le texte. Préparer les codes des différentes fonctions C nécessaires à la réalisation du TP. Préparer les réponses aux questions auxquelles il faudra répondre dans le compte-rendu.

Compte-rendu

Le compte-rendu comprendra les préparations (2 par binômes), les listings des différents programmes, et les réponses aux différentes questions.

Introduction

Le but du TP est de simuler en temps réel une chaîne de transmission de données :

Pour cela, le kit de développement Texas est muni d’une carte fille munie de deux entrées et de deux sorties. L’échantillonnage est effectué à 22 kHz.

Dans le cadre du TP : L’entrée 1 est utilisée éventuellement pour recevoir les symboles à transmettre (données). La sortie 1 est utilisée pour délivrer le signal dégradé en sortie du canal après ajout du bruit.

L’entrée 2 est utilisée pour recevoir le signal dégradé (sortie 1 sur entrée 2). Enfin la sortie 2 est utilisée pour sortir le signal égalisé.

Génération des données

Il s’agit d’un train binaire (0 et 1 aléatoires) codé en NRZ (Non Retour à Zéro) : Les 0 et les 1 sont transmis respectivement sous forme d’une tension –V et +V.

Si le générateur de tension disponible dans le cadre du TP est capable de délivrer un tel signal, on pourra l’utiliser. Il faudra le régler de façon que le rythme des symboles (0 et 1) soit acceptable (Fe/8 par exemple) et que la tension délivrée soit adaptée à la carte de traitement (±1V par exemple).

Si le générateur de tension n’est pas capable de délivrer un tel signal, il faudra programmer la carte de traitement pour générer le signal en interne. Pour obtenir une grandeur aléatoire, utiliser la fonction rand() qui délivre une valeur entière aléatoire comprise entre 0 et RAND_MAX (fonction et constante définies dans stdlib.h). Attention, il ne faut pas modifier la valeur du signal généré à chaque nouvel instant

d’échantillonnage car le rythme symbole doit être inférieur à la fréquence d’échantillonnage (Fe/8 par exemple). Par souci de clarté, on isolera le code responsable de la génération des symboles dans une fonction :

int GetSymbole() { … }

Le bon fonctionnement de la génération des données sera vérifié en transmettant provisoirement les symboles sur la première voie en sortie de la carte de traitement. Observer alors le signal obtenu (il s’agit d’un signal aléatoire qu’il convient d’observer en réglant correctement l’oscilloscope). Faire varier le rythme symbole. Justifier l’allure du signal (après avoir établi sa densité spectrale de puissance). Remarquer sa dissymétrie et proposer une explication.

Canal

Il s’agit de simuler l’action du canal de transmission (ligne, propagation, etc.) par un filtre. Ici, le signal est transmis en bande de base comme dans le cas d’une transmission sur ligne (il n’y a pas de fréquence porteuse comme en radio). On adoptera donc comme modèle de canal celui généralement retenu pour une ligne de transmission :

Données estimées

Canal Egaliseur

Données

Bruit

(16)

1 1

) 1

(

= − Z Z

C α

où α est une valeur proche de 1.

Comment doit être choisi α pour que ce modèle fonctionne ? Donner l’allure de la réponse en fréquence pour α =0.9. Calculer alors la puissance du signal en sortie du canal. Et proposer une estimation grossière de sa densité de probabilité. En déduire le facteur d’échelle qu’il convient d’appliquer au signal pour le délivrer en sortie de la carte de traitement sans saturation.

Programmer la fonction de filtrage : x=Canal(s);

où s et x sont respectivement le symbole courant et le signal en sortie du canal.

Observer le signal en sortie du canal en le transmettant en sortie de la carte. Justifier son allure.

Bruit

Il s’agit de simuler une dégradation du signal par un bruit additif gaussien. La seule fonction disponible dans le DSP pour obtenir une valeur aléatoire est la fonction rand(). Celle-ci fournit une valeur aléatoire entière uniformément répartie entre 0 et RAND_MAX. Proposer une méthode utilisant cette fonction et produisant une valeur aléatoire gaussienne centrée de puissance unité. Programmer cette fonction. Vérifier son bon fonctionnement en délivrant le bruit produit en sortie de la carte. Enfin, utiliser la fonction pour bruiter le signal en sortie du canal de façon à obtenir un rapport signal à bruit de 20 dB :

x=x+gamma*randn() ; Où gamma est l’amplitude du bruit.

Délivrer le signal dégradé sur la première sortie de la carte. Vérifier le résultat en observant le signal.

Egalisation

Il s’agit de traiter le signal dégradé obtenu sur la première sortie de la carte et rebouclé sur la deuxième entrée avec un filtre adaptatif de façon à obtenir un signal exploitable ; c’est-à-dire, un signal qui puisse être seuillé pour déterminer les données initialement transmises.

Le filtre adaptatif est un filtre à réponse impulsionnelle finie :

=

= 1

0

) ( ).

( )

( N

i

i n x i w n

y

Son adaptation est réalisée avec l’algorithme du gradient stochastique (LMS : Least Means Squares) grâce à une séquence d’apprentissage.

Normalement, la séquence d’apprentissage est constituée d’une certaine quantité de symboles aléatoires.

La séquence est émise en début de transmission (juste avant d’émettre les symboles constituant le message utile). La séquence est distordue et bruitée dans le canal physique. Lorsque la séquence est reçue, l’égaliseur qui connaît la séquence émise s’adapte en réglant les coefficients du filtre de façon à obtenir un signal le plus proche possible du signal émis : la séquence. Lorsque la séquence prend fin, l’égaliseur est normalement adapté : le filtre obtenu est satisfaisant. Ce dernier est alors utilisé pour traiter les symboles inconnus dégradés par le canal. Lorsque les caractéristiques du canal varient dans le temps, l’égaliseur doit être recalculé périodiquement ; ce qui nécessite à chaque fois l’émission d’une séquence d’apprentissage. L’émission de séquences d’apprentissage diminue le débit utile de la transmission. D’autre part, l’utilisation de séquences d’apprentissage n’est pas aisée du fait de la synchronisation nécessaire entre l’adaptation de l’égaliseur et la réception des séquences (l’égaliseur doit s’adapter lorsque le signal d’apprentissage est reçu). Cette synchronisation est obtenue généralement en observant l’intercorrélation entre la séquence et le signal reçu. Le calcul de cette intercorrélation représente un coût non négligeable.

Ces différents inconvénients ont conduit au développement de nouvelles techniques dites « aveugles » en ce sens qu’elles opèrent l’égalisation du signal en absence de séquences d’apprentissage.

C’est une de ces techniques que nous allons utiliser dans le cadre de ce TP.

CMA (Constant Modulus Algorithm)

L’idée est extrêmement simple : le signal émis est constitué de valeurs ±1 (à un facteur d’échelle près). Il convient donc d’adapter le filtre égaliseur de façon à obtenir un signal analogue en sortie. Est-ce une condition suffisante pour obtenir un signal de sortie correspondant au signal émis. La réponse est oui car s’il subsistait de l’interférence inter-symboles, alors en vertu du caractère aléatoire des symboles

) (n e

) (n d )

(n y

(17)

(indépendance), le signal résultant (combinaison linéaire des symboles émis du fait d’une mauvaise adaptation de l’égaliseur) serait plus dispersé (théorème centrale limite).

Cette propriété est exploité en utilisant le schéma d’adaptation suivant :

Le signal désiré d(n) est obtenu en « décidant » le signal en sortie de l’égaliseur.

Lorsque l’égaliseur est adapté, à un instant donné, le signal de sortie y(n) est proche d’un symbole unique (l’interférence inter-symboles est faible). La fonction non-linéaire de décision a de grandes chances de déterminer la valeur initiale du symbole (la probabilité d’erreur est faible). Le signal d(n) constitue alors un très bon signal désiré (au même titre qu’un signal d’apprentissage). Bien sûr, à certains instants, du fait du bruit, la décision sera incorrecte. L’utilisation du signal d(n) conduira alors à une mauvaise correction de l’égaliseur. Mais si l’égaliseur est déjà correctement adapté (transmission établie), ces instants de

mauvaises décisions sont en très faible nombre (moins de 1 pour 1000 typiquement si la transmission est exploitable) et donc sans conséquence. Cette façon de procéder offre l’avantage non négligeable d’assurer une adaptation continuelle au canal de transmission (et non plus pendant les seules séquences

d’apprentissage).

La seule question qui subsiste concerne « l’amorçage » du système. Il n’est pas facile de répondre à cette question. Le plus simple, dans le cadre de ce TP, est de programmer la technique et de déterminer dans quelle mesure elle fonctionne. Nous verrons en particulier qu’elle est très sensible à la façon d’initialiser les coefficients du filtre égaliseur.

Programmer la technique dans une fonction :

y=Cma(x2); /* x2 : signal provenant de la seconde entrée */

Le code est analogue à celui mis au point pour la prédiction linéaire. Seul le signal désiré est différent. Dans le cas de la prédiction linéaire, c’était le signal présent en entrée du filtre prédicteur. Désormais, il s’agit du signal de sortie du filtre décidé :

if(y>0) d=1; else d=-1;

Initialisation : on initialisera l’ensemble des coefficients du filtre à 0 à l’exception du coefficient central qu’on initialisera à 1. Le pas d’adaptation sera choisi très petit : 0.001 ou 0.0001.

A l’issue de la programmation de cette dernière fonction, la fonction Process devrait présenter l’allure suivante :

void Process(float io[2]) { float s;

s=GetSymbole();

io[0]=Canal(s)+0.0*randn();

io[1]=Cma(io[1]);

}

Délivrer le signal égalisé sur la seconde sortie de la carte. Comparer ce signal au signal en sortie du canal délivré par la première sortie. Régler l’oscilloscope de façon à obtenir le diagramme de l’œil. Le représenter et indiquer à quel instant et avec quel seuil le signal doit être décidé pour identifier les valeurs des symboles émis.

Observer l’ouverture de l’œil en fonction du bruit, du pas d’adaptation et de la façon d’initialiser les coefficients du filtre. Commenter.

+1

) (n e

) (n d )

(n y

-1

Références

Documents relatifs

En partie 5 du fichier TD7_Etudiant.sce, écrire l’instruction faire appel à la fonction filtre(mesure, te, tau) pour construire la variable signal_filtre, en précisant la

Calculer les 16 échantillons d'une période du signal x (n ) ainsi obtenu. 6) Calculer la puissance de l’erreur de quantification ainsi que le rapport signal à bruit en linéaire

Calculer les 16 premiers échantillons du signal x (n ) ainsi obtenu. 2) Expliquer pourquoi la méthode suivie dans le devoir 1 pour améliorer le rapport signal à bruit

13) Etablir une méthode dans le cadre de ce signal plus riche permettant de passer d’une fréquence d’échantillonnage de 32 kHz à une fréquence d’échantillonnage de 48

Calculer les 16 premiers échantillons du signal x (n ) ainsi obtenu. 2) Expliquer pourquoi la méthode suivie dans le devoir 1 pour améliorer le rapport signal à bruit

Calculer les 16 premiers échantillons du signal x (n ) ainsi obtenu. 2) Expliquer pourquoi la méthode suivie dans le devoir 1 pour améliorer le rapport signal à bruit

L'interpolateur idéal reconstitue le signal entre les échantillons; en raisonnant dans le domaine des fréquences, on remarque que cette information peut être extraite

Donner la réponse impulsionnelle de ce filtre puis l’équation permettant de calculer le signal de sortie y (n ) à partir du signal d’entrée x (n )?. L’amplitude des