Introduction :


Lorsqu'on utilise des capteurs, tel que des photos transistor, il arrive régulièrement qu'on ait des parasites. Une solution simple serai de tenté d'ajouter une cellule RC pour faire un filtre passe pas analogique. Cette solution fonctionne, mais l'électronique de votre robot sera dégelasse. Par contre si vous utilisez un micro contrôleur il a une solution qui vous permettra de ne pas sortir votre fer à souder, il suffit de réaliser un filtre numérique.

Visualisation des défauts :




On peux observé que le sinus est parasité. Pour supprimé ces parasites, il faudrait utilisé un filtre passe bas. Je vous propose de le réalisé numériquement, avec des algorithmes simple sans les calculs car ils demandent des outils mathématique tel que les transformées en Z.

Filtrage linéaire :


Sn=(En+E(n-1)+E(n-2)+E(n-3) ...)/(nombre de thermes)




L'image en sortie est un peu moins parasitée, au plus on augmente le nombre de thermes plus on diminue la bande passante de notre filtre passe bas, donc l'influence de ses parasites se feras moins ressentir.


En binaire:


Pour réaliser un filtre en binaire, il suffit de faire la même chose. Et surtout choisir un nombre de thermes impaire, si le nombre de 1 est plus grand que le nombre de 0, sortie =1, si s'est l'inverse sortie=0.

Filtre non linéaire


J'ai découvert cette solution il a peu de temps en traitement d'image, sous le nom de filtre médian, elle utilise beaucoup plus de ressources mais en pratique les résultat sont intéressant. Vu les ressources que demande cette technique, je pense que je n'utiliserai jamais cette technique sur mes robots.

Le signal d'entrée :



Le signal de sortie du filtre non linéaire:




Juste pour information, voici la réponse avec le même filtre que tout a l'heure :




Comme on peux l'observer les parasites ont totalement disparu, tout s'explique par le programme :

Pour réalisé ce filtre :


Prendre les valeurs numériques dans un tableau (ici on a pris 9 valeurs)

73 43 123 73 255 81 63 53 42


Ensuite il faut les ranger ces valeurs par ordre croissant :

42 43 53 63 73 73 81 123 255


Prendre ensuite la valeur du milieu, soit ici 73, se sera donc la valeur filtrée.

Je pense que vous avez tous compris pourquoi se filtre est génial , on ne prend pas en compte les valeurs mais uniquement les positions. Je n'utiliserai pas se type de filtre sur mon robot car sur mon pc ce filtre prend 7 fois plus de temps d'exécution.

Programme




Ce programme a été réalisé avec l'outil MATLAB, car s'est un logiciel de test, et permet de faire des joli graphes. Mais je ne vous le recommande pas pour travailler sur vos robots ,a moins que vous souhaitez réalisé des fonctions compliquées et vous avez besoin de voir si votre algorithme fonctionne ... (niveau école d'ingénieur...)

Malheureusement, vous remarquerai que se n'est pas vraiment du C ( même si sa y ressemble ) vous ne pourrais pas faire de copier coller , mais vous devriez pouvoir facilement le modifier...


A savoir sur Matlab
% = commentaire
plot et figure sont des fonctions qui permettent l'affichage des graphes.
ceil: arrondi a l'entier supérieur
rand: nombre aléatoire entre 0 et 1

  1. %génération d'un sinus parfait
  2. t=[0:0.001:2*pi];
  3. y=sin(t);
  4. nombre = size(y,2)
  5. %génération des erreurs aléatoire
  6. for(i.html">i=1:30)
  7.     nb=ceil(rand()*nombre);
  8.     y(nb)=y(nb)+5;
  9. end
  10.  
  11. for(i.html">i=1:30)
  12.     nb=ceil(rand()*nombre);
  13.     y(nb)=y(nb)-5;
  14. end
  15. plot(y)%voir la sortie avec les erreurs
  16.  
  17. % Filtrage linéaire ( avec 11 valeurs )
  18. for(i.html">i=11:nombre)
  19.     ys(i.html">i)=(y(i.html">i)+y(i-1)+y(i-2)+y(i-3)+y(i-4)+y(i-5)++y(i-6)+y(i-7)+y(i-8)+y(i-9)+y(i-10))/11;
  20. end
  21.  
  22. plot(ys)%observer la sortie filtré
  23.  
  24. %filtre non linéaire
  25. for(i.html">i=5:nombre)
  26.     %création du tableau a classer
  27.     for(j.html">j=0:4)
  28.         tab(j.html">j+1)=y(i-j.html">j);
  29.     end
  30.     n=5;
  31.     %programme pour mettre en ordre les tab
  32.  
  33.  
  34.     for(k=2:n)
  35.        while(tab(k-1)>tab(k))
  36.            data=tab(k);
  37.            tab(k)=tab(k-1);
  38.            tab(k-1)=data;
  39.            k=k-1;
  40.            if(k <= 2)
  41.                k=2;
  42.            end
  43.        end
  44.     end
  45.     %Remplacement de la valeur par la nouvelle.
  46.     pos=((n-1)/2)+1;
  47.     ys2(i.html">i)=tab(pos);
  48. end
  49. plot(ys2)%observer la sortie filtré non linéairement


Matthieu

© robot-amateur.com - Tous droits réservés. Reproduction interdite sans autorisation.