Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Discrete Cosine Transform in Haskell
- -- By Juan Carlos Kuri ([email protected])
- import qualified Data.Vector as BV
- import qualified Data.Vector.Unboxed as UV
- import qualified Numeric as N
- formatFloatN floatNum numOfDecimals =
- N.showFFloat (Just numOfDecimals) floatNum ""
- printMatrix matrix =
- BV.mapM_ printRow matrix
- where
- printRow row =
- UV.mapM_ printElement row >>
- putStr "\n"
- printElement element =
- putStr (formatFloatN element 2 ++ "\t")
- get matrix i j = (matrix BV.! i) UV.! j
- dct matrix =
- BV.generate n generateRow
- where
- (n,m) = (BV.length matrix,UV.length $ BV.head matrix)
- indexes = [(i,j) | i <- [0..n-1], j <- [0..m-1]]
- generateRow u =
- UV.generate m generateElement
- where
- generateElement v =
- sum $ map term indexes
- where
- term (i,j) =
- (get matrix i j) *
- (cos (pi*((fromIntegral i)+0.5)*(fromIntegral u)/(fromIntegral n))) *
- (cos (pi*((fromIntegral j)+0.5)*(fromIntegral v)/(fromIntegral m)))
- idct matrix =
- BV.generate n generateRow
- where
- (n,m) = (BV.length matrix,UV.length $ BV.head matrix)
- indexes = [(i,j) | i <- [1..n-1], j <- [1..m-1]]
- generateRow u =
- UV.generate m generateElement
- where
- generateElement v =
- ((0.25 * get matrix 0 0) +
- (sum $ map (\i -> 0.5 * get matrix i 0) [1..n-1]) +
- (sum $ map (\j -> 0.5 * get matrix 0 j) [1..m-1]) +
- (sum $ map term indexes)) * 4.0 /(fromIntegral n) /(fromIntegral m)
- where
- term (i,j) =
- (get matrix i j) *
- (cos (pi*((fromIntegral u)+0.5)*(fromIntegral i)/(fromIntegral n))) *
- (cos (pi*((fromIntegral v)+0.5)*(fromIntegral j)/(fromIntegral m)))
- matrix =
- BV.fromList $
- [UV.fromList ([255, 0,255, 0,255, 0,255, 0]::[Double]),
- UV.fromList ([ 0,255, 0,255, 0,255, 0,255]::[Double]),
- UV.fromList ([255, 0,255, 0,255, 0,255, 0]::[Double]),
- UV.fromList ([ 0,255, 0,255, 0,255, 0,255]::[Double]),
- UV.fromList ([255, 0,255, 0,255, 0,255, 0]::[Double]),
- UV.fromList ([ 0,255, 0,255, 0,255, 0,255]::[Double]),
- UV.fromList ([255, 0,255, 0,255, 0,255, 0]::[Double]),
- UV.fromList ([ 0,255, 0,255, 0,255, 0,255]::[Double])]
- main =
- let
- dctMatrix = dct matrix
- idctMatrix = idct dctMatrix
- in
- printMatrix dctMatrix >>
- putStrLn "" >>
- printMatrix idctMatrix
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement