2011-05-24 7 views
1

逆離散コサイン変換関数を教えてもらえますか?8x8ブロックで動作するScheme/Racketでそれを実装してくれますか?おそらくあなたはいくつかの擬似コードで私を助けることができるスキームを知らない場合。Scheme implのIDCT(逆離散コサイン変換)です。 jpegデコーダ

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 
+0

私はあなたにPythonの例を与えることができます。これはほぼ疑似コードです。 :) – onemasse

答えて

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)))))