IDCT (обратное дискретное косинусное преобразование) для схемы вкл. JPEG декодер - PullRequest
1 голос
/ 24 мая 2011

Может ли кто-нибудь объяснить мне функцию обратного дискретного косинусного преобразования и, возможно, дать мне реализацию ее в схеме / ракетке, которая работает с блоками 8x8? Если вы не знаете схемы, возможно, вы могли бы помочь мне с псевдокодом.

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 Ответ

1 голос
/ 04 сентября 2011

Это только на основании вашего определения вышеупомянутого 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)))))
...