module DSP.Covariance (cxy, cxy_b, cxy_u, cxx, cxx_b, cxx_u) where
import Data.Array
import Data.Complex
import DSP.Correlation
import Numeric.Statistics.Moment
cxy :: (Ix a, Integral a, RealFloat b) => Array a (Complex b)
-> Array a (Complex b)
-> a
-> Complex b
cxy :: forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> Array a (Complex b) -> a -> Complex b
cxy Array a (Complex b)
x Array a (Complex b)
y a
k =
if a
k forall a. Ord a => a -> a -> Bool
>= a
0
then forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> Array a (Complex b) -> a -> Complex b
rxy Array a (Complex b)
x Array a (Complex b)
y a
k forall a. Num a => a -> a -> a
- Complex b
xm forall a. Num a => a -> a -> a
* Complex b
ym
else forall a. Num a => Complex a -> Complex a
conjugate (forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> Array a (Complex b) -> a -> Complex b
cxy Array a (Complex b)
y Array a (Complex b)
x (-a
k))
where xm :: Complex b
xm = forall a. Fractional a => [a] -> a
mean (forall i e. Array i e -> [e]
elems Array a (Complex b)
x)
ym :: Complex b
ym = forall a. Fractional a => [a] -> a
mean (forall a b. (a -> b) -> [a] -> [b]
map forall a. Num a => Complex a -> Complex a
conjugate (forall i e. Array i e -> [e]
elems Array a (Complex b)
y))
cxx :: (Ix a, Integral a, RealFloat b) => Array a (Complex b)
-> a
-> Complex b
cxx :: forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> a -> Complex b
cxx Array a (Complex b)
x a
k =
if a
k forall a. Ord a => a -> a -> Bool
>= a
0
then forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> a -> Complex b
rxx Array a (Complex b)
x a
k forall a. Num a => a -> a -> a
- forall a. Fractional a => [a] -> a
mean (forall i e. Array i e -> [e]
elems Array a (Complex b)
x) forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
2::Int)
else forall a. Num a => Complex a -> Complex a
conjugate (forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> a -> Complex b
cxx Array a (Complex b)
x (-a
k))
cxy_b :: (Ix a, Integral a, RealFloat b) => Array a (Complex b)
-> Array a (Complex b)
-> a
-> Complex b
cxy_b :: forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> Array a (Complex b) -> a -> Complex b
cxy_b Array a (Complex b)
x Array a (Complex b)
y a
k = forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> Array a (Complex b) -> a -> Complex b
cxy Array a (Complex b)
x Array a (Complex b)
y a
k forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral a
n
where n :: a
n = forall a b. (a, b) -> b
snd (forall i e. Array i e -> (i, i)
bounds Array a (Complex b)
x) forall a. Num a => a -> a -> a
+ a
1
cxy_u :: (Ix a, Integral a, RealFloat b) => Array a (Complex b)
-> Array a (Complex b)
-> a
-> Complex b
cxy_u :: forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> Array a (Complex b) -> a -> Complex b
cxy_u Array a (Complex b)
x Array a (Complex b)
y a
k = forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> Array a (Complex b) -> a -> Complex b
cxy Array a (Complex b)
x Array a (Complex b)
y a
k forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral (a
n forall a. Num a => a -> a -> a
- forall a. Num a => a -> a
abs a
k)
where n :: a
n = forall a b. (a, b) -> b
snd (forall i e. Array i e -> (i, i)
bounds Array a (Complex b)
x) forall a. Num a => a -> a -> a
+ a
1
cxx_b :: (Ix a, Integral a, RealFloat b) => Array a (Complex b)
-> a
-> Complex b
cxx_b :: forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> a -> Complex b
cxx_b Array a (Complex b)
x a
k = forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> a -> Complex b
cxx Array a (Complex b)
x a
k forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral a
n
where n :: a
n = forall a b. (a, b) -> b
snd (forall i e. Array i e -> (i, i)
bounds Array a (Complex b)
x) forall a. Num a => a -> a -> a
+ a
1
cxx_u :: (Ix a, Integral a, RealFloat b) => Array a (Complex b)
-> a
-> Complex b
cxx_u :: forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> a -> Complex b
cxx_u Array a (Complex b)
x a
k = forall a b.
(Ix a, Integral a, RealFloat b) =>
Array a (Complex b) -> a -> Complex b
cxx Array a (Complex b)
x a
k forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral (a
n forall a. Num a => a -> a -> a
- forall a. Num a => a -> a
abs a
k)
where n :: a
n = forall a b. (a, b) -> b
snd (forall i e. Array i e -> (i, i)
bounds Array a (Complex b)
x) forall a. Num a => a -> a -> a
+ a
1