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 :

Signal bruité: calculer la différence entre une valeur et les x valeurs la précédant


Sujet :

Signal

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 54
    Points : 18
    Points
    18
    Par défaut Signal bruité: calculer la différence entre une valeur et les x valeurs la précédant
    Bonjour,

    Je traite des séries temporelles correspondant au déroulement des appuis sous le pied pendant la marche. A chaque fois que le sujet passe d'un appui talon à un appui de l'avant pied ou n'importe quel autre déroulement, j'ai une certaine valeur. Je voudrais connaitre la valeur de temps correspondant aux différents passages d'une combinaison d'appui à une autre combinaison. Cependant, malgré qu'il ait été filtré, mon signal est assez bruité et ma fréquence d'échantillonage est très importante (1/1400).

    Ainsi, lorsque je tape ce script là (avec x=data et t= temps) censé me donner les valeurs de temps correspondant à chaque changement de combinaison:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x=diff([x; x(end)]);
    z=t(x~=0)
    J'obtiens quelquechose du style:
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    x=
     
        1.1673
        1.1680
        1.1687
        1.1693
        1.1700
        1.1707
        1.1720
        1.8273
        1.8280
        1.8287
        1.8293
        1.8300
        1.8307
        1.8313
        1.8320
        1.8340
        1.8347
        1.8360
        1.8367
        1.8373
        1.8380
        1.8387
        1.8400
        1.8433
        1.8453
        1.8487
        1.8520
        1.8527
        1.8533
        1.8553
        1.8573
        1.8693
        1.8700
        1.8713
        1.8720
        1.8733
        1.8753
        1.8760
        1.8767
        1.8787
        1.8793
        1.8800
        1.8807
        1.8833
        1.8853
        1.8860
        1.8867
        1.8873
        1.8887
        1.8893
        1.8913
        1.8920
        1.8927
        1.8933
        1.8973
        1.8980
        1.8993
        1.9013
        1.9020
        1.9027
        1.9033
        1.9040
        1.9047
        1.9053
        1.9060
        1.9067
        1.9073
        1.9087
        1.9093
        1.9100
        1.9107
        1.9113
        2.0320
        ...
    Ce que je cherche à faire, c'est dire à Matlab de me donner la valeur de temps uniquement si la différence entre x et la moyenne des 50 valeurs le précédant est supérieure à 0.02. Comment traduire cela sous Matlab?

    Merci!
    Murielle

  2. #2
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    Citation Envoyé par Muriellle Voir le message
    Ce que je cherche à faire, c'est dire à Matlab de me donner la valeur de temps uniquement si la différence entre x et la moyenne des 50 valeurs le précédant est supérieure à 0.02. Comment traduire cela sous Matlab?
    vite fait j'écrirais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    a=rand(60,1);
    start=0;
    for i=50:60
        start=start+1;
        if a(i)-mean(a(start:i))>0.02
            a(i)
        end
    end
    en gros je compare les elements de 50 à 60 par rapport aux 50 valeurs les précédant, a(i) me retourne les valeurs qui rentrent dans la condition que tu as citée
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Pourrais-tu nous montrer le tracé d'une courbe caractéristique ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 54
    Points : 18
    Points
    18
    Par défaut tracé
    Bonjour,

    Merci tug83 pour ta réponse. Je vais essayer voir ce que ça donne.

    Voici à quoi ressemblent les données:

    Je ne sais pas pourquoi, mais certains traits ce sont effacés sur l'image... En abscisse, c'est le temps. En gros, on voir bien les différents paliers qui correspondent à des combinaisons d'appuis différents. Normalement, le signal devrait être binaire: soit le pied appui sur un contact et ça donne une certaine valeur, soit ça n'appui pas et donc la valeur est 0. Si différents contacts sont appuyés, la valeur sera la somme des valeurs de chacun des contacts. Mais si on fait un zoom, on voit que ça n'est pas complètement du tout ou rien: on a du bruit qui ne correspond à aucune valeur théorique. C'est pour supprimer ce bruit que je veux faire la différence avec les 50 valeurs précédant... Ou si il a une autre façon de faire, je suis preneuse...
    Images attachées Images attachées  

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Serait-il possible de nous donner quelques données sous forme d'un fichier mat attaché ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 54
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Sous Matlab, je load des fichiers de données numériques .dat.
    Je ne sais pas faire en .mat... A chaque fois que j'essaye de l'uploader, j'ai un message "Fichier non valide"... Comment faut-il faire?

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Tu peux le zippé pour l'attacher à ton message.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 54
    Points : 18
    Points
    18
    Par défaut ok
    Voilà, je l'ai zippé, mais pouvez-vous y voir qqch?
    Fichiers attachés Fichiers attachés

  9. #9
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 54
    Points : 18
    Points
    18
    Par défaut
    En fait, j'ai une autre solution que de faire la différence entre chaque valeur et la moyenne des 50 valeurs la précédant...
    Je sais que chaque combinaison d'appuis correspond à une valeur théorique. Ce qu'il faudrait que je fasse, c'est dire que tant que x n'a pas atteint l'une de ces valeurs théoriques, considérer que x est égal à la valeur théorique juste en dessous.
    Comment faire cela? En gros j'ai 15 combinaisons d'appuis différentes, associées à 15 valeurs différentes, ce qui me donnerait qqch de la sorte:

    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
    T=0,267;
    M5=0,533;
    M5_T=0,8;
    M1=1,067;
    M1_T=1,334;
    M1_M5=1,6;
    M1_M5_T=1,867;
    o=2,133;
    o_T=2,4;
    o_M5=2,666;
    o_M5_T=2,933;
    o_M1=3,2;
    o_M1_T=3,467;
    o_M1_M5=3,73;
    o_M1_M5_T=4;
     
    if 0<=x<T;
        x=0;
    else if T<=x<M5;
            x=T;
        else if M5<=x<M5_T;
                x=M5;
            else if M5_T<=x<M1;
                    x=M5_T;
                else if M1<=x<M1_T;
                        x=M1;
                    else if M1_T<=x<M1_M5;
                            x=M1_T;
                        else if M1_M5<=x<M1_M5_T;
                                x=M1_M5;
                            else if M1_M5_T<=x<o;
                                    x=M1_M5_T;
                                else if o<=x<o_T;
                                        x=o;
                                    else if o_T<=x<o_M5;
                                            x=o_T;
                                        else if o_M5<=x<o_M5_T;
                                                x=o_M5;
                                            else if o_M5_T<=x<o_M1;
                                                    x=o_M5_T;
                                                else if o_M1<=x<o_M1_T;
                                                        x=o_M1;
                                                    else if o_M1_T<=x<o_M1_M5;
                                                            x=o_M1_T;
                                                        else if o_M1_M5<=x<o_M1_M5_T;
                                                                x=o_M1_M5;
                                                            else x=o_M1_M5_T;
                                                            end
    Je souhaite donc obtenir une série de valeurs qui ne sont que des valeurs théoriques, afin de supprimer toutes les valeurs intermédiaires. Et de cette manière, je saurais que si je fait la différence entre mes 2 x adjacents, chaque valeur différente de 0 correspondra à un changement de combinaison d'appuis. Et je souhaite avoir la valeur de temps correspondant à ce changement de combinaison.

    Mais je n'arrive pas à faire que ça marche...

    Merci pour votre aide

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Essaie ceci avec tes données :

    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
    load('essai.mat');
     
    % Réduction du nombre de données
    n=10000;
    s=4000;
    x=s:s+n;
    y=Data{1}(s:s+n);
     
    figure
     
    % Tracé du signal non filtré
    subplot(2,1,1)
    plot(x,y,'r-')
    title('Signal non filtré')
     
    % Vecteur des valeurs théoriques possibles
    appuis=[0;0.267;0.533;0.8;1.067;1.334;1.6;1.867;2.133;2.4;2.666;2.933;3.2;3.467;3.73;4];
     
    % Création d'un vecteur NaN correspondant à y filtré
    yfiltr=nan(size(y));
     
    % ALGORITHME A AMELIORER (CERTAINEMENT)
    % Arrondis des valeurs de y pour simplifier le test qui suit
    y=round(100*y)/100;
     
    % Comparaison de chaque valeur de y à chaque valeur théorique de appuis
    % Si y est presque égal à appuis(n) alors yfiltr=appuis(n);
    for n=1:numel(appuis)
     
        idx=abs(appuis(n)-y)<0.01;
        yfiltr(idx)=appuis(n);
     
    end
     
    % Affichage des valeurs sans le "bruit"
    subplot(2,1,2)
    plot(x,yfiltr,'r-')
    title('Signal sans "bruit"')
     
    % Interpolation des valeurs manquantes ("bruit") du signal filtré 
    idx=isnan(yfiltr);
    yfiltr(idx) = interp1(find(~idx), yfiltr(~idx), find(idx), 'nearest');
     
    figure
    % Tracé du signal filtré
    plot(x,yfiltr,'r-','linewidth',2)
     
    % Mise en forme du graphique 
    hold on
     
    col=jet(numel(appuis));
    colormap(col);
     
    % Ajout des lignes correspondant aux valeurs d'appuis
    for n=1:numel(appuis)
     
        p(n)=plot([x(1) x(end)],[appuis(n) appuis(n)]);
        set(p(n),'color',col(n,:),'linestyle',':')
     
    end
    uistack(p,'bottom')
    title('Signal filtré')
     
    legend(p,num2str(appuis,'%.3f'))
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  11. #11
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 54
    Points : 18
    Points
    18
    Par défaut Merci!!!
    Bonjour,

    Merci beaucoup pour le programme Dut, c'est vraiment génial
    Etant donné que j'ai besoin des valeurs de temps correspondant à chaque changement de combinaison d'appuis, j'ai rajouté cela à la fin de ton programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    yfiltr=diff([yfiltr; yfiltr(end)]);
    z=x(abs(yfiltr)>0);
    z
    Mais cela ne me donne pas la valeur de temps, mais le numéro de la valeur de temps. Comment faire pour avoir le temps?

    Merci!

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Citation Envoyé par Muriellle Voir le message
    Mais cela ne me donne pas la valeur de temps, mais le numéro de la valeur de temps. Comment faire pour avoir le temps?
    Il suffit d'utiliser ta fréquence d'échantillonnage, non ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  13. #13
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 54
    Points : 18
    Points
    18
    Par défaut en effet...
    Effectivement...
    Ou bien de travailler sur un fichier .dat plutôt que .mat.
    Les 2 sont possibles.

    Merci encore pour ton aide!

  14. #14
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 54
    Points : 18
    Points
    18
    Par défaut Problème avec les données inférieures à 0
    Bonjour,

    Je fais encore appel à vous pour un problème avec ces mêmes données.
    Parfois mon signal est inférieur à 0, mais ceci est un artéfact.
    Avec le programme de Dut, ça me prenait la valeur absolue de ma valeur inférieure à 0, et ça regardait s'il y avait une différence <0.01 par rapport aux valeurs d'appui théoriques. Etant donné que les valeurs inférieures sont des artéfacts, cela fausse mon signal.
    Je voudrais intégrer au programme que Dut a écrit, une commande disant que si mes données sont inférieures à 0, alors remplacer ces données là par la plus proche valeur supérieure ou égale à 0 précédant cette valeur inférieure à 0.

    Pouvez-vous m'aider?
    Merci!

  15. #15
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Encore une fois, ce sera plus simple de te répondre si tu nous fourni un petit fichier mat.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  16. #16
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 54
    Points : 18
    Points
    18
    Par défaut fichier .mat
    Voici l'allure des données.
    Fichiers attachés Fichiers attachés

  17. #17
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    En utilisant le même code que ci-dessus (un peu allégé) :
    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
    load('essai.mat');
     
    % Réduction du nombre de données
    n=6000;
    s=4000;
    x=s:s+n;
    y=Data{1}(s:s+n);
     
    figure('color','w')
     
    % Tracé du signal non filtré
    subplot(2,1,1)
    plot(x,y,'r-','linewidth',2)
    set(gca,'ylim',[min(y(:)) max(y(:))],'xlim',[min(x(:)) max(x(:))])
    title('Signal non filtré')
     
    % Vecteur des valeurs théoriques possibles
    appuis=[0;0.267;0.533;0.8;1.067;1.334;1.6;1.867;2.133;2.4;2.666;2.933;3.2;3.467;3.73;4];
     
    % Création d'un vecteur NaN correspondant à y filtré
    yfiltr=nan(size(y));
     
    % ALGORITHME A AMELIORER (CERTAINEMENT)
    % Arrondis des valeurs de y pour simplifier le test qui suit
    y=round(100*y)/100;
     
    % Comparaison de chaque valeur de y à chaque valeur théorique de appuis
    % Si y est presque égal à appuis(n) alors yfiltr=appuis(n);
    for n=1:numel(appuis)
     
        idx=abs(appuis(n)-y)<0.01;
        yfiltr(idx)=appuis(n);
     
    end
     
    % Interpolation des valeurs manquantes ("bruit") du signal filtré 
    idx=isnan(yfiltr);
    yfiltr(idx) = interp1(find(~idx), yfiltr(~idx), find(idx), 'nearest');
     
    % Tracé du signal filtré
    subplot(2,1,2)
    plot(x,yfiltr,'r-','linewidth',2)
    set(gca,'ylim',[min(y(:)) max(y(:))],'xlim',[min(x(:)) max(x(:))])
    title('Signal filtré')
    Le signal filtré obtenu me semble correct, je ne vois pas le problème
    Images attachées Images attachées  
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  18. #18
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    A moins que les valeurs négatives filtrées ne prennent les valeurs suivantes positives à la place des valeurs précédentes, c'est ça ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  19. #19
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 54
    Points : 18
    Points
    18
    Par défaut
    Je ne sais pas trop ce qu'il fait, mais j'ai l'impression que parfois il les remplace par des 0 et donc ça me fait un trou qui n'a pas lieu d'être dans mes données et du coup, ça compte le passage à une valeur positive comme un nouveau cycle alors que ce n'est pas le cas...

  20. #20
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Essaie ceci :

    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
    load('essai.mat');
    
    % Réduction du nombre de données
    n=6000;
    s=4000;
    x=s:s+n;
    y=Data{1}(s:s+n);
    
    figure('color','w')
    
    % Tracé du signal non filtré
    subplot(2,1,1)
    plot(x,y,'r-','linewidth',2)
    set(gca,'ylim',[min(y(:)) max(y(:))],'xlim',[min(x(:)) max(x(:))])
    title('Signal non filtré')
    
    % Filtrage (grossier) des valeurs négatives
    y(y<0)=nan;
    
    % Vecteur des valeurs théoriques possibles
    appuis=[0;0.267;0.533;0.8;1.067;1.334;1.6;1.867;2.133;2.4;2.666;2.933;3.2;3.467;3.73;4];
    
    % Création d'un vecteur NaN correspondant à y filtré
    yfiltr=nan(size(y));
    
    % ALGORITHME A AMELIORER (CERTAINEMENT)
    % Arrondis des valeurs de y pour simplifier le test qui suit
    y=round(100*y)/100;
    
    % Comparaison de chaque valeur de y à chaque valeur théorique de appuis
    % Si y est presque égal à appuis(n) alors yfiltr=appuis(n);
    for n=1:numel(appuis)
        
        idx=abs(appuis(n)-y)<0.01;
        yfiltr(idx)=appuis(n);
        
    end
    
    % Interpolation des valeurs manquantes ("bruit") du signal filtré 
    idx=isnan(yfiltr);
    yfiltr(idx) = interp1(find(~idx), yfiltr(~idx), find(idx), 'nearest');
    
    % Tracé du signal filtré
    subplot(2,1,2)
    plot(x,yfiltr,'r-','linewidth',2)
    set(gca,'ylim',[min(y(:)) max(y(:))],'xlim',[min(x(:)) max(x(:))])
    title('Signal filtré')
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. [WD17] calculer la différence entre les lignes d'une table
    Par cigalou84 dans le forum WinDev
    Réponses: 4
    Dernier message: 23/12/2013, 15h28
  2. [AC-2010] Calculer la différence entre deux dates, en jour, dans une requête
    Par Just-Soft dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/10/2010, 02h19
  3. [JBoss]Différence entre une DataSource et une XADataSource ?
    Par lalakers dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 03/10/2005, 11h18
  4. Réponses: 2
    Dernier message: 25/05/2005, 21h34
  5. Calcul de différence dans une requête
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/05/2005, 13h16

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