Saltar al contenido principal

Derivación e integración

Cálculo infinitesimal (calculus)​

Derivación "derive"1​

La función derive() deriva la señal de entrada x(t)x(t) respecto al tiempo.

y=ddtx(t),[y]=[x]sy = \frac{d}{dt}x(t), \quad [y] = \frac{[x]}{\mathrm{s}}

Sin configuración JSON, derive() calcula el cociente instantáneo Δx/Δt\Delta x / \Delta t entre dos instantes de evaluación consecutivos cualesquiera. Este modo simple solo tiene sentido si la señal de entrada es realmente interpolable de forma lineal, por ejemplo valores de medición muestreados de forma equidistante.

Para señales con evolución equidistante se recomienda el modo de rejilla: con fOut, la señal de entrada se remuestrea sobre una rejilla temporal uniforme y se deriva con un filtro diferenciador FIR deslizante de orden nFilt. El filtro FIR forma un cociente diferencial ponderado sobre los últimos 2⋅nFilt2 \cdot \texttt{nFilt} puntos de la rejilla y permite así un compromiso entre la supresión del ruido y el retardo de fase.

Para señales con un rango de valores cíclico (p. ej., contadores angulares de 0° a 360° o encóders incrementales con desbordamiento), el parámetro modulo activa una corrección de desbordamiento. La función detecta los desbordamientos mediante la zona de desbordamiento ovflz y corrige el gradiente de modo que no se produzca ningún salto de signo en el resultado de la derivada.

y1 = derive(x);
y2 = derive(x, { fOut: <dbl>|'def'
, nFilt: <uint>
, reduction: <uint>
, modulo: <dbl>
, ovflz: <dbl>
});
PropiedadValorDescripción
fOutdef/<dbl>Frecuencia de muestreo de salida del modo de rejilla en Hz. 'def' utiliza el tiempo de muestreo global (discreteSampleTimeMs). Valor mínimo: 0,1 Hz.
nFilt<uint>Orden del filtro diferenciador FIR deslizante. Los valores más altos reducen el ruido a costa del retardo de fase. Solo es efectivo en el modo de rejilla.
Valor por defecto: 2, rango de valores: [2…10][2 \ldots 10]
reduction<uint>Emite solo cada n-ésimo punto de rejilla calculado. Permite una tasa de salida inferior a fOut. Los valores ≤ 1 se ignoran.
modulo<dbl>Activa la corrección de desbordamiento para señales cíclicas. Indica el rango de valores completo (p. ej., 360.0 para ángulos en grados, 6.2832 para ángulos en radianes).
Rango de valores: >0.0> 0.0
ovflz<dbl>Zona de desbordamiento como fracción de modulo. Se detecta un desbordamiento cuando el nuevo valor ocupa la zona [0, ovflz⋅modulo[[0,\ \mathtt{ovflz} \cdot \mathtt{modulo}[ y el anterior la zona ](1−ovflz)⋅modulo, modulo]](1-\mathtt{ovflz}) \cdot \mathtt{modulo},\ \mathtt{modulo}] (o a la inversa).
Valor por defecto: 0,333, rango de valores: ]0,0;0,5[]0,0; 0,5[
nota

Dado que el smartCORE, por lo general, solo escribe en un canal los valores de señales no equidistantes cuando el valor ha cambiado, el valor entre dos puntos de apoyo explícitos debe suponerse siempre constante y falta la información del último intervalo de muestreo real. Entre los puntos de apoyo se aplica siempre el valor de señal del lado izquierdo (retenedor de orden cero). El resultado es una señal en forma de escalera.

La aplicación de la derivación a señales no equidistantes con forma de escalera carece de sentido. El resultado sería 00 o bien ±∞\pm \infty

Si la entrada llega con grandes lagunas (la distancia entre dos instantes de evaluación supera el doble del intervalo de llamada evaluationTimeMs), la rejilla temporal del modo de rejilla se vuelve a anclar en lugar de continuar a través de la laguna. Por tanto, no se forma ningún gradiente a través de una laguna de este tipo.

Integración "integrate"​

La función integrate() proporciona la integral temporal de la función de entrada x

y=∫0tx(τ)dτy = \int_0^tx(\tau)d\tau

Dado que x(τ)x(\tau) proporciona siempre puntos de apoyo individuales en instantes no equidistantes t0,t1,t2,...tnt_0, t_1, t_2, ... t_n, entre los cuales se supone constante el valor de la función del lado izquierdo, la integral puede escribirse también como suma:

y=∑n=0N−1x(tn)(tn+1−tn)y = \sum_{n=0}^{N-1}x(t_n)(t_{n+1}-t_n)

La unidad física del resultado se amplía con una dimensión temporal: [y]=[x]⋅s[y] = [x] \cdot \rm{s}.

Si la señal de entrada está marcada como interpolable linealmente, como por ejemplo la salida de otra función integrate(), entre dos puntos de datos discurre como una rampa y se integra como un trapecio:

y=∑n=0N−1x(tn)+x(tn+1)2(tn+1−tn)y = \sum_{n=0}^{N-1}\frac{x(t_n)+x(t_{n+1})}{2}(t_{n+1}-t_n)

Los valores NaN e INF se sustituyen por el último valor finito recibido; antes del primer valor finito, la integral permanece en su valor inicial. Para y y preset solo se aceptan escalares numéricos; con un vector, una matriz, una cadena de texto o un valor complejo, integrate() devuelve el mensaje de error Input Value is not a numerical scalar.

I1 = integrate(y);
I2 = integrate(y, reset);
I3 = integrate(y, reset, preset);
// Optionale Konfiguration für alle Varianten
Ix = integrate(..., { start: <dbl>
, preset: <dbl>
, lower: off|<dbl>
, upper: off|<dbl>
, storage: <str>
});

Si mediante el parámetro opcional reset se suministra un true, la integral se restablece al valor fijado con preset (como parámetro o propiedad, por defecto 0.0) y se mantiene. Inmediatamente antes del restablecimiento se inserta una muestra adicional con la que se emite el último valor de la integral acumulado hasta ese momento ("true peak"). Este valor también está limitado a lower y upper. Un parámetro preset no finito se considera no indicado; entonces se aplica la propiedad preset.

PropiedadValorDescripción
start<dbl>Primer valor inicial de la integral al arrancar el módulo Math
preset<dbl>Valor fijo para el restablecimiento de la integral mediante el parámetro reset
loweroff/<dbl>Limita el valor de la integral por abajo, si está activado. Esto se necesita, por ejemplo, para la implementación de estructuras de regulación o modelos en los que el proceso de integración está limitado por un límite físico.
upperoff/<dbl>Limita el valor de la integral por arriba, si está activado. Esto se necesita, por ejemplo, para la implementación de estructuras de regulación o modelos en los que el proceso de integración está limitado por un límite físico.
storage<str>Nombre de una memoria persistente para el valor interno de la integral. Con ello, tras un reinicio del sistema, la integración continúa desde el último valor guardado.
El contenido de esta memoria no se puede utilizar en ningún otro lugar del smartCORE.

Ejemplo:​

En el Ejemplo 1a se utiliza la función integrate() para calcular la energía eléctrica a partir de las evoluciones temporales de corriente y tensión.

En el Ejemplo 10 se utiliza la función integrate() para medir tiempos.

Suma "sumup"​

La función sumup() proporciona la suma de los valores individuales de la señal de entrada x en los instantes de un flanco positivo en el parámetro trigger

y=∑n=0N−1x(tn)mittn=time(posedge(trigger))y = \sum_{n=0}^{N-1}x(t_n)\quad\rm{mit}\quad t_n=time(posedge(trigger))
S1 = sumup(x, trigger);
S2 = sumup(x, trigger, reset);
// Optionale Konfiguration für alle Varianten
Sx = sumup(... , { storage: <str>
});

Si mediante el parámetro opcional reset se suministra un true, la suma se restablece a 0.0 y se mantiene.

Los valores NaN e INF se sustituyen por el último valor finito recibido; antes del primer valor finito no se suma nada. Una suma no finita en la memoria persistente se considera no guardada. Solo se aceptan escalares numéricos; con un vector, una matriz, una cadena de texto o un valor complejo, sumup() devuelve el mensaje de error Input Value is not a numerical scalar.

PropiedadValorDescripción
storage<str>Nombre de una memoria persistente para el valor interno de la suma. Con ello, tras un reinicio del sistema, la suma continúa desde el último valor guardado.
El contenido de esta memoria no se puede utilizar en ningún otro lugar del smartCORE.

Footnotes​

  1. Disponible a partir de la versión 13 del catálogo. ↩