emd-0.1.10.0: Empirical Mode Decomposition and Hilbert-Huang Transform

Copyright(c) Justin Le 2018
LicenseBSD3
Maintainerjustin@jle.im
Stabilityexperimental
Portabilitynon-portable
Safe HaskellNone
LanguageHaskell2010

Numeric.EMD

Contents

Description

Empirical Mode Decomposition in pure Haskell.

Main interface is emd, with defaultEO. A tracing version that outputs a log to stdout is also available, as emdTrace. This can be used to help track down a specific IMF that might be taking more time than desired.

This package uses "sized vectors" as its main interface, to ensure:

  1. The resulting EMD contains IMFs that are all the same length as the input vector
  2. We provide a vector of size of at least one.

There are many functions to convert unsized vectors to sized vectors in Data.Vector.Sized and associated modules, including toSized (for when you know the size at compile-time) and withSized (for when you don't).

Synopsis

Empirical Mode Decomposition

emd :: (Vector v a, KnownNat n, Floating a, Ord a) => EMDOpts a -> Vector v (n + 1) a -> EMD v (n + 1) a Source #

EMD decomposition of a given time series with a given sifting stop condition.

Takes a sized vector to ensure that:

  1. The resulting EMD contains IMFs that are all the same length as the input vector
  2. We provide a vector of size of at least one.

emdTrace :: (Vector v a, KnownNat n, Floating a, Ord a, MonadIO m) => EMDOpts a -> Vector v (n + 1) a -> m (EMD v (n + 1) a) Source #

emd, but tracing results to stdout as IMFs are found. Useful for debugging to see how long each step is taking.

emd' :: (Vector v a, KnownNat n, Floating a, Ord a, Applicative m) => (SiftResult v (n + 1) a -> m r) -> EMDOpts a -> Vector v (n + 1) a -> m (EMD v (n + 1) a) Source #

emd with a callback for each found IMF.

iemd :: (Vector v a, Num a) => EMD v n a -> Vector v n a Source #

Collapse an EMD back into its original time series. Should be a left-inverse to emd: using iemd on the result of emd should give back the original vector.

Since: 0.1.5.0

data EMD v n a Source #

An EMD v n a is an Empirical Mode Decomposition of a time series with n items of type a stored in a vector v.

The component-wise sum of emdIMFs and emdResidual should yield exactly the original series (see iemd).

Constructors

EMD 

Fields

Instances
Eq (v a) => Eq (EMD v n a) Source # 
Instance details

Defined in Numeric.EMD

Methods

(==) :: EMD v n a -> EMD v n a -> Bool #

(/=) :: EMD v n a -> EMD v n a -> Bool #

Ord (v a) => Ord (EMD v n a) Source # 
Instance details

Defined in Numeric.EMD

Methods

compare :: EMD v n a -> EMD v n a -> Ordering #

(<) :: EMD v n a -> EMD v n a -> Bool #

(<=) :: EMD v n a -> EMD v n a -> Bool #

(>) :: EMD v n a -> EMD v n a -> Bool #

(>=) :: EMD v n a -> EMD v n a -> Bool #

max :: EMD v n a -> EMD v n a -> EMD v n a #

min :: EMD v n a -> EMD v n a -> EMD v n a #

Show (v a) => Show (EMD v n a) Source # 
Instance details

Defined in Numeric.EMD

Methods

showsPrec :: Int -> EMD v n a -> ShowS #

show :: EMD v n a -> String #

showList :: [EMD v n a] -> ShowS #

Generic (EMD v n a) Source # 
Instance details

Defined in Numeric.EMD

Associated Types

type Rep (EMD v n a) :: Type -> Type #

Methods

from :: EMD v n a -> Rep (EMD v n a) x #

to :: Rep (EMD v n a) x -> EMD v n a #

(Vector v a, KnownNat n, Binary (v a)) => Binary (EMD v n a) Source #

Since: 0.1.3.0

Instance details

Defined in Numeric.EMD

Methods

put :: EMD v n a -> Put #

get :: Get (EMD v n a) #

putList :: [EMD v n a] -> Put #

NFData (v a) => NFData (EMD v n a) Source #

Since: 0.1.5.0

Instance details

Defined in Numeric.EMD

Methods

rnf :: EMD v n a -> () #

type Rep (EMD v n a) Source # 
Instance details

Defined in Numeric.EMD

type Rep (EMD v n a) = D1 (MetaData "EMD" "Numeric.EMD" "emd-0.1.10.0-inplace" False) (C1 (MetaCons "EMD" PrefixI True) (S1 (MetaSel (Just "emdIMFs") NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 [Vector v n a]) :*: S1 (MetaSel (Just "emdResidual") NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 (Vector v n a))))

Configuration

data EMDOpts a Source #

Options for EMD composition.

Constructors

EO 

Fields

Instances
Eq a => Eq (EMDOpts a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Methods

(==) :: EMDOpts a -> EMDOpts a -> Bool #

(/=) :: EMDOpts a -> EMDOpts a -> Bool #

Ord a => Ord (EMDOpts a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Methods

compare :: EMDOpts a -> EMDOpts a -> Ordering #

(<) :: EMDOpts a -> EMDOpts a -> Bool #

(<=) :: EMDOpts a -> EMDOpts a -> Bool #

(>) :: EMDOpts a -> EMDOpts a -> Bool #

(>=) :: EMDOpts a -> EMDOpts a -> Bool #

max :: EMDOpts a -> EMDOpts a -> EMDOpts a #

min :: EMDOpts a -> EMDOpts a -> EMDOpts a #

Show a => Show (EMDOpts a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Methods

showsPrec :: Int -> EMDOpts a -> ShowS #

show :: EMDOpts a -> String #

showList :: [EMDOpts a] -> ShowS #

Generic (EMDOpts a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Associated Types

type Rep (EMDOpts a) :: Type -> Type #

Methods

from :: EMDOpts a -> Rep (EMDOpts a) x #

to :: Rep (EMDOpts a) x -> EMDOpts a #

Binary a => Binary (EMDOpts a) Source #

Since: 0.1.3.0

Instance details

Defined in Numeric.EMD.Internal.Sift

Methods

put :: EMDOpts a -> Put #

get :: Get (EMDOpts a) #

putList :: [EMDOpts a] -> Put #

Fractional a => Default (EMDOpts a) Source #

Since: 0.1.3.0

Instance details

Defined in Numeric.EMD.Internal.Sift

Methods

def :: EMDOpts a #

type Rep (EMDOpts a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

type Rep (EMDOpts a) = D1 (MetaData "EMDOpts" "Numeric.EMD.Internal.Sift" "emd-0.1.10.0-inplace" False) (C1 (MetaCons "EO" PrefixI True) (S1 (MetaSel (Just "eoSiftCondition") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (SiftCondition a)) :*: (S1 (MetaSel (Just "eoSplineEnd") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (SplineEnd a)) :*: S1 (MetaSel (Just "eoBoundaryHandler") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Maybe BoundaryHandler)))))

data BoundaryHandler Source #

Boundary conditions for splines.

Constructors

BHClamp

Clamp envelope at end points (Matlab implementation)

BHSymmetric

Extend boundaries symmetrically

Instances
Eq BoundaryHandler Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Ord BoundaryHandler Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Show BoundaryHandler Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Generic BoundaryHandler Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Associated Types

type Rep BoundaryHandler :: Type -> Type #

Binary BoundaryHandler Source #

Since: 0.1.3.0

Instance details

Defined in Numeric.EMD.Internal.Sift

type Rep BoundaryHandler Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

type Rep BoundaryHandler = D1 (MetaData "BoundaryHandler" "Numeric.EMD.Internal.Sift" "emd-0.1.10.0-inplace" False) (C1 (MetaCons "BHClamp" PrefixI False) (U1 :: Type -> Type) :+: C1 (MetaCons "BHSymmetric" PrefixI False) (U1 :: Type -> Type))

data SiftCondition a Source #

Stop conditions for sifting process

Data type is lazy in its fields, so this infinite data type:

nTimes n = SCTimes n SCOr nTimes (n + 1)

will be treated identically as:

nTimes = SCTimes

Constructors

SCStdDev !a

Stop using standard SD method

SCCauchy SiftProjection !a

When the difference between successive items reaches a given threshold \(\tau\)

\[ \frac{\left(f(t-1) - f(t)\right)^2}{f^2(t-1)} < \tau \]

Since: 0.1.10.0

SCProj SiftProjection !a

When the value reaches a given threshold \(\tau\)

\[ f(t) < \tau \]

Since: 0.1.10.0

SCSCond !Int

S-condition criteria.

The S-number is the length of current streak where number of extrema or zero crossings all differ at most by one.

Stop sifting when the S-number reaches a given amount.

Since: 0.1.10.0

SCTimes !Int

Stop after a fixed number of sifting iterations

SCOr (SiftCondition a) (SiftCondition a)

One or the other

SCAnd (SiftCondition a) (SiftCondition a)

Stop when both conditions are met

Instances
Eq a => Eq (SiftCondition a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Ord a => Ord (SiftCondition a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Show a => Show (SiftCondition a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Generic (SiftCondition a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Associated Types

type Rep (SiftCondition a) :: Type -> Type #

Binary a => Binary (SiftCondition a) Source #

Since: 0.1.3.0

Instance details

Defined in Numeric.EMD.Internal.Sift

Fractional a => Default (SiftCondition a) Source #

Since: 0.1.3.0

Instance details

Defined in Numeric.EMD.Internal.Sift

Methods

def :: SiftCondition a #

type Rep (SiftCondition a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

type Rep (SiftCondition a) = D1 (MetaData "SiftCondition" "Numeric.EMD.Internal.Sift" "emd-0.1.10.0-inplace" False) ((C1 (MetaCons "SCStdDev" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a)) :+: (C1 (MetaCons "SCCauchy" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 SiftProjection) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a)) :+: C1 (MetaCons "SCProj" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 SiftProjection) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a)))) :+: ((C1 (MetaCons "SCSCond" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 Int)) :+: C1 (MetaCons "SCTimes" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 Int))) :+: (C1 (MetaCons "SCOr" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (SiftCondition a)) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (SiftCondition a))) :+: C1 (MetaCons "SCAnd" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (SiftCondition a)) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (SiftCondition a))))))

data SiftProjection Source #

A projection of sifting data. Used as a part of SiftCondition to describe SCCauchy and SCProj.

Since: 0.1.10.0

Constructors

SPEnvMeanSum

The root mean square of the envelope means

SPEnergyDiff

The "energy difference" quotient (Cheng, Yu, Yang 2005)

Instances
Eq SiftProjection Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Ord SiftProjection Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Show SiftProjection Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Generic SiftProjection Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

Associated Types

type Rep SiftProjection :: Type -> Type #

Binary SiftProjection Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

type Rep SiftProjection Source # 
Instance details

Defined in Numeric.EMD.Internal.Sift

type Rep SiftProjection = D1 (MetaData "SiftProjection" "Numeric.EMD.Internal.Sift" "emd-0.1.10.0-inplace" False) (C1 (MetaCons "SPEnvMeanSum" PrefixI False) (U1 :: Type -> Type) :+: C1 (MetaCons "SPEnergyDiff" PrefixI False) (U1 :: Type -> Type))

scEnergyDiff Source #

Arguments

:: a

Threshold for Energy Difference

-> a

Threshold for mean envelope RMS

-> SiftCondition a 

Cheng, Yu, Yang suggest pairing together an energy difference threshold with a threshold for mean envelope RMS. This is a convenience function to construct that pairing.

data SplineEnd a Source #

End condition for spline

Constructors

SENotAKnot

"Not-a-knot" condition: third derivatives are continuous at endpoints. Default for matlab spline.

SENatural

"Natural" condition: curve becomes a straight line at endpoints.

SEClamped a a

"Clamped" condition: Slope of curves at endpoints are explicitly given.

Since: 0.1.2.0

Instances
Eq a => Eq (SplineEnd a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Spline

Methods

(==) :: SplineEnd a -> SplineEnd a -> Bool #

(/=) :: SplineEnd a -> SplineEnd a -> Bool #

Ord a => Ord (SplineEnd a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Spline

Show a => Show (SplineEnd a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Spline

Generic (SplineEnd a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Spline

Associated Types

type Rep (SplineEnd a) :: Type -> Type #

Methods

from :: SplineEnd a -> Rep (SplineEnd a) x #

to :: Rep (SplineEnd a) x -> SplineEnd a #

Binary a => Binary (SplineEnd a) Source #

Since: 0.1.3.0

Instance details

Defined in Numeric.EMD.Internal.Spline

Methods

put :: SplineEnd a -> Put #

get :: Get (SplineEnd a) #

putList :: [SplineEnd a] -> Put #

type Rep (SplineEnd a) Source # 
Instance details

Defined in Numeric.EMD.Internal.Spline

type Rep (SplineEnd a) = D1 (MetaData "SplineEnd" "Numeric.EMD.Internal.Spline" "emd-0.1.10.0-inplace" False) (C1 (MetaCons "SENotAKnot" PrefixI False) (U1 :: Type -> Type) :+: (C1 (MetaCons "SENatural" PrefixI False) (U1 :: Type -> Type) :+: C1 (MetaCons "SEClamped" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a))))

Internal

sift :: forall v n a. (Vector v a, KnownNat n, Floating a, Ord a) => EMDOpts a -> Vector v (n + 1) a -> SiftResult v (n + 1) a Source #

Iterated sifting process, used to produce either an IMF or a residual.

data SiftResult v n a Source #

The result of a sifting operation. Each sift either yields a residual, or a new IMF.

Constructors

SRResidual !(Vector v n a) 
SRIMF !(Vector v n a) !Int

number of sifting iterations

envelopes :: (Vector v a, KnownNat n, Fractional a, Ord a) => SplineEnd a -> Maybe BoundaryHandler -> Vector v (n + 1) a -> Maybe (Vector v (n + 1) a, Vector v (n + 1) a) Source #

Returns cubic splines of local minimums and maximums. Returns Nothing if there are not enough local minimum or maximums to create the splines.