Scheme impl的IDCT(反离散余弦变换)。 jpeg解码器

时间:2011-05-24 08:59:25

标签: scheme jpeg transform racket cosine

有人能解释一下反离散余弦变换函数吗?可能会给我一个在8x8块上运行的Scheme / Racket中的实现吗?如果你不知道方案,也许你可以帮我解决一些伪代码。

The mathematical definition of Forward DCT (FDCT) and Inverse DCT (IDCT) is :
FDCT:
           c(u,v)     7   7                 2*x+1                2*y+1

F(u,v) = --------- * sum sum f(x,y) * cos (------- *u*PI)* cos (------ *v*PI)

             4       x=0 y=0                 16                   16

u,v = 0,1,...,7

         { 1/2 when u=v=0

c(u,v) = {

         {  1 otherwise

IDCT:

            1     7   7                      2*x+1                2*y+1

 f(x,y) =  --- * sum sum c(u,v)*F(u,v)*cos (------- *u*PI)* cos (------ *v*PI)

            4    u=0 v=0                      16                   16

 x,y=0,1...7

1 个答案:

答案 0 :(得分:1)

这只是基于你对上述dct的定义;我找不到该公式的任何好的示例值,因此不能将其视为测试。

(define pi 3.14) ; set this to however accurate you want

(define c
      (lambda (u v)
        (if (and (= u 0)
                 (= v 0))
            1/2
            1)))

(define fdct
  (lambda (f u v)
    (* (/ (c u v)
          4)
       (let x-loop ((x 0)
                    (x-sum 0))
         (if (< x 7)
             (x-loop (+ x 1)
                     (+ x-sum
                        (let y-loop ((y 0)
                                     (y-sum 0))
                          (if (< y 7)
                              (y-loop (+ y 1)
                                      (+ y-sum (* (f x y)
                                                  (cos (* (/ (+ (* 2 x)
                                                                1)
                                                             16)
                                                          u
                                                          pi))
                                                  (cos (* (/ (+ (* 2 y)
                                                                1)
                                                             16)
                                                          v
                                                          pi)))))
                              y-sum))))
             x-sum)))))

(define idct
  (lambda (f x y)
    (* 1/4
       (let u-loop ((u 0)
                    (u-sum 0))
         (if (< u 7)
             (u-loop (+ u 1)
                     (+ u-sum
                        (let v-loop ((v 0)
                                     (v-sum 0))
                          (if (< v 7)
                              (v-loop (+ v 1)
                                      (+ v-sum
                                         (* (c u v)
                                            (f u v)
                                            (cos (* (/ (+ (* 2 x)
                                                          1)
                                                       16)
                                                    u
                                                    pi))
                                            (cos (* (/ (+ (* 2 x)
                                                          1)
                                                       16)
                                                    u
                                                    pi)))))
                              v-sum))))
             u-sum)))))