>
> module HSoM.Examples.SpectrumAnalysis where
> import Euterpea
> import Data.Complex (Complex ((:+)), polar)
> import Data.Maybe (listToMaybe, catMaybes)
> dft :: RealFloat a => [Complex a] -> [Complex a]
> dft xs =
> let lenI = length xs
> lenR = fromIntegral lenI
> lenC = lenR :+ 0
> in [ let i = 2 * pi * fromIntegral k / lenR
> in (1/lenC) * sum [ (xs!!n) * exp (0 :+ i * fromIntegral n)
> | n <- [0,1..lenI1] ]
> | k <- [0,1..lenI1] ]
> mkTerm :: Int -> Double -> [Complex Double]
> mkTerm num n = let f = 2 * pi / fromIntegral num
> in [ sin (n * f * fromIntegral i) / n :+ 0
> | i <- [0,1..num1] ]
> mkxa, mkxb, mkxc :: Int-> [Complex Double]
> mkxa num = mkTerm num 1
> mkxb num = zipWith (+) (mkxa num) (mkTerm num 3)
> mkxc num = zipWith (+) (mkxb num) (mkTerm num 5)
> printComplexL :: [Complex Double] -> IO ()
> printComplexL xs =
> let f (i,rl:+im) =
> do putStr (spaces (3 length (show i)) )
> putStr (show i ++ ": (" )
> putStr (niceNum rl ++ ", " )
> putStr (niceNum im ++ ")\n" )
> in mapM_ f (zip [0..length xs 1] xs)
> niceNum :: Double -> String
> niceNum d =
> let d' = fromIntegral (round (1e10 * d)) / 1e10
> (dec, fra) = break (== '.') (show d')
> (fra',exp) = break (== 'e') fra
> in spaces (3 length dec) ++ dec ++ take 11 fra'
> ++ exp ++ spaces (12 length fra' length exp)
> spaces :: Int -> String
> spaces n = take n (repeat ' ')
> mkPulse :: Int -> [Complex Double]
> mkPulse n = 100 : take (n1) (repeat 0)
>
> x1 num = let f = pi * 2 * pi / fromIntegral num
> in map (:+ 0) [ sin (f * fromIntegral i)
> | i <- [0,1..num1] ]
>
> mkPolars :: [Complex Double] -> [Complex Double]
> mkPolars = map ((\(m,p)-> m:+p) . polar)