1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 290
    Points : 96
    Points
    96

    Par défaut Compression d'un signal

    Bonjour,
    J'ai un tableau de point dont les mini et maxi sont trop grand pour mes besoins. Malheureusement j'ai besoin des petites valeurs voila pourquoi une simple division n'est pas intéressante.
    Actuellement j'ai un bout de code qui me permet de faire une sorte de compression malheureusement je n'arrive pas à atténuer autant que je voudrais ma courbe.
    Dans la courbe ci-dessous on voit la donnée brute (verte) la donnée compressée(bleue) et une simple division (rouge) et on voit que le bleu et le vert reste commun dans les petites valeurs.
    Nom : compression.jpg
Affichages : 98
Taille : 102,1 Ko

    Voici le petit bout de code scilab qui m'a permis de faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Alpha = 1.0;
    Beta = 100.0;
    Val = ValOri/3.8;
    for i = 1:1:n
        Val3(i) = ((((Alpha / Beta) - 1) / Beta * abs(Val(i)) + 1.0) * ValOri(i));    
    end
    plot(ValOri,'g');//Green
    plot(Val3,'b');//Blue
    plot(Val,'r');//Red
    et je n'arrive pas à optimiser ce code .
    Si quelqu'un a une petite idée , ou un nom générique pour ce type de calcul je suis preneur.
    Merci

  2. #2
    Expert éminent Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 2 349
    Points : 6 542
    Points
    6 542

    Par défaut

    Bonjour,

    Peut-être qu'en utilisant une echelle logarithmique, tu auras ce que tu recherches.
    En générale, ce genre d'échelle, permet d'atténuer les grandes valeurs vis à vis des petites valeurs.
    Cordialement.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 290
    Points : 96
    Points
    96

    Par défaut

    Salut,
    En effet le log pourrait tendre à atténuer les points extrêmes mais je cherche à recalculer tous mes points pour les sauvegarder.
    Je ne sais pas comment je pourrais dans ma boucle inséré un Log avec un paramètre de valeur maximale.

  4. #4
    Responsable Qt


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherches
    Inscrit en
    août 2008
    Messages
    22 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur de recherches
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 22 268
    Points : 121 443
    Points
    121 443

    Par défaut

    Citation Envoyé par sdecorme Voir le message
    Je ne sais pas comment je pourrais dans ma boucle inséré un Log avec un paramètre de valeur maximale.
    Le logarithme posera problème, puisque tu as des valeurs à zéro (log 0, ça vaut, euh…) et même des négatives…

    Sinon, si tu n'aimes pas tes pointes, tu peux aussi utiliser un maximum : si la valeur dépasse un seuil, hop, on la change pour mettre ce seuil (même chose dans les négatifs).

    Ou alors tu multiplies par un facteur adaptatif : proche de 1 quand la valeur est faible, proche de zéro quand la valeur est infinie. Je pense à un truc comme Formule mathématique (ne pas oublier les valeurs absolues, évidemment). Trois exemples en pièce jointe (le troisième exemple montre l'impact quand tu divises par une constante, ce qui te permettra d'atteindre ce que tu souhaites réellement comme applatissage).

    Nom : ex.png
Affichages : 79
Taille : 17,7 Ko
    Vous souhaitez participer aux rubriques Qt ou PyQt (tutoriels, FAQ, traductions) ? Contactez-moi par MP.

    Nouveau ! Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 290
    Points : 96
    Points
    96

    Par défaut

    Je me suis rendu compte de ce problème
    Je viens de faire un essai en doublant ma formule dans ma boucle et ça fonctionne pas mal.
    Rouge valeur originale
    Vert première boucle
    Bleu deuxième boucle
    Ma valeur max finale ne devant pas dépasser +-18

    Nom : compression.jpg
Affichages : 79
Taille : 97,5 Ko

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    janvier 2007
    Messages
    10 541
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 10 541
    Points : 17 010
    Points
    17 010
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par sdecorme Voir le message
    Ma valeur max finale ne devant pas dépasser +-18
    Une simple règle de trois, hein ?


    • (Maxi - Mini)final = 36

      (Minifinal = -18, Maxifinal = 18)


    • Nouvelle valeur = -18 + ((Valeur - Miniinitial) * 36 / (Maxi - Mini)initial)







    PS: quant à avoir une échelle log, c'est pas plus compliqué :

    • Recalage de l'échelle en positif (> 0)

      Valeurnouvelle = 1 + ((Valeurinitial - Miniinitial) / (Maxi - Mini)initial)


    • Nouvelle valeur = log(Valeurnouvelle)

      (éventuellement là encore à ajuster si on veut que l'écart final soit entre -18 et 18)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 290
    Points : 96
    Points
    96

    Par défaut

    Salut Souviron,
    J'ai codé ta régle de 3 et elle ne fonctionne que si le mini et le maxi sont symétriques
    Voici ma version pour les données non symétriques
    Nouvelle valeur = Valeur * ( 36 / (Maxi - Mini)initial)
    Voici une capture d'écran des différents calculs
    Rouge données initiales
    Bleu ma bidouille
    Vert ta formule (tu vois le décalage)
    Rose ta formule modifiée
    Nom : compression.jpg
Affichages : 66
Taille : 124,2 Ko

    Le problème de la régle de 3 c'est que ça écrase les petites valeurs que je voulais garder.
    Je vais voir avec le Log comme ça se passe.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    janvier 2007
    Messages
    10 541
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 10 541
    Points : 17 010
    Points
    17 010
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par sdecorme Voir le message
    Salut Souviron,
    J'ai codé ta régle de 3 et elle ne fonctionne que si le mini et le maxi sont symétriques
    Ben non, j'ai donné la formule symétrique parce que TOI tu donnais maxi = +/- 18

    • D'une part c'est à appliquer à TOUTES les valeurs, pas juste les extrémales (ça compresse l'intervalle total entre -18 et +18)



    • D'autre part, pour que ce soit "asymétrique", ou simplement une compression entre par exemple 0 et 1:

      Compression entre 0 et 1 :

      • Nouvelle valeur = (Valeur - Miniinitial) / (Maxi - Mini)initial

        Si Valeur vaut Miniinitial ça vaut 0. Si Valeur vaut Maxiinitial ça vaut 1.




      Asymétrique entre -1 et 1 :

      • Nouvelle valeur = Valeur / (Maxi - Mini)initial


        Si Valeur vaut Miniinitial ça vaut qque chose comme -0.xx, si Valeur vaut Maxiinitial ça vaut qque chose comme +0.yy







    Ou alors j'ai mal compris ou tu t'es mal exprimé, et c'est juste les valeurs extrémales que tu veux réduire ???
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 290
    Points : 96
    Points
    96

    Par défaut

    Désolé si je me suis mal exprimé .
    Les données sont asymétriques par contre en sortie je ne dois pas dépasser +-18.
    Dans mon premier post exprime le fait de vouloir garder les faibles valeurs et atténuées les valeurs extrêmes.
    Bref j'ai quand même réussi à faire ce que je voulais , mais je vais quand même prendre le temps de regarder avec les log par curiosité , ça peut me donner des idées.
    Merci pour tes précisions

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    janvier 2007
    Messages
    10 541
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 10 541
    Points : 17 010
    Points
    17 010
    Billets dans le blog
    2

    Par défaut

    Ah ok....


    Comment détermines-tu le seuil "faible" vs "extrême" ??


    Dans ce cas alors il suffit d'appliquer la règle de 3 à l'intervalle (seuil - valeurextrême) :

    Si valeur > seuil

    valeurnouvelle = seuil + ( (valeur - seuil) * (18-seuil) / (valeurextrême - seuil) )
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Membre éclairé

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    décembre 2010
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2010
    Messages : 379
    Points : 760
    Points
    760
    Billets dans le blog
    5

    Par défaut

    Bonjour,

    S'il s'agit de limiter les valeurs extrêmes d'une grandeur dépendant du temps x(t), pourquoi ne pas recourir à l'une des fonctions suivantes (y = F(x)) ?
    a) y = ym * th(x / a) ;
    b) y = ym * x / (a2 + x2)(1/2) ;
    c) y = ym * x / (a + |x]) ... s'il faut vraiment faire simple.

    Leur graphe, symétrique par rapport à l'origine, présente deux paliers horizontaux d'ordonnée (+- ym), et une pente maximale égale à (ym / a).

    PS: L'ajustage des constantes (puisque cela paraît important) est immédiat: on prendra ym = 18 , et conviendra que pour les valeurs modérées couramment atteintes (|x] = b ~ 20 ?), (y) vaut par exemple 90 % du maximum, soit (0.9 * ym) ; il vient alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a) 0.9 = th(b / a)                    =>                    a = b / Argth(0.9) ;
    b) 0.9 = b / (a2 + b2)(1/2)             =>                    a = b * (0.9-2 - 1)(1/2) ;
    c) 0.9 = b / (a + b)                  =>                    a = b * (0.9-1 - 1) .


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

Discussions similaires

  1. [Débutant] la compression d'un signal réel (voix)
    Par medhi_mz dans le forum Signal
    Réponses: 0
    Dernier message: 24/12/2016, 16h49
  2. Compression d'un signal par FFT
    Par sigma10 dans le forum LabVIEW
    Réponses: 5
    Dernier message: 22/06/2011, 00h31
  3. compression d'un signal par FFT
    Par sigma10 dans le forum Signal
    Réponses: 11
    Dernier message: 21/06/2011, 12h30
  4. compression d'un signal
    Par pedro1 dans le forum LabVIEW
    Réponses: 0
    Dernier message: 20/05/2011, 13h18

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