| srgenerator(profin,pts,SR,step,Vl,Vh,Ti,to,tf,Tn)
|
function [fout, velprof] = srgenerator(profin,pts,SR,step,Vl,Vh,Ti,to,tf,Tn)
% SRgenerator, Step Rate Generator.
% Rutina generadora de los pasos que van hacia el indexador.
% Se pueden generar los pasos como si fuera un sistema analogico
% o un sistema discreto.
% La rutina deduce si se desea la primer modalidad de calculo o la
% segunda, cuando se introduce el 7mo termino, el Ti.
% Si se introducen 3 terminos mas, es decir el to, tf y el Tn se muestra
% en pantalla las estadisticas del perfil a producir
% De cualquiera de las formas Vl y Vh son la amplitud minima y mxima de
% salida de la fout
% Author: Sergio Alejandro Gonzalez
% Copyright (c) 1998-99 by S.A.Gonzalez.
% $Revision: 1.0 $ $Date: 1999/02/25 16:17:20 $
error(nargchk(6,10,nargin))
if nargin == 6, % Rutina generadora de pasos analogica, VCO:
fs = 1/(step);
profile = (2*profile)-1; % se corrige la ampliud del perfil
fout = VCO(0.999*profin(1:pts), [0 SR], fs);
fout = 100*fout;
Vlevel = 93;
% Ac se genera el tren de pulsos.
% La salida del VCO es una frec. variable fout:
% se genera la salida frecuencial
% Frecuencia maxima de salida de los pulsos, 1 cada T=1/f=1/(Q*SR)
%
% se recorta la salida (discriminador)
%
for k = 1:pts,
if fout(k) >= Vlevel
fout(k) = Vh;
else
fout(k) = Vl;
end
end
else % Rutina generadora de pasos discreta, DSP:
% NMax = ((tf-to)/Ti); % La salida tiene como maximo tf/Ti puntos.
% Qk = (Ti/step);
Qk = ceil(Ti/step);
NMax = ceil(pts/Qk);
fotmp = zeros(1, NMax); % Numeric array preallocation
proftmp = zeros(1, NMax); % Numeric array preallocation
proftmp([1:1:NMax]) = profin([1:Qk:pts]);
j = 1;
k = 1;
while (k < NMax),
if (SR*proftmp(k))*j*Ti >= 1 % >= y no > pues sino el perfil no llega a la velocidad maxima.
fotmp(k) = 1;
j = 1;
else
j = j + 1;
end
k = k + 1;
end
% plot([tf/length(fotmp):tf/length(fotmp):tf], fotmp);
% plot([tf/length(proftmp):tf/length(proftmp):tf], SR*proftmp, [0:step:tf-step], SR*profin);
%
% Detector de cruce por cero/flanco de subida:
%
k = 2;
fout = Vl*ones(1, NMax); % Numeric array preallocation
count = 0; % steps counter
while (k < NMax),
% if (fotmp(k) == 1) & (fotmp(k-1) ~= 1)
if (fotmp(k) == 1)
fout(k) = Vh;
count = count + 1;
else
fout(k) = Vl;
end
k = k + 1;
end
%
% Clculo y visualizacin en pantalla del nmero de
% pasos a simular y de la velocidad promedio por segundo.
%
ind = 0;
inda = 0;
indb = 0;
velprof = zeros(1, NMax); % Numeric array preallocation
k = 2;
while (k < NMax),
if fout(k) == Vh % busca una delta
if inda ~= 0 % dice que no es la primera delta
velprof(ind:k-1) = 1/(Ti*(indb+1));
ind = k;
indb = 0;
end
ind = k;
inda = 1; % dice que es la primer delta
indb = 0;
else
indb = indb + 1;
end
k = k + 1;
end
if nargin == 10, % Se precisa visualizacion
clc
sprintf( ' Este perfil de velocidad produjo: %0.5g%s\n%s%0.5g%s\n\r%s\n', count,...
' pasos,',' es decir una razon de: ', count/(tf-to-Tn), ' pps.',...
' Pulse una tecla para ver el grfico comparativo de velocidades')
%disp(' Strike any key to continue')
%pause
end
end
%error(nargchk(6,6,nargin));
% end SRgenerator
|
|