Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

[C] - Fonction de calcul de moyenne / détection de MAX / MIN



  1. #1
    jorg1n

    [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Bonjour,
    dans le cadre de traitement de signal, je récupère 10 valeurs (type long) et je souhaite retirer les valeurs MIN et MAX de ces 10 valeurs et ensuite calculer la moyenne des 8 restantes....

    Et je souhaitai donc savoir si il était possible de réaliser cela avec un PIC...et bien sur existe t'il des fonctions prédéfinies??

    Merci d'avance

    -----


  2. Publicité
  3. #2
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    En fait, je pense qu'il serait peut être intéressant de:
    - stocker les 10 valeurs dans un tableau
    - déterminer la valeur MIN (1 ou 2 )
    - déterminer la valeur MAX (1 ou 2)
    - calculer la moyenne des 6 ou 8 restantes

    Par contre comment faire...
    J'ai un peu de mal avec les tableaux en C...alors si on pouvait m'aider un peu

    Par contre j'ai trouvé ça:

    Code:
    int min(int *tab,unsigned int taille){
      unsigned int i;
      int min=tab[0];
      for(i=1;i<taille;++i){
         if (tab[i]<min){
            min=tab[i];
         }
      }
      return min;
    }
    ce qui est un bon début je pense...

    Merci d'avance

  4. #3
    Seb.26

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    un truc comme ça ?

    Code:
    long data[10];
    
    ...
    
    // Remplissage du tableau data[]
    // data[0]= 
    // data[1]= 
    // ...
    // data[9]= 
    
    ...
    
    long calculMoyenne_8()
    {
      long long value = 0;
      long max = 0;
      char max_pos;
      long min = 0x7FFFFFFF;
      char min_pos;
      char pos;
    
      for( pos=0 ; pos<10 ; pos++ )
      {
        if( data[pos] > max )
        {
          max = data[pos];
          max_pos = pos;
        }
        if( data[pos] < min )
        {
          min = data[pos];
          min_pos = pos;
        }
      }
    
      for( pos=0 ; pos<10 ; pos++ )
      {
        if( (pos!=min_pos) && (pos!=max_pos) )
        {
          value += data[pos];
        }
      }
      //
      return( (long)(value>>3) );
    }
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  5. #4
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Je te remercie,

    j'avais fais quelquechose de similaire, mais plus long je pense:
    Code:
    long min(long *tab,unsigned int taille)
    {
      unsigned int i;
      long min=tab[0];
      for(i=1;i<taille;++i){
         if (tab[i]<min){
            min=tab[i];
         }
      }
      return min;
    }
    
    
    long max(long *tab,unsigned int taille)
    {
      unsigned int i;
      long max=tab[0];
      for(i=1;i<taille;++i){
         if (tab[i]>max){
            max=tab[i];
         }
      }
      return max;
    }
    
    long som(long *tab,unsigned int taille)
    {
      unsigned int i;
      long som=tab[0];
      for(i=1;i<taille;++i){
            som+=tab[i];
         }
      return som;
    }
    et dans mon main:
    Code:
     
    long SampleIAN[10];
    long ISampleMIN, ISampleMAX, ISampleSOM, IAverage;
    [...]
    
    ISampleMIN=min(SampleIAN,10);
     ISampleMAX=max(SampleIAN,10);
     ISampleSOM=som(SampleIAN,10);
     ISampleSOM = ISampleSOM-(ISampleMAX+ISampleMIN);
     IAverage = ISampleSOM/8;
    Et ça marche bien aussi...

  6. #5
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Autre question maintenant, j'espère que je vais réussir à m'expliquer correctement...

    si je récupère 10 échantillons (voir 15 ), et que je souhaite seulement garder les échantillons qui reviennent le plus souvent avec une "marge d'erreur ", et que je fasse ensuite une moyenne seulement avec les échantillons garder...comment faire??

    j'espère avoir été clair pas facile à expliquer.

    Merci encore Seb.26 pour tes connaissances pointues dans ce domaine...

  7. A voir en vidéo sur Futura
  8. #6
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Oh...la prise de tête...

    Impossible de retranscrire ce que je veux faire en C...
    Alors avis aux amateurs, si quelqu'un peut me donner un petit coup de pouce pour réaliser ce que je souhaite:

    Dans un tableau de 15 échantillons (type long), récupérer tous les échantillons ayant une valeur semblables à + ou - 2 ... et en faire la moyenne..

    Merci encore pour vos conseils...

  9. Publicité
  10. #7
    Seb.26

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Dans un tableau de 15 échantillons (type long), récupérer tous les échantillons ayant une valeur semblables à + ou - 2 ... et en faire la moyenne..
    Ce que tu cherche à faire commence de plus en plus à ressembler aux grands classiques des calculs de stats ...

    Pas évident ça, il va falloir que tu simplifies un peu je pense, ton PIC va péter une durite !
    ça donnerait en gros :

    Si je te suis bien, le but est d'éliminer les valeurs trop "exotiques" ... par exemple tu pourrais calculer la moyenne de TOUS les échantillons, et exclure ceux qui en sont trop loin (+/-2 par exemple ) ... ensuite, tu refais ta moyenne avec seulement les valeurs retenues.

    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #8
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Pas évident ça, il va falloir que tu simplifies un peu je pense, ton PIC va péter une durite !
    C'est clair... et moi aussi par la même occasion!!!

    Trêve de plaisanterie...

    Si je te suis bien, le but est d'éliminer les valeurs trop "exotiques" ...
    Exactement...

    Et ta proposition me parait pas mal... je vais donc réfléchir sur la mise en oeuvre...
    Et si par la même occasion, un statisticien passait par là (ce qui m'étonnerait pas mal...) je suis là!!!

    Merci encore Seb.26

  12. #9
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Je voudrais juste apporter une petite précision, je pense qu'il serait plus judicieux de supprimer dès le début les valeurs MIN et MAX et stocker donc le reste dans un tableaux de 13... on calcul ensuite la moyenne des 13, on aura une référence plus précise donc et on supprime ensuite tous les échantillons qui sont éloignées de +/- 2...et on calcul ensuite la moyenne des restants...

    C'est peut être mieux comme ça... (j'ai juste rajouté l'exclusion des 2 MIN et MAX au début...)

    Merci de ton aide

  13. #10
    lil-vince

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Salut,

    Je ne comprend pas oú est ton problème, tu vires les min et max en les déterminant avec une boucle comme t´as fais ci-dessus puis tu fais une boucle dans laquelle tu compares chaque valeur avec la suivante et si la suivante est différente de plus de 2, tu la vire (décalage des valeurs du tableau).

    Le seul problème est au niveau de la référence de comparaison, si la première valeur de ton tableau est "exotique", tu vas virer toutes les suivantes parcequ´elles sont trop éloignées. Ce que tu peux faire, c´est faire la moyenne de tes 13 échantillons et virer tous ceux qui sont à plus que 2 d´écart avec celle-ci...
    Ou alors te servir de la dernière valeur filtrée sortie comme base de comparaison.

    Je peux te demander le but de tout ça? Si c´est pour filtrer un signal, à mon avis c´est mieux d´utiliser un filtrage classique FIR (plus simple = moyenne glissante) ou IIR
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  14. #11
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Bonjour,

    J'ai choisi finalement par faire la dernière solution que m'a proposé Seb.26, et ça marche....presque...


    Je peux te demander le but de tout ça? Si c´est pour filtrer un signal
    Exactement...

    à mon avis c´est mieux d´utiliser un filtrage classique FIR (plus simple = moyenne glissante) ou IIR
    Ou est ce que je peux trouver des infos sur ces deux techniques?? Seb.26 m'a déja parlé de moyenne glissante...

    Merci encore

  15. #12
    lil-vince

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Ou est ce que je peux trouver des infos sur ces deux techniques?? Seb.26 m'a déja parlé de moyenne glissante.
    Ce sont des filtres numériques:
    FIR: Finite impulse response = filtre à réponse impulsionnelle finie
    IIR: Infinite impulse response = filtre à réponse impulsionnelle infinie

    La différence est qu´avec un FIR, au bout d´un certain nombre d´échantillons (en fonction de ta fréquence de coupure et de l´ordre) si ton signal est stable, il atteindra exactement la valeurs d´entrée.

    Avec un IIR, en théorie, tu n´atteind pas la valeur d´entrée, mais tu t´en rapproche de plus en plus (mais en pratique, avec les arrondis, tu l´atteinds)
    C´est dû au fait que ce sont des filtres récursifs (qui prennent en compte dans les calculs la (ou les) précédentes valeurs de sortie de ton filtre). Son avantage est que pour un même résultat, il y a moins besoin de calculs avec un IIR qu´avec un FIR. Mais la réponse d´un IIR peut être instable (oscillations) alors qu´un FIR est inconditionnellement stable.

    Le plus simple à réaliser est un FIR moyenne glissante: tu fais une moyenne sur x échantillons (x à définir selon le temps de réponse souhaité) et tu décales ta moyenne d´un seul échantillon à la fois (on fait "glisser" la moyenne)

    Par exemple (il y a plusieurs méthode pour le réaliser, celle-ci n´est pas optimisée mais plus claire):

    Code:
    ptr=0;
    while (1)
    {
       Somme = 0;
       tab[ptr] = Data_in; // récupération de la nouvelle valeurs
    
    /*Addition de toutes les valeurs du tableau*/
       for (ptr2=0;ptr2 < x;ptr2++)
          Somme+= tab[ptr];   
    
       Data_out = Somme/x;  // Data_out = moyenne sur x valeurs
    
       ptr++;   // Incrémentation du pointeur tableau
       if (ptr == x )  // Si on sort du tableau, on revient au début
       ptr = 0;
    }
    Ce code réalise une moyenne sur x valeurs puis remplace la plus ancienne valeurs de ton tableau par la nouvelle et refais la moyenne, et ainsi de suite...

    PS:Lá il est dans une boucle infinie, mais ca n´est pas forcément utile, c´est pour donner l´idée de redondance.
    A chaque fois que tu récupères une nouvelle valeurs (Data_in), tu fais ca et tu utilises Data_out comme valeurs filtrée.

    Choisis x en fonction du temps de réponse que tu souhaites (temps de réponse max = x*periode d´échantillonnage)

    Sinon, pour trouver des infos, ca ne doit pas manquer:
    http://www.google.fr/search?hl=fr&q=...chercher&meta=
    Dernière modification par lil-vince ; 13/05/2009 à 09h57.
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  16. Publicité
  17. #13
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Merci lilvince pour ces informations complètes, je vais donc voir tout ça...

    en fait, je souhaite réaliser cela car la valeur issu de mon convertisseur A/D (MCP3204) bouge pas mal: voir sujet :
    http://forums.futura-sciences.com/el...n-mcp3204.html

    et j'ai essayé de brancher en parallèle sur l'entrée analogique de mon convertisseur un condensateur de 1µF chim. et là, beaucoup moins de variations, donc je suppose qu'un peut de filtration ne peu pas faire de mal, mais quoi mettre?? une cellule RC 4K7 / 100nF??
    Ensuite, un peu de filtrage numérique et normalement, HOP le tour est joué...

    Merci d'avance

  18. #14
    lil-vince

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Salut,

    Pour ton convertisseur A/D:

    As-tu un découplage sur les alims de: LT1787, tes AOPs, ton ADC?
    Ou est ton filtre anti-repliement pour l´ADC?

    Ensuite, pour déterminer un filtre (qu´il soit analogique ou numérique), il faut définir d´abord la bande passante de ton signal.

    Comme t´as conseillé carcan, sur Vref: un 10nF en // avec un 1µF.
    Ensuite, ça dépend beaucoup de ton cablage/routage (selon la longueur des pistes, la proximité de circuits qui peuvent perturber ta mesure, etc...). Si les pistes/fils d´alims sont longs, ne pas hésiter à mettre du 1µF en // avec du 10nF ou 100nF toujours au plus pres de son "arrivée".

    Pour le fitlrage de ta mesure, au vu de ton schéma, tu as plusieurs endroits préférables (de mon point de vue):
    -Un condo en entrée de l´AOP (sur l´entrée V+ juste après R14, R18 et R22) créera un filtre passe-bas par le couple RC en entrée de l AOP.
    -Un condo en // avec la résistance de contre réaction (R16, R20, R24) créera aussi une cellule RC

    L´avantage de les mettres ici, c´est qu´ils forment des filtres PB actifs (suivis d´un AOP).

    Ensuite, selon la distance entre la sortie des AOP et l´ADC, un ou plusieurs condo de découplage sur chaque entrée de l´ADC (toujours au plus près des pins).

    Et toujours le même raisonnement: Si ta piste qui amène le 2,5V sur l´entrée V- des AOP est longue->découplage.
    Si tu utilises des fils->découplage.

    D´après ton message 16 de l´autre discussion, tu te demande si la communication (ADC->PIC) est correcte, c´est à vérifier à l´oscillo, en général, ce genre de liaison n´aime pas trop les fils (dépend de la distance et de l´environnement et de la vitesse de communication)...
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  19. #15
    lil-vince

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    D´ailleurs, je veinsd´aller voir la doc de ton ADC, à partir de la page 21, ils donnent apparemment pas mal d´indications sur comment l´interfacer avec un µC avec la SPI, comment filtrer (lien vers une doc plus complète) et quelques recommendations de routage...

    Comme je dit souvent, il ne faut pas hésiter à lire le plus de note d´appli ou autre sur un sujet quand on a des doutes...

    Mais aussi, quand on utilise un ADC, il faut avoir le réflexe du découplage/filtrage fréquent: par exemple, le condo sur Vref, c´est obligatoire, comme le découplage des alims et le filtre anti-repliement en entrée de l´ADC!
    Et toujours des pistes les plus courtes possible, éloigner/séparer le plus possible les pistes numérique (surtout HF) des pistes analogiques... Et des condos partout ...
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  20. #16
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Bonjour lil-vince,

    et un grand MERCI pour toutes ces informations, je vais étudier tout ça...

    As-tu un découplage sur les alims de: LT1787, tes AOPs, ton ADC?
    Oui OUi, des petits 100nF à chaque alimentation de chaque composants...

    Ou est ton filtre anti-repliement pour l´ADC?
    Oups... un peu d'informations là dessus, que faut il mette et comment le dimenssionner??

    Et j'ai une dernière question, comment déterminer la BP de mon signal??

    Bon sinon, pour le filtrage en entrée de l'ADC, avant ta réponse, j'ai testé avec un montage RC (4K7 / 1µF)(la R est elle nécessaire??), le résultat est assez correct et sans filtrage numérique.. Alors dois le remplacer ou ajouter les Condentateurs autour des AOPs?

    Pour le moment, le convertisseur est en Fil volant reliés sur ma carte, mais au final, le routage sera nikel...

    Merci encore pour tout aide lil-vince...

  21. #17
    lil-vince

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Oups... un peu d'informations là dessus, que faut il mette et comment le dimenssionner??
    Lis les docs que conseil microchip, sinon, tu mets en général Fc = Fech/4 si tu n´es pas trop critique.

    Et j'ai une dernière question, comment déterminer la BP de mon signal??
    C´est à toi de définir ton besoin en fonction du temps de réponse que tu veux... Plus ta fréquence de coupure va être faible, plus il faudra du temps à ta sortie pour afficher un changement (lis des docs sur les filtres si ça n´est pas clair) et après pour un simple RC: Fc = 1/(2*pi*R*C)

    Bon sinon, pour le filtrage en entrée de l'ADC, avant ta réponse, j'ai testé avec un montage RC (4K7 / 1µF)(la R est elle nécessaire??), le résultat est assez correct et sans filtrage numérique.. Alors dois le remplacer ou ajouter les Condentateurs autour des AOPs?
    Oú l´as tu mis?
    si c´est après l´AOP, commme je t´ais dit, il est preférable de les mettre avant (lá oú je t´ais conseillé) et de mettre juste un condo au plus près de l´entrée de l´ADC pour éviter les chutes de tension aux borne de la résistance du filtre quand ton ADC charge ses condo de sample & hold.

    Il faudrait que tu apprennes ce qu´est un filtre et comment ça marche, je ne peux pas tout t´expliquer ici...

    Pour le moment, le convertisseur est en Fil volant reliés sur ma carte, mais au final, le routage sera nikel...
    Juste pour te le dire, ça va surement changer tes résultats, ça peu les empirer comme les améliorer (si tu fais un bon routage, surtout avec un plan de masse, ça devrait les améliorer), suits les infos données par les docs...

    T´as lu les pages 21, 22, 23 et 24 et les docs qu´ils conseillent de lire?
    http://ww1.microchip.com/downloads/e...Doc/21298e.pdf
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  22. #18
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Oui, j'ai mis mon filtre après mon ampli, donc si je récapitule:
    -un condensateur (100nF ou 1µF) sur V+ de chaque AOPs
    -un condensateur (100nF ou 1µF) à l'entrée de chaque entrée du convertisseur AD
    -un condensateur en parallèle de la résistance de contre réaction de mes AOP...

    Bon et pour le reste ... les filtres en général, je vais replonger dans des cours je crois... et bien lire la doc...

    Merci encore pour ton aide lil-vince et bonne journée à toi
    Dernière modification par jorg1n ; 14/05/2009 à 09h03.

  23. Publicité
  24. #19
    lil-vince

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Oui, j'ai mis mon filtre après mon ampli, donc si je récapitule:
    -un condensateur (100nF ou 1µF) sur V+ de chaque AOPs
    -un condensateur (100nF ou 1µF) à l'entrée de chaque entrée du convertisseur AD
    Non, les 100nF et 1µF c´est pour les alims (et Vref)!

    Pour V+ (apres R) et celle en parallèle de ta R de contre reaction, il faut le calculer en fonction du temps de reponse que tu veux avoir (bande passante) et avec Fc = 1/(2*pi*R*C)
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  25. #20
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    OK OK...je vais donc travailler la dessus, merci encore pour ta patience

    Bonne journée a toi

  26. #21
    lil-vince

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Après t´est pas obligé de te prendre la tête, c´est quoi ta fréquence d´échantillonnage?

    Ça sert à quoi au final ta mesure? (afficheur, régulation?)

    Tu peux essayer un peu au hasard et voir la stabilité de ton signal et s´il est trop lent ou assez rapide...
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  27. #22
    lil-vince

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Comme t´as des résistances de faible valeurs, pour avoir une fréquence de coupure basse (pour avoir le moins de bruit possible), il faut des gros condos.

    Si tu mets du 1µF en parallèle avec la 1,5k de contre reaction, ça fait du 100Hz de Fc.

    Je ne sait toujours pas quel est le but final de ta mesure mais ça doit convenir (ça doit être assez rapide), essayes et vois ce que ça donne...

    Pour le condo sur l´entrée + de l´AOP, il faut prendre en compte la résistance de sortie du LT1787 (pas sûr à 100% mais je pense): 20kΩ + 1kΩ donc si tu mets du 100nF, ça fait Fc= 75Hz et donc si tu mets du 1µF, ça fait Fc = 7,5Hz

    PS: il faut un condo NON polarisé en // avec R16, R20 et R24
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  28. #23
    jorg1n

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Après t´est pas obligé de te prendre la tête, c´est quoi ta fréquence d´échantillonnage?
    Ma fréquence d'horloge est 10KHZ pour mon convertisseur, et ma fréquence d'échantillonnage (fréquence à laquelle je viens effectuer une mesure) est de 400ms soit: 2,5 Hz!!

    Je ne sait toujours pas quel est le but final de ta mesure
    Mon but est d'afficher la mesure à titre d'informations et du calcul d'A/H...

    Pour le condo sur l´entrée + de l´AOP, il faut prendre en compte la résistance de sortie du LT1787 (pas sûr à 100% mais je pense): 20kΩ + 1kΩ donc si tu mets du 100nF, ça fait Fc= 75Hz et donc si tu mets du 1µF, ça fait Fc = 7,5Hz
    Par contre le condensateur je le branche entre V+ et la masse ou V+ et le 2,5V comme c'est ma "référence"?

    Merci d'avance

  29. #24
    lil-vince

    Re : [C] - Fonction de calcul de moyenne / détection de MAX / MIN

    Par contre le condensateur je le branche entre V+ et la masse ou V+ et le 2,5V comme c'est ma "référence"?
    Entre V+ et la masse.

    Il y a des variations rapides de courant?

    Pour 2,5Hz de Fe, il faut environ 1Hz de Fc
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  30. Publicité

Sur le même thème :

Discussions similaires

  1. Question de notations : max/sup, min/inf
    Par 360no2 dans le forum Mathématiques du supérieur
    Réponses: 12
    Dernier message: 14/12/2010, 18h33
  2. Calcul d'un rayon de courbure max et min en mécanique
    Par LINDIENsgm dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 03/01/2009, 12h44
  3. Max et min de 1/x
    Par Co-90 dans le forum Mathématiques du collège et du lycée
    Réponses: 9
    Dernier message: 11/09/2007, 20h21
  4. la sphère volume max pour surface min.
    Par papiblue dans le forum Mathématiques du supérieur
    Réponses: 13
    Dernier message: 06/01/2006, 14h53
  5. calcul de la distance max/min
    Par d_imane dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 09/09/2005, 19h44