dsp-0.1: DSP/Estimation/Frequency/Pisarenko.hs
-----------------------------------------------------------------------------
-- |
-- Module : DSP.Pisarenko
-- Copyright : (c) Matthew Donadio 2003
-- License : GPL
--
-- Maintainer : m.p.donadio@ieee.org
-- Stability : experimental
-- Portability : portable
--
-- This module contains an implementation of Pisarenko Harmonic
-- Decomposition for a single real sinusoid. For this case, eigenvalues
-- do not need to be computed.
--
-----------------------------------------------------------------------------
-- This implmentation is based off of a Matlab version by Peter
-- Kootsookos (p.kootsookos@ieee.org).
module DSP.Estimation.Frequency.Pisarenko (pisarenko) where
import Data.Array
rss x k = sum [ x!(i+k) * x!i | i <- [0..(n-1-k)] ]
where n = snd (bounds x) + 1
-- | Pisarenko's method for a single sinusoid
pisarenko :: (Ix a, Integral a, Floating b) => Array a b -- ^ x
-> b -- ^ w
pisarenko x = acos (alpha / 2)
where alpha = (rss2 + sqrt (rss2^2 + 8*rss1^2)) / (rss1 + eps) / 2
rss1 = rss x 1
rss2 = rss x 2
eps = 1.0e-15