方案展示的IDCT(逆余弦逆变换)。 jpeg解码器的。

有人可以向我解释反离散余弦变换函数,并可能在运行于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
    
已邀请:
这只是基于您对上面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)))))
    

要回复问题请先登录注册