Advertisement
jckuri

DCT.hs

Mar 30th, 2016
491
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Discrete Cosine Transform in Haskell
  2. -- By Juan Carlos Kuri ([email protected])
  3. import qualified Data.Vector as BV
  4. import qualified Data.Vector.Unboxed as UV
  5. import qualified Numeric as N
  6.  
  7. formatFloatN floatNum numOfDecimals =
  8.  N.showFFloat (Just numOfDecimals) floatNum ""
  9.  
  10. printMatrix matrix =
  11.  BV.mapM_ printRow matrix
  12.  where
  13.   printRow row =
  14.    UV.mapM_ printElement row >>
  15.    putStr "\n"
  16.   printElement element =
  17.    putStr (formatFloatN element 2 ++ "\t")
  18.  
  19. get matrix i j = (matrix BV.! i) UV.! j  
  20.    
  21. dct matrix =
  22.  BV.generate n generateRow
  23.  where
  24.   (n,m) = (BV.length matrix,UV.length $ BV.head matrix)
  25.   indexes = [(i,j) | i <- [0..n-1], j <- [0..m-1]]
  26.   generateRow u =
  27.    UV.generate m generateElement
  28.    where
  29.    generateElement v =
  30.     sum $ map term indexes
  31.     where
  32.      term (i,j) =
  33.       (get matrix i j) *
  34.        (cos (pi*((fromIntegral i)+0.5)*(fromIntegral u)/(fromIntegral n))) *
  35.        (cos (pi*((fromIntegral j)+0.5)*(fromIntegral v)/(fromIntegral m)))
  36.  
  37. idct matrix =
  38.  BV.generate n generateRow
  39.  where
  40.   (n,m) = (BV.length matrix,UV.length $ BV.head matrix)
  41.   indexes = [(i,j) | i <- [1..n-1], j <- [1..m-1]]
  42.   generateRow u =
  43.    UV.generate m generateElement
  44.    where
  45.    generateElement v =
  46.     ((0.25 * get matrix 0 0) +
  47.      (sum $ map (\i -> 0.5 * get matrix i 0) [1..n-1]) +
  48.      (sum $ map (\j -> 0.5 * get matrix 0 j) [1..m-1]) +
  49.      (sum $ map term indexes)) * 4.0 /(fromIntegral n) /(fromIntegral m)
  50.     where
  51.      term (i,j) =
  52.       (get matrix i j) *
  53.        (cos (pi*((fromIntegral u)+0.5)*(fromIntegral i)/(fromIntegral n))) *
  54.        (cos (pi*((fromIntegral v)+0.5)*(fromIntegral j)/(fromIntegral m)))
  55.  
  56. matrix =
  57.  BV.fromList $
  58.   [UV.fromList ([255,  0,255,  0,255,  0,255,  0]::[Double]),
  59.    UV.fromList ([  0,255,  0,255,  0,255,  0,255]::[Double]),
  60.    UV.fromList ([255,  0,255,  0,255,  0,255,  0]::[Double]),
  61.    UV.fromList ([  0,255,  0,255,  0,255,  0,255]::[Double]),
  62.    UV.fromList ([255,  0,255,  0,255,  0,255,  0]::[Double]),
  63.    UV.fromList ([  0,255,  0,255,  0,255,  0,255]::[Double]),
  64.    UV.fromList ([255,  0,255,  0,255,  0,255,  0]::[Double]),
  65.    UV.fromList ([  0,255,  0,255,  0,255,  0,255]::[Double])]
  66.  
  67. main =
  68.  let
  69.   dctMatrix = dct matrix
  70.   idctMatrix = idct dctMatrix
  71.  in
  72.   printMatrix dctMatrix >>
  73.   putStrLn "" >>
  74.   printMatrix idctMatrix
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement