Copyright | (c) Ivan Perez 2019-2023 (c) Ivan Perez and Manuel Baerenz 2016-2018 |
---|---|
License | BSD3 |
Maintainer | ivan.perez@keera.co.uk |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Integration and derivation of input signals.
In continuous time, these primitives define SFs that integrate/derive the input signal. Since this is subject to the sampling resolution, simple versions are implemented (like the rectangle rule for the integral).
In discrete time, all we do is count the number of events.
The combinator iterFrom
gives enough flexibility to program your own
leak-free integration and derivation SFs.
Many primitives and combinators in this module require instances of
simple-affine-spaces's VectorSpace
. BearRiver does not enforce the use of a
particular vector space implementation, meaning you could use integral
for
example with other vector types like V2, V1, etc. from the library linear.
For an example, see
this gist.
Synopsis
- integral :: (Monad m, Fractional s, VectorSpace a s) => SF m a a
- imIntegral :: (Fractional s, VectorSpace a s, Monad m) => a -> SF m a a
- trapezoidIntegral :: (Fractional s, VectorSpace a s, Monad m) => SF m a a
- impulseIntegral :: (Fractional k, VectorSpace a k, Monad m) => SF m (a, Event a) a
- count :: (Integral b, Monad m) => SF m (Event a) (Event b)
- derivative :: (Monad m, Fractional s, VectorSpace a s) => SF m a a
- iterFrom :: Monad m => (a -> a -> DTime -> b -> b) -> b -> SF m a b
Integration
integral :: (Monad m, Fractional s, VectorSpace a s) => SF m a a Source #
Integration using the rectangle rule.
imIntegral :: (Fractional s, VectorSpace a s, Monad m) => a -> SF m a a Source #
"Immediate" integration (using the function's value at the current time).
trapezoidIntegral :: (Fractional s, VectorSpace a s, Monad m) => SF m a a Source #
Trapezoid integral (using the average between the value at the last time and the value at the current time).
impulseIntegral :: (Fractional k, VectorSpace a k, Monad m) => SF m (a, Event a) a Source #
Integrate the first input signal and add the discrete accumulation (sum) of the second, discrete, input signal.
count :: (Integral b, Monad m) => SF m (Event a) (Event b) Source #
Count the occurrences of input events.
>>>
embed count (deltaEncode 1 [Event 'a', NoEvent, Event 'b'])
[Event 1,NoEvent,Event 2]
Differentiation
derivative :: (Monad m, Fractional s, VectorSpace a s) => SF m a a Source #
A very crude version of a derivative. It simply divides the value difference by the time difference. Use at your own risk.