Salut à tous,
Dans le cadre de mes études, je dois écrire un petit programme matlab me générant un signal en dents de scie.
Je ne dois pas utiliser la fonction "sawtooth".
Mon signal aura une amplitude A, un rapport cyclique teta et une période Tr.
J'ai déjà écrit une fonction, mais elle ne fonctionne pas : Apparemment la condition est toujours fausse (j'ai un vecteur t allant de 0 à 20, de 1 en 1).
Code:
function out = dent_scie(A,t,teta,Tr)
if (mod(t,teta)> teta) %Si t est après teta...
out=0*(1-mod(t,Tr)/teta); %le signal est nul
else %Sinon
out = A*(1-mod(t,Tr)/teta);%Signal dent de scie
end
end
Je ne suis pas vraiment familier avec matlab et je ne vois pas où si situe le problème...
Pouvez-vous m'aider ?
Merci,
Tu as aussi la possibilité d'utiliser la fonction arctan(tan(t)) qui doit te dessiner une belle courbe en dents de scie.
PS: Après c'est à toi de t'arranger pour ajuster la valeur moyenne, période, amplitude...
PS2: Pour déboguer un programme le mieux c'est d'y insérer quelques lignes d'affichages de variables, cela permet de mieux suivre son exécution.
La curiosité est un très beau défaut.
05/12/2007 - 11h44
b@z66
Date d'inscription
août 2005
Localisation
Echirolles
Âge
33
Messages
2 837
Re : Signal en dents de scie sous matlab
if (mod(t,Tr)> teta) %Si t est après teta...
La curiosité est un très beau défaut.
05/12/2007 - 14h24
Tony78
Date d'inscription
avril 2007
Âge
26
Messages
102
Re : Signal en dents de scie sous matlab
Merci pour ta réponse.
J'ai fait la modification que tu m'as conseillé, mais le programme ne fonctionne pas correctement. Le "teta" à la place du Tr ne convenait effectivement pas, mais cela ne résoud pas le problème.
J'ai bien un signal en dents de scie, mais pas celui que je veux :
Celui désiré ressemblerait à ça : |\__|\__|\__ ... (Entre 0 et A volts)
Celui que j'ai est le suivant : |\|\|\|\|\|\ (De A, il descend à une valeur jusqu'à ce que mod(t,Tr) reparte à 0).
Le problème vient de la condition : Apparemment, elle est toujours fausse...le programme va donc dans le bloc "else".
J'appelle ma fonction avec la commande suivante :
dent_scie(5,t,5,10);
t a été généré avec une commande de la forme :
t = 0:20;
Je ne vois vraiment pas où pourrait se trouver l'erreur ...
05/12/2007 - 14h52
b@z66
Date d'inscription
août 2005
Localisation
Echirolles
Âge
33
Messages
2 837
Re : Signal en dents de scie sous matlab
Suis mes conseils: mets des affichages de variables dans ton programme, vérifies que la longueur de tes vecteurs en entrée et sortie de ton programme sont identiques...Cela fait aussi quelques années que je n'ai pas fait de matlab mais je te conseillerai de vérifier que ta variable out est soit un vecteur en entier(toutes les variables ensemble), soit une variable faisant partie du vecteur. On dirait que tu as supposé la deuxième hypothèse...à toi de voir...
que représente t dans ton programme? un vecteur ou une variable?
Dernière modification par b@z66 ; 05/12/2007 à 14h56.
J'ai fait afficher 't' dans mon programme (disp (t)) au début du prog, ce qui a eu pour incidence d'afficher t à chaque fois que je lance le programme.
t étant un vecteur de longueur n, la fonction calcule le résultat pour n instants, et la valeur de t est affichée n fois. J'ai pu m'appercevoir que t était modifié à chaque passage dans ma fonction "dent_scie".
En sortie, j'ai un vecteur de longueur n.
Tout colle à ce que je veux, sauf cette histoire de condition...
05/12/2007 - 15h16
Tony78
Date d'inscription
avril 2007
Âge
26
Messages
102
Re : Signal en dents de scie sous matlab
Je viens de faire un nouvel essai : J'affiche le résultat de la comparaison "mod(t,Tr)> teta". J'ai bien 0 quand la condition est fausse, et 1 lorsque c'est vrai, mais le bloc if ne réagit pas...
05/12/2007 - 15h32
b@z66
Date d'inscription
août 2005
Localisation
Echirolles
Âge
33
Messages
2 837
Re : Signal en dents de scie sous matlab
Envoyé par Tony78
J'ai fait afficher 't' dans mon programme (disp (t)) au début du prog, ce qui a eu pour incidence d'afficher t à chaque fois que je lance le programme.
t étant un vecteur de longueur n, la fonction calcule le résultat pour n instants, et la valeur de t est affichée n fois. J'ai pu m'appercevoir que t était modifié à chaque passage dans ma fonction "dent_scie".
En sortie, j'ai un vecteur de longueur n.
Tout colle à ce que je veux, sauf cette histoire de condition...
Ton programme est mal écrit puisqu'il suggère implicitement que t est une variable et non un vecteur. Ce qui se passe, c'est que lorsque tu calcules à chaque fois:
out=0*(1-mod(t,Tr)/teta); %le signal est nul
ou
out = A*(1-mod(t,Tr)/teta);%Signal dent de scie
Tu recalcules le vecteur out en entier et non pour des valeurs particulières lui appartenant.
Il te faut indexer ces valeurs du genre t(1), t(2),...,t(size(t))
out(1), out(2),...out(size(out)) et faire les calculs pour chaque index à l'aide d'une boucle for.
La curiosité est un très beau défaut.
05/12/2007 - 15h59
Tony78
Date d'inscription
avril 2007
Âge
26
Messages
102
Re : Signal en dents de scie sous matlab
J'ai modifié le programme et utilisé les index : Résultat, c'est bon, ça marche
Merci pour tes conseils !
Au final, le code est devenu ça :
Code:
function signal = dent_scie(A,t,teta,Tr)
for (t_id = 1:length(t))
if (mod(t(t_id),Tr)>= teta)
signal(t_id)=0;
else
signal(t_id)=A*(1-mod(t(t_id),Tr)/teta);
end
end
end