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

MATLAB Discussion :

Aide traitement de données Absorbance (PO4)


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Fin de Master 2 Océanographie
    Inscrit en
    Février 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fin de Master 2 Océanographie
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2019
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Aide traitement de données Absorbance (PO4)
    Bonjour à tous, j'essaie de m'écrire un script pour automatiser un minimum le traitement des données que j'obtient après analyses d'échantillons d'eau de mer (Absorbance des phosphates). Je décrit succinctement mon fichier de départ : Pendant une journée je passe entre 30 et 40 échantillons par paquet de 10/15 (séquence) sur une chaîne d’auto analyse, j'obtient donc une série temporelle (temps écoulé depuis le début d'analyse) présentant des "pics" espacés de 4 min 30s (paramétré) dans une même séquence. Le soucis c'est qu'il y a un effet de matrice entre les passages eau de mer et eau MiliQ (effet schlieren). Bref, en soit les valeurs d'intérêts se trouve sur un plateau juste avant le pic (donc je ne peux pas sélectionner ces valeurs de pics).Nom : effet_schlieren.jpg
Affichages : 140
Taille : 16,5 Ko
    (à savoir que sur ce graphe j'ai un point toute les 1200 msec (1.2s))
    Bon maintenant ma question : je bloque sur la partie pour extraire les valeurs d'absorbance du plateau, pour cela j'ai pensé à faire une boucle pour trouver tous les points (le long de toute la séquence) qui sur 3/4/5 itérations sont identiques mais en enlevant les valeurs en dessous d'un certains seuils (car retour à la ligne de base 0.000 entre certains échantillons/séquences/ etc.. et qui induit des successions de valeurs égales)
    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
    n=1;
     
    res=[];
    k=1;
     
    ind = find(C2>0.004);
    C3 = C2(ind);
    for it = 1:length(C3)   
     
    if C3(it) == C3(it+n)
        n = n+1;
        if n == 4
            res(k)= C3(it+n)
        end
     
    else
        display ('error') 
    end
    De ce fait j'aimerais sortir les valeurs dans un vecteur pour pouvoir les extraire. En espérant avoir été clair, je peux bien évidemment donner plus de détails.

    J'en demande à votre gentillesse et surtout votre savoir pour m'aiguillez sur une piste ou deux afin que je me creuse la tête et m'aider à corriger ce bout de script ! Si vous avez également des suggestions d'angles d'approches n'hésitez pas.

    Amicalement, Florian

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Fin de Master 2 Océanographie
    Inscrit en
    Février 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fin de Master 2 Océanographie
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2019
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Re-Bonjour, je tiens à préciser que je recherche seulement un aiguillage pas qu'on m'écrive un script.. Je ne suis pas un expert de Matlab mais j'arrive à me débrouiller seul (sauf dans le cas présent où je ne sais pas dans quelle direction partir). Je tiens également à préciser que j'ai décrit mon travaille pour donner une idée pas pour que quelqu'un fasse le job à ma place... Voilà j'espère qu'avec ces 2/3 précisions une âme charitable me répondra.
    cordialement.

  3. #3
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Bonjour,

    Un plateau veut dire pas (ou peu) de variation. En langage mathématique, ça veut dire que la dérivée est nulle (ou presque).
    Pour calculer la dérivée de façon empirique, tu peux utiliser la fonction diff
    Imaginons que tes données d'absorbance sont contenues dans la variable A. Alors peut être que le code suivant pourrait déjà te donner un résultat satisfaisant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    seuil=0.01;
    id=find(diff(A)<seuil);
    avec id l'indice qui satisfait la condition de peu de variation. Pour la valeur du seuil, il faut tester...

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Fin de Master 2 Océanographie
    Inscrit en
    Février 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fin de Master 2 Océanographie
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2019
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour, merci pour votre réponse. J'avais pensé à la dérivé mais je pensais que la dérivé serait nul au niveau de mes pics et donc que ça ne me donnerait pas les valeurs que je veux récupérer. Cependant je vais tester tout de même avec cette méthode. Merci encore

  5. #5
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Si jamais les pics sortent avec une dérivée nulle, alors une autre solution pourrait être de trouver la plus longue séquence de "id" consécutif.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id2 = diff(diff(id)==1);
    debut = find([true,id>0]);
    fin = find([id<0,true])+1;
    [~,idx] = max(fin-debut);
    debut(idx):fin(idx)
    Aussi, puisque tu as l'air d'être motivé pour respecter les règles du forum et écrire des messages clairs, je me permet de te donner un petit conseil. Pour que davantage de personnes lisent le post et pour avoir des réponses rapides, je dirais qu'en général (lorsque c'est possible), il faut ne pas parler du sujet en tant que tel, mais rester dans "l'univers Matlab". En effet, ici le concept d'absorbance n'est pas très utile. Ce que tu veux c'est "détecter un palier sur une série temporelle".

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Fin de Master 2 Océanographie
    Inscrit en
    Février 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fin de Master 2 Océanographie
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2019
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour votre réponse, et également pour vos conseils. Je m'excuse de répondre seulement maintenant mais étant parti pendant 1 mois en mission je n'ai pu vous répondre plus tôt. Merci également pour la piste, je suis entrain de travailler dessus.
    Cordialement

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Fin de Master 2 Océanographie
    Inscrit en
    Février 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fin de Master 2 Océanographie
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2019
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Du coup après avoir essayé cela à l'air de fonctionner seulement il me reste un petit détail à régler. Tout d'abord j'explique rapidement, j'ai estimé que mon plateau s'étendait sur environ 40 itérations (correspondant à un certain temps) et donc les données que j'obtiens après avoir utilisé votre méthode sont les itérations correspondant aux valeurs dans mon vecteur 'A' de base (celles qui m'intéressent). Seulement certaines ne sont pas "espacé" de 40 itérations et donc j'ai en quelque sorte des doublons (voir plus, jusqu'à 5 fois la même valeur environ) pour un même plateau. J'essaye donc de moyenné les valeurs (dans mon vecteur A) pour toutes les itérations espacé de moins de 40 itérations. Je vous met le petit bout de script que je viens d'écrire (en précisant que je l'ai rapidement fait et donc je vais continuer à chercher et à améliorer).
    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
    seuil=0;
    id =find(diff(C3)~=seuil);
     
    id2 = diff(diff(id)==1);
    debut = find([id>0],true);
    fin = find([true,id'<0])+1;
    [~,idx] = max(fin-debut);
    debut(idx): fin(idx);
     
    B5=find([id2==1]); 
    k=40;
    for i=[1:5];
        for z=1:175-i;
            for n=1:ncols;
           if abs((B5(z+i,n))-(B5(z,n)))<k;
               B6(z,n)=mean(C3(B5(z:z+i)));
           else
               B6(z,n)=C3(B5(z,n));
           end
            end
        end
    end
    Je tiens à préciser que le vecteur C3 correspond à mon vecteur A (données d'absorbance brut) lissé, corrigé et nettoyé des valeurs inutiles.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide sur finition sur Script Traitement de données
    Par Original1992 dans le forum Programmation et administration système
    Réponses: 60
    Dernier message: 17/07/2018, 17h04
  2. Besoin d'aide pour traitement de données
    Par Karoutchi Killian dans le forum Windows
    Réponses: 0
    Dernier message: 07/10/2015, 01h09
  3. [Débutant] Aide traitement de données
    Par gaelepely dans le forum MATLAB
    Réponses: 5
    Dernier message: 20/11/2007, 04h20
  4. Programmation pour traitement de données
    Par benbois dans le forum Langages de programmation
    Réponses: 16
    Dernier message: 19/10/2005, 17h01

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