IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Algo de "lissage" d'une valeur


Sujet :

C#

  1. #1
    darkloy
    Invité(e)
    Par défaut Algo de "lissage" d'une valeur
    Bonsoir à tous,

    J'aurais besoin d'aide sur un algo assez simple dans le concept, mais dans le code je cherche vraiment à faire quelque chose de simple et efficace.

    J'ai une méthode appelée X fois par seconde (un peu comme si elle étais dans un simple while()) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private float setValue(float val){
     
    }
    Il me faut que cette fonction me "lisse" la valeur en paramètre. C'est la que j'espère être assez clair.
    Exemple :
    1/10 s -> setValue(0.1) -> 0.1
    2/10 s -> setValue(0.2) -> 0.2
    3/10 s -> setValue(0.5) -> 0.3
    4/10 s -> setValue(0.9) -> 0.7
    5/10 s -> setValue(4) -> 1.2
    8/10 s -> setValue(0.5) -> 0.9

    comme valeur de sortie j'ai mis un peu n'importe quoi. Il faut grosso modo que si mes valeurs d'entrées diffèrent énormément les une des autres, que j'ai en sortie une sorte de courbe qui colle au max aux valeurs d'entrées tout en restant un minimum lisse.

    Je pourrais garder l'avant dernier paramètre, et renvoyer une moyenne avec le nouveau paramètre mais c'est pas top et je pense que l'on peux peut être faire mieux, mais je ne dois pas être calé assez en math...

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Une fonction de lissage simple pourrait se calculer ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Valeur_Lissee(i)= coeffN * V(i-n) + .... + Coeff1 * V(i-1) + Coeff0 * V(i) + Coeff1 * V(i+1) + ... + CoeffN * V(i+n) 
    Valeur_Lissee(i)= Valeur_Lissee(i) / (1 + 2 *Coeff1 + ... 2*CoeffN)
    On paramétrera le lissage en définissant La largeur de l'intervalle [-n..+n] à considérer, ainsi que les coefficients à appliquer aux valeurs de l'intervalle en fonction de la proximité avec le centre de l'intervalle.

    Il faudra aussi définir ce qu'on fait aux bornes quand V(i+x) ou V(i-x) n'existent pas. Par exemple: si (i-X<0), V(i-X)=V(0) ou plutot faire le calcul avec un coefficient 0 pour V(i-X).

  3. #3
    darkloy
    Invité(e)
    Par défaut
    Merci à toi Graffito!

    En fait j'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    using System.Collections;
    using System.Collections.Generic;
     
    public class Util {
     
    	public static List<float> valList = new List<float>();
    	public static float smoothFilter(float val, int filterWidth){
     
    			// Pour conserver filterWidth on supprime la valeur au premier index
    			if(valList.Count == filterWidth)valList.RemoveAt(0);
    			// On ajoute la valeur dans la liste
    			valList.Add(val);
     
    			// On récupère la somme
    			float som=0f;
    			for(int c=0;c<valList.Count;c++)
    								som+=valList[c];
     
    			// On calcule la moyenne
    			return (som/filterWidth);		
     
    	}
    }
    Ça a l'air de faire son boulot
    La largeur de l'intervalle est filterWidth
    Si aux bornes ça n'existe pas ça prends donc 0

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo