function signaux = refmul(zbouts,ligne,jonction,depart,type,amp,rmin)
% projet initial : Jean-Francois Labrie, labrie01@gel.ulaval.ca, fev2002
% améliorations  : Dominic Grenier, fev2002
%                  (nouveau : vitesses différentes,jonctions en T,position de départ quelconque,
%                  type de signal,passage des paramètres,couleurs)

% signaux issus des reflexions multiples
% dans des milieux d'impédances caractéristiques, longueurs et vitesses différentes
% avec des points de jonction
%
%zbouts :  vecteur des charges en bouts de ligne Rs[ohms],Rc[ohms] (1,2)
%ligne :   matrice des paramètres des N lignes,
%          chaque ligne donne Z_o[ohms],ell[m],v_p[% de c] (N,3)
%jonction: matrice des N-1 jonctions - 3 résistances en T
%          chaque ligne donne R_s1[ohms],Gp[S],R_s2[ohms] (N-1,3)
%          [0 0 0] pour une connexion directe
%depart :  point de départ du transitoire
%          0:complètement à gauche; 1:entre la 1ère et 2ème lignes; N:complètement à droite
%type :    choix du type de signal - v:tension; i:courant; p:puissance
%amp :     vecteur des signaux de départ vers la gauche et vers la droite (1,2)
%          selon le type choisi (tension, courant ou puissance)
%rmin :    si présent, rapport minimal entre la réflexion et le signal maximum
%
%exemple : zdiag([50 33],[50 200 100;100 100 66],[0 1/200 0],1,'v',[4 6])
%          charge 50 adaptée à gauche (1ère ligne) et charge de 33 non-adaptée à droite;
%          2 lignes Z_01=50,Z_02=100;l_1=200,l_2=100;v_p1=c,v_p2=2c/3
%          jonction faite d'une seule résistance parallèle de 200 Ohms
%          départ à la jonction : 4V vers la gauche et 6V vers la droite (cas fictif)
% 
global z l v M rs gp ampi signaux unit nb smin

switch type
	case 'v', unit='V';
	case 'i', unit='A';
	case 'p', unit='W';
    end
    
%
%isolation des paramètres de ligne et ajout des valeurs terminales à chaque extrémités
z=[zbouts(1) ligne(:,1)' zbouts(2)]; %impédances
l=[0 ligne(:,2)' 0];		     %longueurs
v=[1 3e6*ligne(:,3)' 1];	     %vitesses[m/sec]
jonction=[0 0 0;jonction;0 0 0]; %jonctions
%longueur des vecteurs l et z (M=N+2)
M=length(l);

%isolation des paramètres des jonctions
rs=zeros(2,M-1);
rs(1,:)=jonction(:,1)';        %R_s1
gp=jonction(:,2)';             %G_p=1/R_p
rs(2,:)=jonction(:,3)';        %R_s2

%amplitude maximale, remise à zéro des signaux et de leur nombre
ampi=max(abs(amp));
if (nargin==6) smin=0.001*ampi; else smin=rmin*ampi; end
signaux=[0 0 0 0];
nb=1;

recur(0,depart+1,-1,amp(1))	%fonction recursive, temps 0, section 2, direction gauche, amplitude gauche
recur(0,depart+2,+1,amp(2))	%fonction recursive, temps 0, section 2, direction droite, amplitude droite

return

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function recur(temps,section,direction,amplitude)
global z l M v rs gp ampi unit signaux nb smin

%critère d'arrêt de la récursion (amplitude minimum à considérer)
if section==1 | section==M | abs(amplitude)<smin 
    return	% retour si on est en dehors de la ligne ou si amplitude négligeable
end

%enregistrer le signal
signaux(nb,1:4)=[temps,section,direction,amplitude];
nb=nb+1;

%gamma=(z(section+direction)-z(section))/(z(section)+z(section+direction));
ptj  = section+(direction-1)/2;
rs1  = rs((3-direction)/2,ptj);
rs2  = rs((3+direction)/2,ptj);
gtmp = gp(ptj)+1/(rs2+z(section+direction));
gamma= (1/gtmp+rs1-z(section))/(1/gtmp+rs1+z(section));
tauv = (1+gamma)*(1/(1+rs1*gtmp))*(z(section+direction)/(z(section+direction)+rs2));
taui = (1-gamma)*(1/(1+gp(ptj)*(rs2+z(section+direction))));

% onde transmise :
switch unit
	case 'V', a_t=amplitude*tauv;
	case 'A', a_t=amplitude*taui;
	case 'W', a_t=amplitude*tauv*taui;
end
recur(temps+l(section)/v(section),section+direction,direction,a_t)

% onde réfléchie :
switch unit
	case 'V', a_r=amplitude*gamma;
	case 'A', a_r=-amplitude*gamma;
	case 'W', a_r=-amplitude*gamma^2;
end
recur(temps+l(section)/v(section),section,-direction,a_r)

return



