dsp-0.2: DSP/Unwrap.hs
-----------------------------------------------------------------------------
-- |
-- Module : DSP.Unwrap
-- Copyright : (c) Matthew Donadio 2003
-- License : GPL
--
-- Maintainer : m.p.donadio@ieee.org
-- Stability : experimental
-- Portability : portable
--
-- Simple phase unwrapping algorithm
--
-----------------------------------------------------------------------------
-- O&S, pg 790
module DSP.Unwrap (unwrap) where
import Data.Array
-- * Functions
-- | This is the simple phase unwrapping algorithm from Oppenheim and
-- Schafer.
unwrap :: (Ix a, Integral a, Ord b, Floating b) => b -- ^ epsilon
-> Array a b -- ^ ARG
-> Array a b -- ^ arg
unwrap eps phi = listArray b [ phi!i + 2 * pi * r!i | i <- range b ]
where r = listArray b [ ri i | i <- range b ]
ri 0 = 0
ri i | phi!i - phi!(i-1) > (2*pi-eps) = r!(i-1) - 1
| phi!i - phi!(i-1) < -(2*pi-eps) = r!(i-1) + 1
| otherwise = r!(i-1)
b = bounds phi