diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -95,3 +95,6 @@
 
 0.2.3:
 		added cross covariance and friends
+
+0.2.3.1:
+		added cross spectrum
diff --git a/hsignal.cabal b/hsignal.cabal
--- a/hsignal.cabal
+++ b/hsignal.cabal
@@ -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
diff --git a/lib/Numeric/Signal.hs b/lib/Numeric/Signal.hs
--- a/lib/Numeric/Signal.hs
+++ b/lib/Numeric/Signal.hs
@@ -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_
 
 -----------------------------------------------------------------------------
 
diff --git a/lib/Numeric/Signal/Internal.hs b/lib/Numeric/Signal/Internal.hs
--- a/lib/Numeric/Signal/Internal.hs
+++ b/lib/Numeric/Signal/Internal.hs
@@ -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
 
 -----------------------------------------------------------------------------
 
diff --git a/lib/Numeric/Signal/signal-aux.c b/lib/Numeric/Signal/signal-aux.c
--- a/lib/Numeric/Signal/signal-aux.c
+++ b/lib/Numeric/Signal/signal-aux.c
@@ -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;
+}
