Vous êtes sur la page 1sur 15

%%primero analizamos la respuesta al "escalón" obtenida en la pracitica

cd ~/Escritorio/SysII/Pra_2_3/ALL0005/
ch1= importdata('ch1.csv');
ch2= importdata('ch2.csv');
tiempo= importdata('tiempo.csv');
cd ~/Escritorio/SysII/Pra_2_3/
plot(tiempo,ch1,'r')
hold on
plot(tiempo,ch2,'b')
title('señal de entrada vs señal de salida')
xlabel('tiempo (s)')
ylabel('voltaje (mv)')
grid('minor')
Ts=tiempo(2);
%%como podemos ver lo que nos importa está apartir del tiempo 2.5 en
%%adelante
idx=find(tiempo>(0.25-Ts));%%para comenzar apartir del tiempo 2.5 segundos
%%nos quedamos con lo que más nos importa de la señal
ch1=ch1(idx);
ch2=ch2(idx);
tiempo=tiempo(idx);
%%Mostrando la parte que nos interesa
clf
plot(tiempo,ch1,'r')
hold on
plot(tiempo,ch2,'b')
title('señal de entrada')

%%La respuesta al escalón tiene la forma s(t)=A*exp((1/Tao)*t)sin(wo*t + phase) + k; para t>=0


%%para calcular k primero encontramos el promedio de la respuesta de estado estable
%%vemos que lo que necesitamos de señal está entre 0.5 segundos y 0.9
idx=find(tiempo>0.5 & tiempo<0.9);
%%sin embargo es necesario promediar todas las muestras realizadas en ese tiempo ya que debido a la
existencia del ruido
%%no es bueno tomar un solo valor de dicho rango
prom=0;
for i=1:1:length(idx)
k=idx(i);
prom=prom+ch2(k);
end
prom=prom/length(idx);
%%prom es k dado que es el promedio de la respuesta de estado estable del sistema
%%es mas facil ver la respuesta transitoria quitando la señal de estado estable, entonces
y=ch2-prom;
%%observamos la respuesta transitora del sistema
clf
plot(tiempo,y,'b')
hold on
plot(tiempo,ch1,'r')
grid ('minor')
axis([0.26 0.7 -0.6 0.35])

%%midiendo sacamos los cruces en cero para la respuesta transitoria, tenemos los
%%siguientes cruces, midiendo en el intervalo donde es visible la respuesta
%%transitoria
a=0.2996;%%Medimos manualmente estos cruces pues hay ruido y hacerlo con
b=0.316;%%algun algoritmo nos lo dificultaría
c=0.3324;
d=0.3504;
e=0.3672;
%%y calculamos 3 periodos de la forma
T1=c-a;
T2=d-b;
T3=e-c;
T=(T1+T2+T3)/3;
%%Ahora sacamos los valores de las crestas, crestas negativas probamos sacando el absoluto de la
respuesta
%%transitoria
y=abs(y);
%%Para encontrar el momento en el que comienza el escalon
u_t=[find(ch1 > 0.9)];
To=tiempo(u_t(2));%%Tiempo en el que comienza el escalón
clear u_t; %%Ya no necesitaremos más esta señal
idx=find(tiempo>(To-Ts) & tiempo<0.3808);%%tiempo>(To-Ts) implica que analizaremos apartir de
To
time=tiempo(idx);%%solo nos quedamos en el tiempo apartir del tiempo en el que comenzó el escalón
y1=y(idx);%%solo nos quedamos con la respuesta al escalon
clf
plot(time,y1)
cd ~/Escritorio/SysII/Pra_2_3/
[c,v]=localiza_minmax(y1);%%Buscamos las crestas
crestas=y1(c);
mu=time(c);
puntos=y1(c);
hold on
stem(time(c),y1(c),'ro') %%Graficamos las crestas dadas por la funcion localiza_minmax
pause
%%seleccionamos varios puntos para utilizarlos de crestas, armando a X,SY
%%de forma manual, donde X es el tiempo y SY los valores que estos tienen
X=[0.2892 0.3076 0.324 0.3408];
SY=[0.3474 0.22746 0.12966 0.068745];
hold on
plot(X,SY,'ko','linewidth',3)

%%Los puntos en negro son los que seleccionamos como las crestas de la señal
recta=polyfit(X,log(SY),1);%%calculamos la sigma (inversa de la Tao) con el metodo de minimos
cuadrados a una recta
%%dicha recta tiene la forma ln(A)+sigma*(t-To)
yi=polyval(recta,X); %%obtenemos los valores de la recta para poder visualizarla
clf
plot(X,yi) %%Grafica la recta, ya que ployval te regresa los vaores en cada tiempo
grid('minor')
pause
%%%de la recta tenemos que el valor de yi(1)=(0.2892,-0.9869) tenemos que la cresta uno
%%la cual se da en el tiempo 0.2892 y tiene un valor -0.9869 en y con la ecuación de la
%%recta y=mx + b; buscamos el valor de y en el tiempo To (cuando comenzó el escalón)
lnA=recta(1)*(To-0.2892) + (-0.9869);%%y(t2)=sigma*(t2-t1) + y(t1)
A=exp(lnA);
sigma=recta(1);
%%recostruimos a y como la respuesta transitoria del sistema
y=ch2-prom;
y=y(idx);
%%utilizando las crestas antes calculadas podemos obtener varias fases
idx2=[find(time>0.2891 & time<0.2893), find(time>0.3075 & time<0.3077), find(time>0.3239 &
time<0.3241), find(time>0.3407 & time<0.3409)];
SY=y(idx2);
time2=time(idx2);
hold on
plot(time2,SY,'ro','linewidth',3)

%%tenemos que Debido a la


grafica las crestas deben estár aprox en [pi/2, 3*pi/2, 5*pi/2, 7*pi/2] y tambien tenemos que la fase es
%%phase = asin(SY./(A*exp(sigma*time2)) - 2*pi/(time2-0.2729); primero resolvemos el problema
del seno inverso:
%%sin embargo debido a que asin solo devuelve valores en el rango de
%%[pi/2,-pi/2] y las cestas deberian estar idealmente en
%%[pi/2 3*pi/2 5*pi/2 7*pi/2] sin embargo sabemos que wo(t-To) no es mas que una rotación en el
tiempo, esto es que wo(t-To) por mas que
%%cresca siempre representará alguna posición en el circuulo unitario
%%primero obtenemos la parte del seno inverso
lo=SY./(A*exp(sigma*(time2-To)));
%%Idealmente esta divición deberia estar en 1, por que las crestas tienen un valor teorico de
A*exp(sigma*(t-To)) pero no es así
%%y recordando que asín no trabaja con valores mayores a 1, es necesario regresar dicha division al
rango con el que trabaja asin
%%asi que si abs(lo)> 1, hacemos abs(lo) sea igual a 2 - abs(lo)
for (k=1:length(lo))
if(abs(lo(k)) > 1)
if(lo(k) > 0)
lo(k)=2-lo(k);
else
lo(k)=-lo(k)-2;
end
end
lo(k)=asin(lo(k));
end
lo=lo/pi; %%necesitamos a lo en pi*radianes
%%Ahora la parte de la wo está sopbre el circulo unitario y por lo tanto esto va "rodando" conforme el
tiempo avanza, para esto
%%es mejor expresar que todo valor mayor que pi está en menos pi, esto implica solo utilizar un rango
de [-pi, pi]
pa=(2/T)*(time2-To);%%nos da cuanto ha avanzado wo(t-To) en el circulo unitario utilizaremos la
función de redondeo
pa2=round(pa);
for(k=1:length(pa))
if (mod(pa2(k),2)==1)%% mod(pa2(k),2) nos regresa el modulo depa2(k)/2, si es igual a 1 es impar
pa(k)=pa(k)-(pa2(k)-1);
else pa(k)=pa2(k)-pa(k);
end
end
ph=lo-pa; %%obtenemos un vector con la fase en cada cresta
tht=(1/length(pa))*ones(1,length(pa)); %%Para sacer el promedio de la fase
phase=tht*ph;
%%Para cotejar que la función es casi la misma obtenida
S_t=A*exp(sigma*(time-To)).*sin((2*pi/T)*(time-To) + phase*pi);
clf
plot(time,y,'b')
hold on
plot(time,S_t,'r')
grid('minor')

clear i ch1 ch2 tiempo %


%borramos las variables que ya utilizaremos más
%%sin embargo recordamos que al tomar la señal inverimos el canal, esto implica que
A=-A;
%%Volvemos a mostrar a h(t) como deberia ser originalmente Vs la invertida
S_t=A*exp(sigma*(time-To)).*sin((2*pi/T)*(time-To) + phase*pi);
clf
plot(time,y,'b')
hold on
plot(time,S_t,'r')
grid('minor')

%%Lafrecuencia (en rad/seg) a la que oscila la respuesta transitoria


wo=2*pi/T;
%%entonces los polos del sistema son complejos conjugados (p1=sigma+-i*wo)
p1=sigma+i*wo;
%%Debido a que S(s) = H(s)*(1/s) tenemos que los coeficientes de las fracciones parciales
pertenecientes al sistema (A_h) se evaluan
%%A(k)= (s-pk)*H(s)/s |s=pk pero sabemos que (s-pk)*H(s) |s=pk es igual a A_h(k), entonces
A(k)=A_h(k)/s |s=pk
%%entonces deseamos encontrar a A_h(k), multiplicando de ambos lados por s tenemos
A_h(k)=A(k)*s |s=pk
%%como A,pk son complejos podemos expresarlos de la forma A_h= ||pk|| * ||A(k)|| exp(i*(arg{pk} +
arg{A(k)}))
A_h=A*abs(p1);
phi=phase + angle(p1)/pi;
%%entonces podemos construir a h(t)
h_t=(A_h*exp(sigma*(time-To))).*sin(wo*(time-To) + phi*pi);%%al hacer algebra basandonos en
Laplace no cambia de función seno a coseno
%%como dijo el profe. asíq eu buscamos que sea igual al coseno, esto se logra desfasando pi/2
clf
plot(time-To,h_t,'b')
phi2=phi - 1/2;
h_t2=(A_h*exp(sigma*(time-To))).*cos(wo*(time-To) + phi2*pi);
hold on
plot(time-To,h_t2,'r')
%% %%%%%%%%%%%%%%%%%Segunda parte de la Practica%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%
%%Bode
%%Primero checamos la magnitud en decibeles en funcion de la frecuencia
clearvars -except A_h T phi2 sigma wo
cd ~/Escritorio/SysII/Pra_2_3/Bode/
Frec=importdata('Frec.csv');%%Frecuencias utilizadas en la magnitud
Vo=importdata('Vo.csv');%%Para a magnitud
Vi=importdata('Vi.csv');%%Para a magnitud
Hz=importdata('Hz.csv');%%Frecuencis utilizadas en la fase
ph=importdata('ph.csv');%%Para a fase
cd ~/Escritorio/SysII/Pra_2_3/
w=2*Frec;%%Deja la frecuencia en pi*radianes/s
semilogx(w,20*log10(Vo./Vi),'k','linewidth',3)
H_jw=A_h*((i*w*pi-sigma)*cos(phi2*pi)-wo*sin(phi2*pi))./(-((w*pi).^2) - i*2*sigma*w*pi +
(wo^2)+(sigma^2));
Hold on
semilogx(w,20*log10(abs(H_jw)),'r')
title('Magnitud teorica VS Magnitud práctica')
xlabel('pi*rad/s')
ylabel('AdB')
grid('minor')
%%Ahora obtenemos la fase del sistema en función de la frecuencia
w1=2*Hz;
H_jw1=A_h*((i*w1*pi-sigma)*cos(phi2*pi)-wo*sin(phi2*pi))./(-((w1*pi).^2) - i*2*sigma*w1*pi +
((wo^2)+(sigma^2)));
clf
semilogx(w1,ph/pi,'k','linewidth',3)
hold on
semilogx(w1,angle(H_jw1)/pi,'r')
title('Fase practica Vs Teorica');
xlabel('pi*rad/s')
ylabel('fase rad')
grid ('minor')
axis([0 10000 -1 1])
clearvars -except A_h T phi2 sigma wo
cd ~/Escritorio/SysII/Pra_2_3/ALL0000/
ch1=importdata('ch1.csv');
ch2=importdata('ch2.csv');
tiempo=importdata('tiempo.csv');
cd ~/Escritorio/SysII/Pra_2_3/
%%Recortamos un pedazo de la señal para obtener su espectro
idx=find(tiempo >0.5 & tiempo <2.8);
x=[ch1(idx)];%%Fragmento de la entrada
y=[ch2(idx)];%%Fragmento de la salida
N=length(idx);%%Numero de muestras
plot(tiempo(idx),x,'b')
hold on
plot(tiempo(idx),y,'r')
title('Segmento de la señal a tomar')
Ts=tiempo(2);
w_o=2*pi/N;%%Representamos a w_o como la frecuencia discreta y a wo como la analogica
omg=[0:1:length(x)-1]*w_o;%%este vector contiene todas las frecuencias discretas que hay en el
fragmento de señal
%%con un rango de cero a 2*pi
E=exp(repmat([0:N-1]',1,N).*repmat([0:N-1],N,1)*w_o*-i);
A1=x.'*E/N;%%Espectro de la entrada
A2=y.'*E/N;%%Espectro de la salida
clf
w=omg(1:1:(length(x)/2)+1)./(pi*Ts);%%está en pi*rad/s
%%Obtenemos entonces los valores de H_jw para dichas frecuencias
H_jw=A_h*((i*w*pi-sigma)*cos(phi2*pi)-wo*sin(phi2*pi))./(-((w*pi).^2) - i*2*sigma*w*pi +
(wo^2)+(sigma^2));
A1=[A1(1:1:length(w))];%%vector del espectro de entrada
A2=[A2(1:1:length(w))];%%vector del espectro de salida
Y1=H_jw.*A1;%%Multiplicacion de espectros entrada y respuesta
clf
plot(w/2,abs(A1),'b')
hold on
plot(w/2,abs(Y1),'r','linewidth',2)
title('Comparacion magnitud')
axis([0 20 0 2.5])
%%%%%%%%%%%Fase%%%%%%%%%%%%%%%%%%%
clf
plot(w/2*pi,angle(A1)/pi,'b')
hold on
plot(w/2*pi,angle(Y1)/pi,'r-','linewidth',1)
axis([0 200 -1 1])

Vous aimerez peut-être aussi