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 :

Lissage de signal


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Par défaut Lissage de signal
    Bonjour à tous,
    Je dois faire un petit algorithme de lissage de signal:
    pour une séquence de nombres décimaux (mesure)on remplace chaque valeurs (sauf la première et la dernière) par la moyenne des deux valeurs qui l'entourent.
    Le but du programme est de calculer le nombre minimum de lissages successifs pour que la valeur absolue de la différence entre deux valeurs successives de la séquence finale obtenue ne dépasse jamais une valeur donnée, diffMax.
    Mon programme me semble correcte mais pourtant je ne trouve pas la bonne valeur
    en entrée on a donc:
    le nombre de mesures
    la valeur diffMax
    et les valeurs de la séquence.
    pour les entrée suivantes je devrais avoir 13 en sorte or j'ai 3:
    7
    1.120
    1.292
    1.343
    3.322
    4.789
    -0.782
    7.313
    4.212
    Voici mon code:

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #include<iostream>
    #include<string>
    #include <cmath>
    using namespace std;
     
    double valabs(double);
     
    double valabs(double a)
    {
    	if (a<0)
    		return (-1*a);
    	else
    		return  a;
    }
     
    int main()
    {
       int nbMesures;
       double diffMax;
       int nb=0;
       double *tab;
       bool b=true;
       cin>>nbMesures;
       cin>>diffMax;
       tab=new double[nbMesures];
       for(int i=0;i<nbMesures;i++)
       {
          cin>>tab[i];
       }  
     
       while(b)
       {
    		b=false;
    		nb=nb+1;
          for(int i=1;i<nbMesures-1;i++)
          {
             tab[i]= (tab[i-1]+tab[i+1])/2.0; 
          }
          for(int j=0;j<nbMesures-1 && !b;j++)
    		{  
    			b=(valabs(tab[j]-tab[j+1])>diffMax);
    		} 
     
       }
     
     
       cout<<nb; 
       system("pause");
       return 0;
    }
    merci par avance pour vos réponses.

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    Préfères les vectors aux tableaux simples (surtout qu'ici je vois un new mais pas de delete).

    Sinon, tu travailles par itérations successives donc il faudra 2 tableaux. (état courant, état suivant)

    Actuellement tu n'a qu'un tableau, donc tu perds les valeurs de l'état courant au fur et à mesure, et le lissage est beaucoup plus rapide. (état courant et suivant se mélangent).

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Par défaut
    Effectivement avec deux tableaux ça marche, merci bien

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include<iostream>
    #include<string>
    #include <cmath>
    using namespace std;
     
    double valabs(double);
     
    double valabs(double a)
    {
       if (a<0)
          return (-1*a);
       else
          return  a;
    }
     
    int main()
    {
       int nbMesures;
       double diffMax;
       int a=0;
       int nb=-1;
       double *tab;
       double *tab2;
       bool b=true;
       int k=2;
       cin>>nbMesures;
       cin>>diffMax;
       tab=new double[nbMesures];
       tab2=new double [nbMesures];
       for(int i=0;i<nbMesures;i++)
       {
          cin>>tab[i];
       }  
       tab2[0]=tab[0];
       tab2[nbMesures-1]=tab[nbMesures-1];
       while(b)
       {
    		b=false;
    		nb=nb+1;
    		if(a==0)
    		{
    			for(int i=1;i<nbMesures-1;i++)
    			{
    				tab2[i]= (tab[i-1]+tab[i+1])/2.0; 
    			}
    		}
    		if(a==1)
    		{
    			for(int i=1;i<nbMesures-1;i++)
    			{
    				tab[i]= (tab2[i-1]+tab2[i+1])/2.0; 
    			}
    		}
          for(int j=0;j<nbMesures-1 && !b;j++)
          {  
             b=((valabs(tab[j]-tab[j+1])>diffMax) || (valabs(tab2[j]-tab2[j+1])>diffMax));
          } 
       k=k+1;
       a=k%2;
       }
       cout<<nb; 
       delete tab;
       delete tab2;
       system("pause");
       return 0;
    }
    Il existe surement une façon plus propre de l'écrire mais il marche.
    Pourquoi vaut-il mieux utiliser des vectors que des tableaux?

  4. #4
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par jandilla30 Voir le message
    Effectivement avec deux tableaux ça marche, merci bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tab=new double[nbMesures];
    tab2=new double [nbMesures];
     
    delete tab;
    delete tab2;
    Il existe surement une façon plus propre de l'écrire mais il marche.
    Pourquoi vaut-il mieux utiliser des vectors que des tableaux?
    Pour éviter ce genre de trucs
    un new[] va avec un delete[].

    Sinon, un vector c'est un tableau dynamique, tu t'embêtes pas à gérer la mémoire, tout en ayant les performances d'un tableau classique.
    Ça évite pas mal d'erreurs tout en étant plus simple à utiliser.

Discussions similaires

  1. Lissage d'un signal bruité pour calcul de pente
    Par dragondumond dans le forum VB.NET
    Réponses: 3
    Dernier message: 19/04/2013, 18h10
  2. [Débutant] Problème de lissage d'un signal
    Par Contact2012 dans le forum Signal
    Réponses: 10
    Dernier message: 23/10/2008, 13h48
  3. [Signal] Pb de lissage d'un signal audio
    Par Contact2012 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 14/10/2008, 11h01
  4. [VB6] [MDI] Signaler la fermeture d'une fille à la mère
    Par cpri1shoot dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/04/2004, 08h57
  5. Interception du signal SIGINT
    Par macleod dans le forum MFC
    Réponses: 2
    Dernier message: 01/07/2003, 18h39

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