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 :

Code qui ne fonctionne pas pour détection de minimum


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 56
    Points : 19
    Points
    19
    Par défaut Code qui ne fonctionne pas pour détection de minimum
    Bonjour,

    Je dois faire un code qui me dit de combien bouger lorsque je ne suis pas centré mais il ne fonctionne pas.
    Je ne vois pas pourquoi.
    Voici mon code commenté :


    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    n = 1.4 ; % valeur de l'interfrange fixe (dépend de la puce)
    p = 50 ; % pas de l'acquisition en micromètres
    t = input('Rayon du wafer = ') ; % demande la valeur du rayon du wafer et la renvoie
    v = input('Vitesse du spindle = ') ; % demande la valeur de la vitesse de rotation du spindle et la renvoie
    v = v*2*pi/60 ;
    A = v*10^-3/(n*10^-6) ; % calcul de la pente théorique de la courbe fd = f(R) avec fd fréquence doppler associée à un cercle concentrique
    disp (['La valeur de la pente = ' num2str(A)]) ;
     
    % Définition des valeurs d'intervalles
        inte = input('Valeur de inte =');
        p = input('Valeur de p = ');
     
     
    % Ajout du sous-dossier des fonctions du mapper et des fonctions communes
    current_path = cd;
    addpath(genpath(current_path));
     
    % Recherche des données à traiter et Recherche des paramètres
    [Params] = Mapper_Param();
     
    % Creation des dossiers de résultats
    [~,~,~]= mkdir('images');
    [~,~,~]= mkdir('signals');
    [~,~,~] = mkdir(strcat('E:\Commun Vélociraptor\Matlab\Reader Guillaume\Test sur signaux moyennés\signals\',Params.Name_fold));
     
    % Ouverture des pools pour parralélisation
    % if matlabpool('size') == 0
    %     matlabpool open
    % end
     
     
    % Recherche du nombre de tours (on recherche le nombre de channels 0 présentes
    % exploration du dossier ciblé
    Params.N_N_tours = size(dir(strcat(Params.pathname,'/*Ch0*.bin')),1);
     
     
    % Initialisation de la matrice de résultats
    Results = zeros(Params.N_N_tours,Params.D_Enc);
    timing = zeros(1,Params.N_N_tours);
    fd = zeros(Params.N_N_tours,1); % initialisation de la matrice de résultats pour les fréquences
    Rayons = zeros(Params.N_N_tours,1); % initialisation de la matrice de résultats pour les rayons
     
    tic
    for i = 1:10%Params.N_N_tours
        bla = tic;
        % Mise à jour du tour dans le fichier de paramètres des variables du
        % tour
        i
        Params.tour.i = i-1;
        Params.tour.R = Params.D_R_init - (i-1)*Params.D_step;
        Params.tour.F_d = Params.tour.R*Params.D_V/(Params.D_i0);
     
        % chargement des données du tour i 
        % SIG_tour correspond au signal brut du tour
        % ENC_tour donne pour position de sample dans le tour le signal
        % d'encodeur correspondant
        [Donnes.SIG_tour,Donnes.ENC_tour,Params] = Mapper_DataLoad(Params);
        Params.tour.N_Fdn = Params.tour.F_d/Params.tour.F_acq_tour; % Fréquence Doppler normalisée de ce rayon
     
    %     % Détection par vraisemblance du tour i
    %     [Results_V, Params] = Mapper_detection(Donnes,Params);
     
        %Calcul de la transformée de Fourier pour un tour en entier
        a = fft(Donnes.SIG_tour);
        b = 10*log(abs(a)) ; % passage en log pour  meilleure observation
        % Tracé de la transformée de Fourier 
        hold on
        plot(b,'g')
        title('Fft de Donnes.SIG_tour')
        xlabel('frequence')
        ylabel('amplitude')
        hold off
     
     
        % Détection du pic et de la valeur intéressante en fréquence et retour
        % de la valeur souhaitée
        % si le rayon scanné est supérieur à cette valeur
        % if Rayons > 0.025
            [valP, indP] = max(a);%(0.3*10^6:0.8*10^6));
            newfd = 0.3*10^6 + indP;
        %else 
         %   [valP, indP] = max(b(inte:inte+p));
         %   newfd = inte + indP;
        % end
     
     
        % faire une liste de toutes ces valeurs de fréquences
        fd(i) = newfd ;
        % conversion du "ième tour" en rayon
        Rayons(i) = Params.tour.R; 
     
    %    if Params.U_V_calc == 1
    %         % Sizing du tour i
    %         [Results_S] = Mapper_Sizer(Donnes,Params, Results_V(i,:));
    %         Results(i,:) = Mapper_Mise_en_Forme(Results_S,Params,Donnes);
    %     else
    %         Results_V = Results_V/255;
    %         Results(i,:) = Mapper_Mise_en_Forme(Results_V,Params,Donnes);
    %     end
    %     timing(i) = toc(bla);
    %     end
     
     
    end
    % tracé des fréquences doppler en fonction des rayons
    hold on
    plot(Rayons,fd,'b');
    title('frequence doppler pratique  = f (Rayon)');
    xlabel('rayon cercle scanné');
    ylabel('fréquence doppler pratique');
    hold off
    % récupération de l'équation de la courbe précédente sous forme d'un
    % polynôme d'ordre 2 (terme en y^2)
     
    indexmin = find(min(fd) == fd);
    Rayonsmin = Rayons(indexmin);
    fdmin = fd(indexmin);
     
    indexmax = find(max(fd) == fd);
    Rayonsmax = Rayons(indexmax);
    fdmax = fd(indexmax);
     
    p = polyfit(Rayons,fd,2);
     
    % comparaison des termes de pente et d'ordonnée à l'origine avec la courbe
    % théorique
     
    if (p(1)~= 0 & p(2)~= A & p(3)~= 0)
    % on doit bouger de tant -> problème comment savoir de combien on va bouger
    % 
     
         disp([fdmin]) ;
        disp([fdmin]/(3.4*10^8)) ;
        disp([fdmin]*2.18*10^4 );
     
    % renvoyer le décalage
        %disp(['Le décalage en x est ' num2str(fdmin), 'Le décalage en y est ' num2str(fdmin/3.4*10^8),  'Le décalage en z est ' num2str(fdmin * 2.8*10^4)]);
    else 
         disp(['We are at the center of rotation']);
    end
    Merci de votre aide

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour,

    Ce n'est pas aisé et motivant d'entrer dans un code de 150 lignes de façon si abrupte, même avec quelques commentaires. Peux tu nous dire ce qui ne fonctionne pas? Et à quel endroit? Tout ça de façon claire et précise bien entendu.

    En attendant, après une première lecture rapide, je me pose la question de ce que tu essaies de faire via ces deux lignes de codes?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    indexmin = find(min(fd) == fd);
     
    indexmax = find(max(fd) == fd);
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 56
    Points : 19
    Points
    19
    Par défaut
    Oui c'est vrai que ca doit être dur tout d'un coup , désolé

    Alors le but est d'obtenir le centre d'un rotation d'un objet et donc au final je devrais avoir les distances dont je dois bouger.
    Tout d'abord j'entre les données fixes et variables.
    Ensuite mon système est basé sur doppler : je scanne l'objet par cercles concentriques. a chaque cercle concentrique correspond une fréquence doppler. la relation entre la fréquence et le rayon de chaque cercle concentrique est une relation linéaire. donc a la fin si j'obtiens une relation linéaire, c'est que tout est bien centré, sinon je dois bouger de tant suivant x y et z ( ce que je dois obtenir).
    après l(obtention de données du scan , je trace la transformée de fourier des données pour chaque tour pour trouver la fréquence doppler associée à chaque tour et tracer la fréquence doppler en fonction du rayon des cercles.
    Ensuite jobtiens l'equation de cette courbe sous forme d'un polynome d'ordre 2 et je fais une condition if : si l'on obtient pas les bons coefficients ( C = 0 , D = A , E = 0), alors on doit bouger de tant

    les deux lignes que tu m'a mis me permettent d'obtenir les informations sur les minima et maxima de la courbe obtenue .

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [~,indexmin] = min(fd);
     
    [~,indexmax] = max(fd);

    Je comprends ton sujet dans les grandes lignes. Maintenant, d'après ce que je comprends, je suppose que tu ne rencontres pas de messages d'erreur mais que par contre tu n'obtiens pas les résultats auxquels tu t'attendais. Qu'obtiens-tu à la place de quoi? à quelle ligne n'as tu pas ce que tu désires?

    Edit: n'hésites pas à parcourir ton code ligne par ligne pour vérifier que tout se passe comme tu le penses, et non comme tu le supposes.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 56
    Points : 19
    Points
    19
    Par défaut
    J'ai l'impression qu'il y a des erreurs parce que je n'obtiens pas du tout ce que je souhaites. Les tracés sont faux , les données finales aussi ... Ca me dit qu'il y a une erreur dans la définition des intervalles ( cela ne veut pas prendre des nombres relatifs...).
    Ok je vais voir ça ligne par ligne

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 56
    Points : 19
    Points
    19
    Par défaut
    Rebonjour,

    j'ai corrigé quelques erreurs d'incohérence mais je ne vois toujours pas pourquoi ca ne fonctionne pas : j'ai l'impression qu'il y a une erreur lors de la recherche du minimum sur la courbe finale (fd) ... Un peu d'aide svp

Discussions similaires

  1. Aide pour un code qui ne fonctionne pas correctement
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 05/03/2013, 09h23
  2. Aide pour terminer un code qui ne fonctionne pas
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 11/02/2013, 16h29
  3. [Language] Code qui ne fonctionne pas
    Par kevinf dans le forum Langage
    Réponses: 2
    Dernier message: 21/11/2006, 21h08
  4. Code qui ne fonctionne pas
    Par maxti dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 22/10/2006, 11h45
  5. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08

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