hsignal 0.2.3 → 0.2.3.1
raw patch · 5 files changed
+74/−3 lines, 5 files
Files
- CHANGES +3/−0
- hsignal.cabal +1/−1
- lib/Numeric/Signal.hs +19/−1
- lib/Numeric/Signal/Internal.hs +25/−1
- lib/Numeric/Signal/signal-aux.c +26/−0
CHANGES view
@@ -95,3 +95,6 @@ 0.2.3: added cross covariance and friends++0.2.3.1:+ added cross spectrum
hsignal.cabal view
@@ -1,5 +1,5 @@ Name: hsignal-Version: 0.2.3+Version: 0.2.3.1 License: BSD3 License-file: LICENSE Copyright: (c) A.V.H. McPhail 2010, 2011
lib/Numeric/Signal.hs view
@@ -27,9 +27,10 @@ analytic_signal,analytic_power,analytic_phase, unwrap, -- * Statistics- cross_covariance,cross_correlation,+ cross_covariance,cross_correlation,cross_spectrum, auto_covariance,auto_correlation, -- * Preprocessing+ cumulative_sum, detrend, resize, downsample,@@ -265,6 +266,15 @@ cross_correlation l x y = let (sx,sy,r) = S.cross_covariance_ l x y in mapVector (/ (sx*sy)) r +-- | compute the cross spectrum+cross_spectrum :: (S.Filterable a, Double ~ DoubleOf a) =>+ Int -- ^ maximum delay+ -> Vector a -- ^ time series+ -> Vector a -- ^ time series+ -> Vector (Complex Double) -- ^ result+cross_spectrum l x y = (\(_,_,c) -> F.fft (complex $ double c)) (cross_covariance l x y)++ -- | auto covariance of two signals -- the auto correlation is computed by dividing the result -- by the variance@@ -282,6 +292,14 @@ -> Vector a -- ^ result auto_correlation l v = let (var,r) = auto_covariance l v in mapVector (/ var) r++-----------------------------------------------------------------------------++-- | cumulative sum of a series+cumulative_sum :: S.Filterable a =>+ Vector a + -> Vector a+cumulative_sum = S.cumulative_sum_ -----------------------------------------------------------------------------
lib/Numeric/Signal/Internal.hs view
@@ -84,6 +84,9 @@ -> Vector a -- ^ time series -> Vector a -- ^ time series -> (a,a,Vector a) -- ^ (sd_x,sd_y,cross_covariance)+ -- | the cumulative sum of a signal+ cumulative_sum_ :: Vector a -- ^ time series+ -> Vector a -- ^ result ----------------------------------------------------------------------------- @@ -137,7 +140,8 @@ unwrap_ = unwrapD polyEval_ = polyEval cross_covariance_ = crossCovarianceD- + cumulative_sum_ = cumSumD+ instance Filterable Float where fromDouble = single filter_ = filterF@@ -148,6 +152,7 @@ unwrap_ = unwrapF polyEval_ c = polyEval (double c) cross_covariance_ = crossCovarianceF+ cumulative_sum_ = cumSumF ----------------------------------------------------------------------------- @@ -379,6 +384,25 @@ foreign import ccall "signal-aux.h cross_covariance_float" signal_cross_covariance_float :: CInt -> PF -> PF -> CInt -> PF -> CInt -> PF -> CInt -> PF -> IO CInt++-----------------------------------------------------------------------------++cumSumD :: Vector Double -> Vector Double+cumSumD v = unsafePerformIO $ do+ r <- createVector (dim v)+ app2 signal_cum_sum_double vec v vec r "cumSumD"+ return r++cumSumF :: Vector Float -> Vector Float+cumSumF v = unsafePerformIO $ do+ r <- createVector (dim v)+ app2 signal_cum_sum_float vec v vec r "cumSumF"+ return r++foreign import ccall "signal-aux.h cum_sum_double"+ signal_cum_sum_double :: CInt -> PD -> CInt -> PD -> IO CInt+foreign import ccall "signal-aux.h cum_sum_float"+ signal_cum_sum_float :: CInt -> PF -> CInt -> PF -> IO CInt -----------------------------------------------------------------------------
lib/Numeric/Signal/signal-aux.c view
@@ -426,3 +426,29 @@ return 0; }++int cum_sum_double(int xs, const double* x, int rs, double* r)+{+ int i;++ r[0] = x[0];++ for (i=1;i<xs;i++) {+ r[i] = r[i-1]+x[i];+ }++ return 0;+}++int cum_sum_float(int xs, const float* x, int rs, float* r)+{+ int i;++ r[0] = x[0];++ for (i=1;i<xs;i++) {+ r[i] = r[i-1]+x[i];+ }++ return 0;+}