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

Signal Discussion :

utiliser la fonction fit correctement


Sujet :

Signal

  1. #1
    Hew
    Hew est déconnecté
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 142
    Points : 101
    Points
    101
    Par défaut Fit d'une sinusoide
    Bonjour !

    Je souhaite "fiter" des donnees en utilisant la fonction fit de Matlab.

    Mes donnees sont de forme sinusoidale, j'ai donc cree un modele sinusoidal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    f = fittype('a+b*sin(c*x+phi)');
    s = fitoptions('Method','NonlinearLeastSquares');
     
    [c gof] = fit(A(:,1),AA,f,s);
    Le probleme c'est que le resultat n'est pas a la hauteur de mes esperances (pour pas dire que le fit est completement a cote de la plaque !!)

    Je pensais au debut que ca venait du bruit de mes donnees, je commence donc par les lisser... mais toujours rien de bon !
    Jugez plutot sur l'image jointe ! En bleu les donnees brutes, en vert les donnees lissees et en rouge le resultat du fit...

    Est-ce que vous savez d'ou ca vient ?
    Pour moi il y a deux options :
    - j'm'ai trompe dans le code
    - il n'y a pas assez de donnees pour faire un fit correct --> il faudrait que j'aie au moins une autre periode de sinus

    Si vous pouvez m'aider a ecarter l'une ou l'autre de ces hypotheses, ce serait top !

    Merci
    Images attachées Images attachées  

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour.
    C'est sans doute lié aux choix des paramètres "période d'échantillonnage" et "fréquence du signal".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    clear
    T=0.01;
    t=0:T:5;
    A=4+2*sin(2*pi*0.5*t+pi/6)+0.5*(rand(1,length(t))-0.5);
    f = fittype('a+b*sin(c*x+phi)');
    s = fitoptions('Method','NonlinearLeastSquares');
    [c gof] = fit(t',A',f,s);
    y=c.a+c.b*sin(c.c*t+c.phi);
    plot(t,A)
    hold on
    plot(t,y,'r')
    grid

  3. #3
    Hew
    Hew est déconnecté
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 142
    Points : 101
    Points
    101
    Par défaut
    Bonjour !

    Merci phryte pour ta reponse. En fait apres renseignement, je pense que ce sont mes parametres initiaux qui sont mauvais : en ne donnant pas de point de depart, matlab ne s'y retrouve pas.

    Je cherche donc a donner de bons parametres initiaux pour rechercher la solution :
    Mon modele est : a + b*sin(c*x + phi)
    - pour le parametre a : j'ai pour l'instant entre la moyenne de mon signal
    - pour le parametre b : je prends la valeur maximale de mon signal
    - pour le parametre c : il s'agit de la periode de mon signal. Pour l'estimer correctement, je regarde l'autocorrelation de mon signal et je prends la valeur a laquelle j'ai mon premier maximum non nul. Normalement cette valeur devrait me donner la periode de mon signal, il se trouve que ce n'est pas le cas et je ne comprends pas pourquoi
    - pour le parametre phi : il s'agit du dephasage de mon signal. A priori je ne connais pas ce dephasage, puisque en fait en faisant un fit de ma fonction c'est ce parametre que je veux determiner precisement. J'ai remarque que si je ne donnais pas d'entree de jeu la bonne phase, la fonction fit me renvoyait n'importe quoi. Je ne connais pas de methode pour estimer la phase correctement.

    Voici donc mes questions :
    - comment obtenir precisement la periode de mon signal ?
    - existe t'il une methode plus robuste que la fonction fit pour fiter un signal sinusoidal (surtout sans entrer le dephasage initial) ?

    Voici pour l'instant a quoi ressemble mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    f = fittype('a+b*sin(c*x+phi)');
    s = fitoptions('Method','NonlinearLeastSquares','Startpoint',[mean(AA),max(AA),2.65/estimatedPeriod,pi/2]);
     
    [c gof] = fit(A(:,1),AA,f,s);
    AA = mon signal
    A(:,1) = mes abcisses
    estimatedPeriod = le premier maximum de mon autocrrelation, j'ai remarque que la valeur 2.65/estimatedPeriod me donnait la bonne periode pour mon signal, je ne sais pas pourquoi

    Merci d'avance pour toute aide !

  4. #4
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Citation Envoyé par Hew Voir le message
    - comment obtenir precisement la periode de mon signal ?
    Je sais pas si c'est la méthode la plus adéquate mais tu peux peut-être utiliser la fonction SEQPERIOD

    Bonne journée,
    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  5. #5
    Hew
    Hew est déconnecté
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 142
    Points : 101
    Points
    101
    Par défaut
    Hello duf !

    Merci pour ta reponse, mais seqperiod ne va pas fonctionner : ca ne marche que si les valeurs sont exactement les memes, ce qui n'est pas le cas dans mon signal.

    cecile

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/07/2013, 01h31
  2. manuel d'utilisation de fonction
    Par SteelBox dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 11/10/2004, 01h28
  3. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43
  4. Réponses: 11
    Dernier message: 22/12/2003, 21h06
  5. impossible d'utiliser ma fonction dans un insert
    Par caramel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/04/2003, 15h04

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