5 module Codec.Audio.WavPack.Entropy
24 import Prelude.Unicode
29 -- | Median log2 values for a channel.
34 , edSlowLevel ∷ !Word32
36 , edErrorLimit ∷ !Word32
40 clearMedian ∷ EntropyData → EntropyData
41 {-# INLINE clearMedian #-}
48 -- | The time constant of the 3 median level breakpoints
49 div0, div1, div2 ∷ Word32
50 div0 = 128 -- 5/ 7 of samples
51 div1 = 64 -- 10/ 49 of samples
52 div2 = 32 -- 20/343 of samples
54 -- | Retrieve the specified median breakpoint (without frac; min = 1)
55 getMedian0, getMedian1, getMedian2 ∷ EntropyData → Word32
56 {-# INLINE getMedian0 #-}
57 {-# INLINE getMedian1 #-}
58 {-# INLINE getMedian2 #-}
59 getMedian0 e = (edMedian0 e `shiftR` 4) + 1
60 getMedian1 e = (edMedian1 e `shiftR` 4) + 1
61 getMedian2 e = (edMedian2 e `shiftR` 4) + 1
63 -- | Update the specified median breakpoints. Note that the median is
64 -- incremented when the sample is higher than the median, else
65 -- decremented. They are designed so that the median will never drop
66 -- below 1 and the value is essentially stationary if there are 2
67 -- increments for every 5 decrements.
68 incMedian0, decMedian0, incMedian1, decMedian1, incMedian2, decMedian2 ∷ EntropyData → EntropyData
71 edMedian0 e + ((edMedian0 e + div0 ) `div` div0) ⋅ 5 }
74 edMedian0 e - ((edMedian0 e + (div0-2)) `div` div0) ⋅ 2 }
77 edMedian1 e + ((edMedian1 e + div1 ) `div` div1) ⋅ 5 }
80 edMedian1 e - ((edMedian1 e + (div1-2)) `div` div1) ⋅ 2 }
83 edMedian2 e + ((edMedian2 e + div2 ) `div` div2) ⋅ 5 }
86 edMedian2 e - ((edMedian2 e + (div2-2)) `div` div2) ⋅ 2 }