Está en la página 1de 5

APÉNDICE B

Código completo del programa en MATLAB que realiza la interfaz gráfica y los

cálculos necesarios para obtener la respuesta en frecuencia a partir de las mediciones del

OTDR.

function p3(action);
%funcion fundamental para empezar GUI y llamar a las otras funciones

if nargin<1,
action='start';
end;

global P3_DAT
global entrada
global salida

if strcmp(action,'start'),

%====================================
% Inicializacion de la interfaz grafica
oldFigNumber = watchon;
figNumber = figure;
set(gcf, ...
'NumberTitle','off', ...
'Name','Respuesta en frecuencia de una fibra mediante FFT', ...
'backingstore','off',...
'Units','normalized');

%====================================
% Medidas
arriba=0.95;
abajo=0.05;
izq = 0.78;
anchoEtiq=0.18;
alturaEtiq=0.05;
anchoBoton = 0.18;
alturaBoton=0.07;
offset=0.003;
espacio=0.05;

%====================================
% Consola
margen=0.02;
posY=0.05-margen;
posConsola=[izq-margen posY anchoBoton+2*margen 0.9+2*margen];
h=uicontrol( ...
'Style','frame', ...
'Units','normalized', ...
'Position',posConsola);

%====================================
% Popup para importar Archivo

numBoton=1;
posYEtiq=arriba-(numBoton-1)*(alturaBoton+alturaEtiq+espacio);
posEtiq=[izq posYEtiq-alturaEtiq anchoEtiq alturaEtiq];
uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position',posEtiq, ...
'HorizontalAlignment','left', ...
'String',' Importar Archivo');

posBoton=[izq posYEtiq-alturaEtiq-alturaBoton-offset anchoBoton alturaBoton];


popup=uicontrol('Style','Popup','String','Pulso de entrada|Pulso de salida',...
'Units','normalized',...
'Position', posBoton, ...
'CallBack','p3(''leeArchivo'')');

%====================================
% Caja de TEXTO
numBoton=3;
posYEtiq=arriba-(numBoton-1)*(alturaBoton+alturaEtiq+espacio);
posEtiq=[izq posYEtiq-alturaEtiq anchoEtiq alturaEtiq+margen];
texto_freq = uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position', posEtiq, ...
'String','Ancho de banda en Hz');

posBoton=[izq+margen/2 posYEtiq-alturaEtiq-alturaBoton-offset ...


0.8*anchoBoton+margen alturaBoton];
campo_freq = uicontrol( ...
'Style','edit', ...
'Units','normalized', ...
'Position', posBoton, ...
'BackgroundColor','w',...
'String','',...
'CallBack','');
%=======================================
% Boton Cerrar
boton_cerrar=uicontrol('Style','Pushbutton', ...
'Units','normalized',...
'Position',[izq abajo anchoBoton 2*alturaEtiq], ...
'Callback','p3(''acabar'')','String','Cerrar');
%====================================
% Boton calcula respuesta en frecuencia
boton_BW= uicontrol( ...
'Style','Pushbutton', ...
'Units','normalized', ...
'Position',[izq-2*offset/2 abajo+(4*alturaEtiq)+(2*espacio) anchoBoton+3*offset 2*alturaEtiq],...
'String','Resp. en Frecuencia', ...
'Callback','p3(''bw'')');
%====================================

val = get(popup,'Value');
[f,N]=carga_dato(val); %lee archivo del disco duro y llama a 'leeArchivo'

M=2048;
t0=0;
t1=10e-9;
t=linspace(t0,t1,N)';
T= (t1-t0)/N;

%evaluo que accion es: pulso de entrada o de salida


if (val==1),
ejes_freq=axes('Position',[.12 .14 .6 .3],'XLim',...
[0 1/(2*T)],'YLim',[-5 10]);
axis([0 1/(2*T) -5 10]);
[FF1,w]=haz_fft(f,M);
inf_freq=plot(w/(2*pi*T),(FF1),'EraseMode','xor');
elseif (val==2),
ejes_freq=axes('Position',[.12 .14 .6 .3],'XLim',...
[0 1/(2*T)],'YLim',[-5 10]);
axis([0 1/(2*T) -5 10]);
[FF2,w]=haz_fft2(f,M);
inf_freq=plot(w/(2*pi*T),(FF2),'EraseMode','xor');
salida=[FF2(:)];

end

grid on;
ylabel('Magnitud');
xlabel('Frecuencia (Hertz)');
title('Dominio de la Frecuencia');

ejes_tiempo=axes('Position',[.12 .58 .6 .3],'XLim',[t0 t1],'YLim',[10 240]);


inf_tiempo=plot(t,f,'EraseMode','xor');
axis([t0 t1 10 240]);
grid on;
ylabel('Magnitud');
xlabel('Tiempo (Segundos)');
title('Dominio del tiempo');

P3_DAT = [ N; M; campo_freq; inf_tiempo; inf_freq;t0;t1;0;popup;t(:);w(:)];


entrada=[FF1(:)];
watchoff(oldFigNumber);

elseif strcmp(action,'leeArchivo'),
%leo el archivo buscando su ubicacion para usarlo en el GUI

N=P3_DAT(1);
M=P3_DAT(2);
inf_tiempo=P3_DAT(4);
inf_freq=P3_DAT(5);
t0=P3_DAT(6);
t1=P3_DAT(7);
popup=P3_DAT(9);
t=P3_DAT(10:10+N-1);
w=P3_DAT(10+N:10+M+N-1);
FF1=entrada;

val = get(popup,'Value');

[f,N]=carga_dato(val);
t=linspace(t0,t1,N)';
set(inf_tiempo,'XData',t,'YData',f);

if (val==1),
[FF1,w]=haz_fft(f,M);
set(inf_freq,'YData',FF1);
elseif (val==2),
[FF2,w]=haz_fft2(f,M);
set(inf_freq,'YData',FF2);
salida=FF2;
end

drawnow;

elseif strcmp(action,'bw'),
%realiza los calculos para la respuesta en frecuencia
%al presionar el boton 'BW'

FF1=entrada;
FF2=salida;
campo_freq=P3_DAT(3)
BW=(FF2./FF1);
BWdB=20*log10(BW);
BWdB=BWdB(1:55);
maxBW=max(BWdB)
BWdB3=maxBW-3
c=find(BWdB3 -0.3 < BWdB & BWdB < BWdB3 +0.3)
c=mean(c)
freq=70e9*(0:c)/55;
frecuencia= freq(c)
set(campo_freq,'String',num2str(frecuencia));
plot(freq,(BWdB(1:c+1)),'EraseMode','xor');
Grid on;
title('Espectro de frecuencias del canal');
ylabel('Magnitud en dB');
xlabel('Respuesta en frecuencia (Herz)');

elseif strcmp(action,'acabar'),
%acaba y cierra todo

close(gcf);
clear global entrada
clear global salida
clear global P3_DAT

end
%====================================-
function [f,N] = carga_dato(val);

if (val == 1), %pulso de entrada


[filename,pathname]=uigetfile('*.txt','Busque la Señal Pulso de Entrada');
if ~ischar(filename),return,end

%lee archivo (usa la segunda columna solamente)


longfilename=strcat(pathname,filename);
s=load(longfilename);
if size(s,2)>1
fn=s(:,end);
N=length(fn);
f=10.^(fn/20);
end

elseif (val == 2), % pulso de salida


[filename,pathname]=uigetfile('*.txt','Busque la Señal Pulso de Salida');
if ~ischar(filename),return,end

%lee archivo (usa la segunda columna solamente)


longfilename=strcat(pathname,filename);
s=load(longfilename);
if size(s,2)>1
fn=s(:,end);
N=length(fn);
f=10.^(fn/20);
end

end;
%======================================
function [FF1,w] = haz_fft(f,M)
% calcula la FFT de la señal de entrada

N=length(f);
F=fft(boxcar(N).*f,2*M);
F=F(1:M);
w=(0:M-1)*pi/M;
indxs = find(F==0);
F(indxs) = eps; % Evita dividir entre cero
FF1=abs(F)/M;

%=======================================
function [FF2,w] = haz_fft2(f,M)
% calcula la FFT de la señal de salida

N=length(f);
F=fft(boxcar(N).*f,2*M);
F=F(1:M);
w=(0:M-1)*pi/M;
indxs = find(F==0);
F(indxs) = eps; % Evita dividir entre cero
FF2=abs(F)/M;

También podría gustarte