KR20110118598A - 영상의 변환 방법 및 장치, 역변환 방법 및 장치 - Google Patents

영상의 변환 방법 및 장치, 역변환 방법 및 장치 Download PDF

Info

Publication number
KR20110118598A
KR20110118598A KR1020110038680A KR20110038680A KR20110118598A KR 20110118598 A KR20110118598 A KR 20110118598A KR 1020110038680 A KR1020110038680 A KR 1020110038680A KR 20110038680 A KR20110038680 A KR 20110038680A KR 20110118598 A KR20110118598 A KR 20110118598A
Authority
KR
South Korea
Prior art keywords
matrix
itmp
inverse
transform
values
Prior art date
Application number
KR1020110038680A
Other languages
English (en)
Inventor
홍윤미
한우진
이태미
천민수
Original Assignee
삼성전자주식회사
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 삼성전자주식회사 filed Critical 삼성전자주식회사
Publication of KR20110118598A publication Critical patent/KR20110118598A/ko

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/60Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using transform coding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F17/00Digital computing or data processing equipment or methods, specially adapted for specific functions
    • G06F17/10Complex mathematical operations
    • G06F17/14Fourier, Walsh or analogous domain transformations, e.g. Laplace, Hilbert, Karhunen-Loeve, transforms
    • G06F17/147Discrete orthonormal transforms, e.g. discrete cosine transform, discrete sine transform, and variations therefrom, e.g. modified discrete cosine transform, integer transforms approximating the discrete cosine transform

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Mathematical Analysis (AREA)
  • Theoretical Computer Science (AREA)
  • Computational Mathematics (AREA)
  • Pure & Applied Mathematics (AREA)
  • Mathematical Optimization (AREA)
  • Signal Processing (AREA)
  • Data Mining & Analysis (AREA)
  • Multimedia (AREA)
  • Discrete Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Databases & Information Systems (AREA)
  • Algebra (AREA)
  • Compression Or Coding Systems Of Tv Signals (AREA)
  • Complex Calculations (AREA)

Abstract

영상의 변환, 역변환 방법 및 장치가 개시된다. 본 발명에 따르면 NxN크기의 블록의 1차원 이산 코사인 변환에 이용되는 NxN 변환 행렬의 원소들 중 삼각함수에 기초한 값들을 소정의 유리수 값들로 치환하고, 치환된 값들을 갖는 행렬을 이용하여 NxN 크기의 블록을 변환하는 것을 특징으로 한다.

Description

영상의 변환 방법 및 장치, 역변환 방법 및 장치{Methoa and apparatus for transforming image, and method and apparatus for inverse-transforming image}
본 발명은 영상 부호화, 복호화 방법 및 장치에 관한 것으로, 보다 상세히는 큰 크기의 블록에 대한 향상된 변환, 역변환 방법 및 장치에 관한 것이다.
H.264 및 MPEG-4와 같은, 현재 국제 비디오 코딩 표준에서, 비디오 신호는 시퀀스, 프레임, 슬라이스, 매크로 블록 및 블록으로 계층적으로 분할되며, 블록은 최소 처리 유닛이 된다. 인코딩 측면에서, 인트라-프레임 또는 인터-프레임 예측을 통하여, 블록의 예측 잔류 오류가 획득되며, 블록 변환은 에너지가 소수의 계수에 집중될 수 있도록 실행되고, 양자화, 스캐닝, 런 렝스 코딩(Run Length Coding) 및 엔트로피 코딩을 통하여, 이미지 데이터는 압축되며, 코딩된 비트스트림으로 기록된다. 디코딩 측면에서, 처리 절차는 반대가 된다. 우선, 엔트로피 코딩의 블록 변환 계수가 비트 스트림으로부터 추출된다. 그리고 나서, 역양자화 및 역변환을 통하여, 블록의 예측 잔류 오류는 재구성되며, 예측 정보는 블록의 비디오 데이터를 재구성하기 위하여 사용된다. 인코딩-디코딩 처리절차에서, 변환 모듈은 비디오 압축의 기초이며, 변환성능은 코덱의 일반적인 성능에 직접적으로 영향을 준다.
이산 코사인 변환(DCT)은 MPEG-1 및 H.261과 같은 초기 비디오 코딩 표준에서 채택되었다. 1974년 이산 코사인 변환의 제안 이후에, DCT는 이미지 및 비디오 코딩 분야에서 널리 사용되었다. 변환 도메인 내의 이미지 요소의 상관성을 제거하며, 고효율 이미지 압축을 위한 기반을 마련하기 때문에, 그것의 변환 성능은 모든 차선 변환(sub-optimal transform)중 우수하다. 그러나, DCT 변환 행렬은 부동 소수점 수(floating point number)로 표현되기 때문에, 대량의 부동 소수점 계산으로 인하여 많은 시스템 자원이 소모된다. 변환 효율을 개선하는 한편, 큰 크기의 블록에 대한 변환을 수행하기 위하여 새로운 DCT 변환 알고리즘의 필요성이 증가되었다.
본 발명이 해결하고자 하는 기술적 과제는 보다 효율적인 이산 코사인 변환을 이용하여 영상을 변환, 역변환하는 방법 및 장치를 제공하는 데 있다.
본 발명의 실시예에 따른 영상의 변환 방법은 NxN(N은 정수) 크기의 블록의 1차원 이산 코사인 변환에 이용되는 NxN 변환 행렬의 원소들 중 삼각함수에 기초한 값들을 소정의 유리수 값들로 치환하는 단계; 및 상기 치환된 값들을 갖는 행렬을 이용하여 상기 NxN 크기의 블록을 변환하는 단계를 포함하는 것을 특징으로 한다.
본 발명의 실시예에 따른 영상 변환 장치는 NxN(N은 정수) 크기의 블록의 1차원 이산 코사인 변환에 이용되는 NxN 변환 행렬의 원소들 중 삼각함수에 기초한 값들을 소정의 유리수 값들로 치환하고, 치환된 값들을 갖는 행렬을 이용하여 상기 NxN 크기의 블록을 변환하는 변환부를 포함하는 것을 특징으로 한다.
본 발명의 실시예에 따른 영상의 역변환 방법은 복호화되는 영상을 구성하는 NxN(N은 정수) 크기의 블록의 양자화된 변환 계수들을 수신하는 단계; 상기 수신된 양자화된 변환 계수들을 역양자화하는 단계; 및 상기 NxN 크기의 블록의 1차원 이산 코사인 역변환에 이용되는 NxN 역변환 행렬의 원소들 중 삼각함수에 기초한 값들을 소정의 유리수 값들로 치환하고, 치환된 값들을 갖는 행렬을 이용하여 상기 NxN 크기의 블록의 역양자화된 변환 계수들을 역변환하는 단계를 포함하는 것을 특징으로 한다.
본 발명의 실시예에 따른 영상의 역변환 장치는 복호화되는 영상을 구성하는 NxN(N은 정수) 크기의 블록의 1차원 이산 코사인 역변환에 이용되는 NxN 역변환 행렬의 원소들 중 삼각함수에 기초한 값들을 소정의 유리수 값들로 치환하고, 치환된 값들을 갖는 행렬을 이용하여 상기 NxN 크기의 블록의 역양자화된 변환 계수들을 역변환하는 역변환부를 포함하는 것을 특징으로 한다.
본 발명에 따르면 큰 크기의 블록에 대한 변환 및 역변환시에 부동 소수점 연산이 아닌 정수 기반의 연산 과정을 통해서 복잡도를 감소시키고 연산 속도를 증가시키는 영상의 변환 및 역변환 방법을 제공할 수 있다.
또한, 본 발명에 따르면 스케일링 팩터를 통해 부동 소수점 연산에 기반한 변환 과정과의 오차값을 보상함으로써 복잡도를 감소시키면서 보다 효율적인 영상의 변환 및 역변환 방법을 제공할 수 있다.
도 1은 본 발명의 일 실시예에 따른 영상 부호화 장치를 도시한다.
도 2는 4 포인트, 8 포인트, 16 포인트, 32 포인트 이산 코사인 변환의 흐름도(flow graph)를 도시한다.
도 3은 본 발명의 일 실시예에 따른 영상 변환 방법을 나타낸 플로우 차트이다.
도 4는 본 발명의 일 실시예에 따라서 16x16 변환 행렬의 원소에 구비된 삼각함수 성분을 변수들로 치환한 치환된 NxN 변환 행렬(A)의 원소들을 나타낸 참조도이다.
도 5는 본 발명의 일 실시예에 따른 양자화 과정을 나타낸 플로우 차트이다.
도 6은 본 발명의 다른 실시예에 따른 양자화 과정을 나타낸 플로우 차트이다.
도 7은 본 발명의 일 실시예에 따라서 16x16 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 8은 본 발명의 일 실시예에 따라서 16x16 블록에 적용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다.
도 9 내지 도 14는 본 발명의 일 실시예에 따른 32x32 블록에 적용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 15는 본 발명의 다른 실시예에 따른 32 포인트 이산 코사인 변환의 흐름도(flow graph)를 도시한다.
도 16은 도 15의 32 포인트 이산 코사인 변환을 구성하는 버터플라이 구조의 연산 과정을 나타낸 참조도이다.
도 17은 본 발명의 다른 실시예에 따른 영상 변환 방법을 나타낸 플로우 차트이다.
도 18은 본 발명의 일 실시예에 따른 변경된 버터플라이 구조를 나타낸 도면이다.
도 19는 본 발명의 다른 실시예에 따른 변경된 버터플라이 구조를 나타낸 도면이다.
도 20은 본 발명의 또 다른 실시예에 따른 변경된 버터 플라이 구조를 나타낸 도면이다.
도 21은 본 발명의 또 다른 실시예에 따른 변경된 버터 플라이 구조를 나타낸 도면이다.
도 22 내지 도 27은 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 28 내지 도 33은 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 34 내지 도 39는 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬 (v)의 예를 도시한다.
도 40 내지 도 45는 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬 (V)의 예를 도시한다.
도 46 내지 도 51은 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 52 내지 도 57은 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 58 내지 도 63은 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬 (v)의 예를 도시한다.
도 64 내지 도 69는 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬 (V)의 예를 도시한다.
도 70 내지 도 75는 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 76 내지 도 81은 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 82 내지 도 87은 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬 (v)의 예를 도시한다.
도 88 내지 도 93은 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬 (V)의 예를 도시한다.
도 94a 내지 도 94f는 본 발명의 일 실시예에 따라서 32x32 블록에 적용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예를 도시한다.
도 95은 본 발명의 일 실시예에 따른 영상 복호화 장치를 나타낸 블록도이다.
도 96은 본 발명의 일 실시예에 따른 영상의 역변환 방법을 나타낸 플로우 차트이다.
도 97는 본 발명의 다른 실시예에 다른 영상의 역변환 방법을 나타낸 플로우 차트이다.
도 98은 본 발명의 또 다른 실시예에 따른 영상 변환 방법을 나타낸 플로우 차트이다.
도 99a 내지 도 99g는 수학식 1에서 순열행렬 P 및 회전 행렬 A1 내지 A6의 일 실시예를 나타낸 도면이다.
도 100a 내지 도 100g는 수학식 3에서 행렬 A1 내지 A7의 일 실시예를 나타낸 도면이다.
도 101a 내지 도 101f는 본 발명의 또 다른 실시예에 따라서 32x32 블록에 적용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예를 도시한다.
도 102a 내지 도 102c는 각각 16x16, 32x32, 64x64 변환에 이용되는 곱셈의 대체 연산 과정을 나타낸다.
도 103a 내지 103c는 도 102a 내지 도 102c에 도시된 곱셈의 대체 연산 과정을 변경하는 다른 실시예에 따른 대체 연산 과정을 나타낸다.
도 104은 본 발명의 또 다른 실시예에 따른 이산 코사인 변환의 흐름도(flow graph)를 도시한다.
도 105a 내지 도 105f는 본 발명의 또 다른 실시예에 따라서 16x16 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 일 예를 도시한다.
도 106a 내지 도 106f는 16x16 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 일 예를 도시한다.
도 107a 내지 도 107f는 본 발명의 또 다른 실시예에 따라서 16 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 다른 예를 도시한다.
도 108a 내지 도 108f는 본 발명의 또 다른 실시예에 따라서 16 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다.
도 109a 내지 도 109f는 본 발명의 또 다른 실시예에 따라서 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 일 예를 도시한다.
도 110a 내지 도 110f는 본 발명의 또 다른 실시예에 따라서 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 일 예를 도시한다.
도 111a 내지 도 111f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 112a 내지 도 112f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다.
도 113a는 16x16 변환에 이용되는 곱셈의 대체 연산 과정, 도 113b는 32x32 변환에 이용되는 곱셈의 대체 연산 과정을 나타낸다.
도 114a 내지 도 114b는 도 104에 기초한 산 코사인 변환에 이용되는 곱셈 연산을 대체하는 대체 연산의 일 예를 나타낸다.
도 115a 내지 도 115f는 본 발명의 또 다른 실시예에 따라서 16 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 다른 예이다.
도 116a 내지 도 116f는 본 발명의 또 다른 실시예에 따라서 16 포인트 역 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 다른 예를 도시한다.
도 117a 내지 도 117f는 본 발명의 또 다른 실시예에 따라서 16 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 118a 내지 도 118f는 본 발명의 또 다른 실시예에 따라서 16 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다.
도 119a 내지 도 119f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 120a 내지 도 120f는 32 포인트 역 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예를 도시한다.
도 121a 내지 도 121f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 122a 내지 도 122f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다.
도 123a는 16x16 변환에 이용되는 곱셈의 대체 연산 과정, 도 123b는 32x32 변환에 이용되는 곱셈의 대체 연산 과정을 나타낸다.
도 124a 내지 도 124b는 각각 도 123a 및 도 123b의 대체 연산 과정에서 추가적으로 연산을 감소시킨 대체 연산 과정을 나타낸다.
도 125는 본 발명의 또 다른 실시예에 따른 이산 코사인 변환의 흐름도를 도시한다.
도 126은 도 125의 이산코사인 변환을 위한 R(θ)를 소정의 유리수값들로 치환한 흐름도를 나타낸다.
도 127은 본 발명의 또 다른 실시예에 따른 영상 역변환 방법을 나타낸 플로우 차트이다.
도 128은 도 126에 따라서 도 125의 R(θ)를 분모가 2의 거듭제곱인 유리수 형태로 치환하였을 때의 이산 코사인 변환을 위한 흐름도를 나타낸다.
도 129는 θ가 pi/4보다 큰 경우, 변경된 버터 플라이 구조를 나타낸다.
도 130은 변경된 버터플라이 구조를 포함하는 도 125의 이산 코사인 변환에 이용되는 삼각함수값들을 대체하기 위한 대체표를 나타낸다.
도 131a 내지 131f는 본 발명의 또 다른 실시예에 따라서 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예이다.
도 132a 내지 도 132f는 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예이다.
도 133은 도 142에 기초한 32 포인트 이산 코사인 변환에 이용되는 곱셈 연의 대체표이다.
도 134a 내지 도 134f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 135a 내지 도 135f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다.
도 136a 내지 도 136f는 본 발명의 또 다른 실시예에 따라서 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예이다.
도 137a 내지 도 136f는 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예이다.
도 138a 내지 도 138f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다.
도 139a 내지 도 139f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다.
도 140는 32 포인트 변환에 이용되는 곱셈의 대체 연산 과정을 나타낸다.
도 141은 도 128에 기초한 32 포인트 이산 코사인 변환에 이용되는 곱셈 연산을 대체하기 위한 대체표이다.
도 142는 도 130의 분모가 2의 거듭제곱 형태인 유리수를 이용하여 32 포인트 이산 코사인 변환을 수행할 때 곱셈 연산을 대체하기 위한 대체표이다.
이하, 첨부된 도면을 참조하여 본 발명의 바람직한 실시예들에 대하여 구체적으로 설명한다.
도 1은 본 발명의 일 실시예에 따른 영상 부호화 장치를 도시한다.
도 1을 참조하면, 본 발명의 일 실시예에 따른 영상 부호화 장치(100)는 예측부(110), 감산부(115), 변환부(120), 양자화부(130) 및 엔트로피 부호화부(140)를 포함한다.
예측부(110)는 입력 영상을 소정 크기의 블록들로 분할하고, 분할된 각 블록에 대하여 인터 예측 또는 인트라 예측을 통해 예측 블록을 생성한다. 구체적으로, 예측부(110)는 이전에 부호화된 후 복원된 참조 픽처의 소정 탐색 범위 내에서 현재 블록과 유사한 영역을 가리키는 움직임 벡터를 생성하는 움직임 예측 및 보상 과정을 통해 예측 블록을 생성하는 인터 예측 및 현재 블록에 인접한 주변 블록의 데이터를 이용하여 예측 블록을 생성하는 인트라 예측을 수행한다.
감산부(115)는 현재 블록의 예측 블록과 원 영상 데이터를 감산한 레지듀얼을 생성한다.
변환부(120)는 레지듀얼을 주파수 영역으로 변환한다. 특히, 본 발명의 실시예들에서는 기존의 4x4, 8x8의 상대적으로 작은 크기에 대해서 정의되었던 이산 코사인 변환 행렬을 확장하여 16x16 이상의 큰 크기의 블록에도 적용될 수 있는 새로운 이산 코사인 변환 방식을 제공한다. 후술되는 바와 같이 본 발명의 일 실시예에 따른 변환부(120)는 기존의 이산 코사인 변환에 이용되는 변환 행렬의 원소들을 유리수 값으로 치환함으로써, 부동 소수점 연산이 아닌 정수 기반의 덧셈 및 뺄셈 연산과 시프트 연산에 의하여 이산 코사인 변환을 수행함으로써 연산의 복잡도를 감소시키는 한편 연산 속도를 증가시킨다. 또한, 본 발명의 다른 실시예에 따른 변환부(120)는 버터 플라이 구조의 1차원 이산 코사인 변환시에 버터플라이 구조의 곱셈 인수 중 삼각 함수 성분을 유리수로 치환하고, 버터플라이 구조의 4개의 곱셈 연산과 2개의 덧셈 연산 과정을 3개의 곱셈 연산과 3개의 덧셈 연산 과정으로 대체한 변경된 버터플라이 구조에 기초하여 변환을 수행함으로써 하드웨어적으로 복잡도가 큰 곱셈의 연산을 감소시키며 전체적인 연산 복잡도를 감소시킨다.
양자화부(130)는 변환된 레지듀얼을 양자화한다. 특히, 본 발명의 일 실시예에 따른 양자화부(130)는 변환부(120)에서 근사화된 변환 행렬을 이용하여 변환된 값과 실제 부동 소수점 연산에 기반한 이산 코사인 변환 사이의 오차값을 감소시키기 위하여 소정의 스케일링 팩터를 변환값에 적용한다. 이와 같이 본 발명의 일 실시예에 따른 양자화부(130)는 스케일링 팩터를 이용하여 부동 소수점 연산에 기반한 이산 코사인 변환에 의한 결과값과 유리수 기반의 근사화된 이산 코사인 변환에 의한 결과값 사이의 오차값을 감소시킨다. 구체적인 스케일링 및 양자화 과정에 대해서는 후술한다.
엔트로피 부호화부(140)는 양자화된 영상 데이터에 대하여 가변 길이 부호화를 수행하여 비트스트림을 생성한다.
이하, 본 발명의 일 실시예에 따른 영상 변환 방법에 대하여 구체적으로 설명한다.
DCT는 영상 압축을 위한 효과적인 코딩 기술인데, DCT를 이용하면 영상을 공간 영역에서 주파수 영역으로 변환할 수 있으며, 영상 데이터는 변화가 적으므로 낮은 주파수, 특히 0 주파수(DC) 성분이 큰 값을 가지게 되고, 높은 주파수 성분은 상대적으로 낮은 값을 갖게 되므로서, 대부분의 정보가 낮은 주파수 쪽으로 몰리게 되어 양자화 과정을 적절히 거치면 높은 압축율로 우수한 화질의 압축 이미지를 얻을 수 있다.
영상 부호화시에 다양한 DCT 방법이 있다. 그 종류로는 처리 속도면에서는 빠르지만 정확성이 조금 떨어지는 정수(integer)를 사용하는 방법, 그리고 처리 속도는 느리지만 정확성이 뛰어난 부동 소수점(floating-point) 연산을 사용하는 방법 등이 있다. 각각의 DCT 방법은 열 단위 및 행 단위로, 즉 1차원(1-D) DCT를 수행하는 것이 일반적이다.
도 2는 4 포인트, 8 포인트, 16 포인트, 32 포인트 이산 코사인 변환의 흐름도(flow graph)를 도시한다.
도 2를 참조하면, f0 내지 f31은 일차원 변환의 입력값들을 나타낸다. 동시에 f0 내지 f31은 일차원 역변환의 출력값이 될 수 있다. F0 내지 F31은 일차원 변환의 출력값들을 나타내는 동시에 일차원 역변환의 입력값이다. 변환시에 데이터 처리 방향은 좌측에서 우측이며, 역변환시에 데이터 처리 방향은 우측에서 좌측이다. 점에서 교차하는 2개의 라인은 2개의 수의 덧셈을 나타낸다. 각 라인 위의 값은 해당 계수에 의한 곱셈을 나타낸다. cθ는 cosθ, sθ는 sinθ를 나타내며, '-'는 부정(negation)을 나타낸다. 점선으로 표시된 도면 부호 210은 4 포인트 일차원 변환의 흐름도, 도면 부호 220은 8 포인트 일차원 변환의 흐름도, 도면 부호 230은 16 포인트 일차원 변환의 흐름도, 도면 부호 240은 32 포인트 일차원 변환의 흐름도를 나타낸다.
흐름도(200)에 도시된 바와 같이 이산 코사인 변환의 단점은 cθ 및 sθ가 θ의 값에 따라서 무리수(irrational number)가 될 수 있기 때문에 연산 복잡도가 증가할 수 있다는 것이다. 이로 인해서 입력값이 정수라고 하더라도 최종 변환 결과값은 무리수로 매핑될 수 있다. 이러한 이산 코사인 변환 과정은 하드웨어로 구현시에 복잡도를 증가시킨다. 따라서, 본 발명의 일 실시예에 따른 영상 변환 방법은 이산 코사인 변환에 이용되는 무리수 대신에 유리수 값으로 치환된 계수들에 의하여 원래의 이산 코사인 변환과 최대한 유사한 결과값을 갖도록 하는 정수 변환 방법을 제공한다.
도 3은 본 발명의 일 실시예에 따른 영상 변환 방법을 나타낸 플로우 차트이다.
도 3을 참조하면, 단계 310에서 NxN(N은 정수) 크기의 블록의 1차원 이산 코사인 변환에 이용되는 NxN 변환 행렬(Original_A)을 구성하는 원소들을 N개의 변수들(ai, i는 0부터 N-1까지의 정수)에 기초한 값들로 치환하여 치환된 NxN 변환 행렬(A)을 생성한다.
다시 도 2를 참조하면, N이 16인 경우, 즉 16x16 크기의 입력 블록에 대한 1차원 이산 코사인 변환 수행시에 도면 부호 230으로 도시된 흐름도를 따라서 입력 블록의 16개의 행 단위 및 16개의 열 단위 별로 1차원 이산 코사인 변환이 수행된다. 16개의 입력값을 f=[f0, f1, f2, ..., f14, f15]T, 변환 결과값을 F=[F0, F1, F2, ..., F14, F15]T, 도면 부호 230에 따른 입력값에 대한 변환 과정을 나타낸 변환 행렬을 Original_A라고 한다면 1차원 이산 코사인 변환은 F=Original_Axf 로 표현된다.
전술한 바와 같이, cosθ 및 sinθ는 θ의 값에 따라서 무리수가 될 수 있기 때문에, 본 발명의 일 실시예에 따르면 변환 행렬(Original_A)의 원소들에 포함된 cosθ 및 sinθ를 유리수 값으로 치환한다. 구체적으로, NxN 변환 행렬(Original_A)을 구성하는 원소들의 cos(πx(i/2)/N)(i는 0부터 N-1까지의 정수)인 성분을 유리수인 N개의 ai 변수들로 치환된다. 전술한 예에서, N=16인 경우라면, cos 0은 a0으로, cos(πx(1/2)/16)은 a1으로, cos(πx(2/2)/16)은 a2로, cos(πx(3/2)/16)은 a3로, cos(πx(4/2)/16)는 a4로, cos(πx(5/2)/16)는 a5로, cos(πx(6/2)/16)는 a6로, cos(πx(7/2)/16)는 a7, cos(πx(8/2)/16)는 a8, cos(πx(9/2)/16)는 a9, cos(πx(10/2)/16)는 a10, cos(πx(11/2)/16)는 a11, cos(πx(12/2)/16)는 a12, cos(πx(13/2)/16)는 a13, cos(πx(14/2)/16)는 a14, cos(πx(15/2)/16)는 a15로 치환된다. sinθ 성분은 sinθ=cos(90-θ)와 같은 관계를 이용하여 마찬가지로 ai 변수들로 치환될 수 있다.
도 4는 본 발명의 일 실시예에 따라서 16x16 변환 행렬의 원소에 구비된 삼각함수 성분을 변수들로 치환한 치환된 NxN 변환 행렬(A)의 원소들을 나타낸 참조도이다. 도 4를 참조하면, 원래의 16x16 변환 행렬을 구성하는 원소들은 16개의 변수들 ai에 기초한 값들로 표현될 수 있다.
다시 도 3을 참조하면, 단계 320에서 치환된 NxN 변환 행렬(A)과 치환된 NxN 변환 행렬의 전치 행렬(transpose)(AT)의 곱셈 행렬(AxAT)을 획득한다.
변환 행렬(A)이 갖추어야 할 조건 중 하나는 직교성(orthogonality)이다. 변환 행렬(A)이 직교성을 갖기 위해서는 변환 행렬(A)과 그 전치 행렬(AT)의 곱셈 결과에 따른 행렬의 원소들 중 대각 성분을 제외한 나머지 원소의 값이 0이어야 한다. 본 발명의 일 실시예에서는 원래 무리수였던 값을 유리수인 변수들 ai로 치환하였기 때문에 곱셈 행렬(AxAT)의 원소들 중 대각 성분을 제외한 나머지 원소의 값이 0이 아닐 수 있다. 그러나, 최대한 직교성을 갖도록 하기 위해서, 단계 330에서 곱셈 행렬(AxAT)의 대각 성분을 제외한 나머지 원소들의 제곱합이 최소가 되도록 하는 N개의 변수들(ai)을 획득한다. 전술한 도 4와 같은 16x16 크기의 블록에 대한 변환 행렬과 그 전치 행렬과의 곱셈 행렬(AxAT)을 계산한 다음, 곱셈 행렬(AxAT)의 대각 성분을 제외한 나머지 원소들의 제곱합은 다음의 수학식 f와 같다.
f = 128*a8^4*a15^2*a4^2*a11^2*a12^2+128*a8^4*a1^2*a4^2*a5^2*a12^2-64*a8^2*a13^2*a9^2-64*a5^2*a4^4*a7^2*a8^2+32*a11^2*a12^2*a9^2*a4^2+128*a8^4* a15^2*a12^2*a3^2*a4^2+64*a8^4*a5^2*a12^4*a7^2+64*a8^4*a5^2*a4^4*a7^2+128*a1^2*a4^2*a7^2*a8^2*a12^2+32*a15^2*a12^2*a9^2*a4^2-256*a8^2*a2^2*a6^2+256*a8^4 *a14^2*a10^2-256*a14^2*a10^2*a8^2+16*a15^2*a13^2+16*a7^2*a12^4*a11^2+ 16*a9^2*a4^4*a5^2+16*a11^2*a4^4*a7^2+16*a5^2*a12^4*a9^2-64*a8^2*a11^2*a9^2-64*a8^2*a5^2*a7^2+64*a8^4*a5^2*a7^2+64*a8^2*a13^2*a11^2+64*a8^4*a13^2*a11^2-32*a11^2*a12^2*a13^2+16*a11^2*a12^4*a13^2-32*a5^2*a4^2*a3^2+16 *a5^2*a4^4*a3^2-32*a3^2*a12^2*a5^2+16*a3^2*a12^4*a5^2-32*a13^2*a4^2 *a11^2+64*a8^2*a3^2*a5^2+64*a8^4*a3^2*a5^2+16*a15^2*a11^2+16*a1^2*a5^2+64*a2^2*a10^2-32*a7^2*a12^2*a1^2+16*a7^2*a12^4*a1^2-32*a9^2*a4^2*a15^2+16*a9^2*a4^4 *a15^2-32*a15^2*a12^2*a9^2+16*a15^2*a12^4*a9^2-32*a1^2*a4^2*a7^2+16*a1^2 *a4^4*a7^2+64*a8^2*a15^2*a9^2+64*a8^4*a15^2*a9^2+64*a8^2*a1^2*a7^2+64*a8^4*a1^2*a7^2+64*a8^4*a13^2*a9^2+16*a15^2*a12^4*a11^2+16*a1^2*a4^4*a5^2+16*a15^2*a4^4*a11^2+16*a1^2*a12^4*a5^2-64*a8^2*a15^2*a5^2-64*a8^2*a1^2*a11^2+64*a8^4 *a1^2*a11^2+64*a8^2*a13^2*a5^2+64*a8^4*a13^2*a5^2-32*a3^2*a12^2*a11^2+16 *a3^2*a12^4*a11^2-32*a3^2*a4^2*a11^2+16*a3^2*a4^4*a11^2-32*a13^2*a4^2*a5^2+16 *a13^2*a4^4*a5^2-32*a13^2*a12^2*a5^2+16*a13^2*a12^4*a5^2+16*a3^2* a12^4*a7^2+16*a13^2*a4^4*a9^2+16*a3^2*a4^4*a7^2+16*a13^2*a12^4*a9^2-64*a8^2*a3^2*a9^2+64*a8^4*a3^2*a9^2+64*a8^4*a13^2*a7^2+64*a8^4*a3^2*a11^2+16*a11^2*a9^2+16*a3^2*a7^2-64*a8^2*a15^2*a3^2+64*a8^4*a15^2*a3^2-64*a8^2* a1^2*a13^2+64*a8^4*a1^2*a13^2+16*a1^2*a4^4*a3^2+16*a15^2*a4^4*a13^2+16*a1^2*a12^4*a3^2+16*a15^2*a12^4*a13^2-256*a2^2*a10^2*a8^2+16*a15^2*a7^2+ 128*a8^4*a1^2*a4^2*a13^2*a12^2+16*a5^2*a9^2+16*a3^2*a5^2-64*a7^2*a12^4* a11^2*a8^2+64*a8^4*a7^2*a12^4*a11^2+64*a13^2*a4^4*a5^2*a8^2+32*a3^2*a4^2*a11^2*a12^2+64*a3^2*a4^4*a11^2*a8^2+64*a3^2*a12^4*a11^2*a8^2-128*a8^4*a13^2* a5^2*a4^2-128*a8^4*a13^2*a5^2*a12^2+32*a13^2*a12^2*a7^2*a4^2+ 64*a2^2*a6^2+64*a8^4*a11^2*a4^4*a7^2-128*a8^4*a15^2*a7^2*a12^2 +32*a1^2*a4^2*a9^2*a12^2+64*a1^2*a4^4*a9^2*a8^2+64*a1^2*a12^4*a9^2*a8^2+32*a15^2*a12^2*a7^2*a4^2+64*a15^2*a12^4*a7^2*a8^2+64*a8^4*a15^2*a4^4*a7^2+16*a1^2*a4^4*a9^2-128*a1^2*a12^2*a5^2*a8^2*a4^2-128*a15^2*a4^2*a11^2*a8^2*a12^2-64*a1^2*a4^4*a5^2*a8^2+16*a15^2*a5^2+16*a13^2*a11^2+64*a14^2*a10^2+128*a3^2*a4^2*a11^2*a8^2*a12^2+16*a1^2*a12^4*a13^2+128*a13^2*a4^2*a11^2*a8^2*a12^2+128*a3^2*a12^2*a5^2*a8^2*a4^2-128*a3^2*a4^2*a7^2*a8^2*a12^2 +16*a3^2*a9^2+32*a5^2*a4^2*a7^2*a12^2-128*a1^2*a12^2*a3^2*a8^2* a4^2+128*a1^2*a4^2*a9^2*a8^2*a12^2-128*a15^2*a12^2*a13^2*a8^2*a4^2+ 16*a15^2*a3^2+64*a5^2*a4^4*a3^2*a8^2-128*a11^2*a12^2*a13^2*a8^2+64*a11^2* a12^4*a13^2*a8^2-128*a8^4*a13^2*a11^2*a4^2-128*a8^4*a13^2*a11^2 *a12^2+64*a8^4*a3^2*a12^4*a5^2-128*a3^2*a4^2*a9^2*a8^2*a12^2-128*a8^2*a1^2*a9^2*a4^2+64*a8^4*a5^2*a9^2+64*a8^4*a11^2*a7^2-64*a8^2*a11^2*a7^2+16*a5^2*a4^4*a7^2+16*a5^2*a12^4*a7^2+16*a11^2*a12^4*a9^2+128*a8^4*a3^2*a12^2*a11^2*a4^2+64*a8^4*a3^2*a4^4*a11^2+64*a8^4*a3^2*a12^4*a11^2+16*a13^2*a5^2+64*a8^4*a5^2*a4^4*a3^2+128*a8^4*a3^2*a12^2*a5^2*a4^2+256*a8^4*a14^2*a6^2+64*a8^4*a3^2*a12^4*a7^2+64*a8^4*a3^2*a4^4*a7^2-256*a8^2*a14^2*a6^2+32*a5^2*a12^2*a9^2*a4^2+128*a15^2*a12^2*a7^2*a8^2*a4^2+16*a15^2*a4^4*a7^2-32*a15^2*a4^2*a7^2+64*a15^2*a4^4*a7^2*a8^2+ 256*a8^4*a2^2*a10^2+64*a8^4*a15^2*a12^4*a3^2+64*a8^4*a15^2*a4^4*a3^2+64*a8^4*a1^2*a4^4*a13^2+64*a8^4*a1^2*a12^4*a13^2+32*a1^2*a12^2*a5^2*a4^2-64*a1^2*a12^4*a5^2*a8^2+32*a15^2*a4^2*a11^2*a12^2-64*a15^2*a4^4*a11^2*a8^2-64*a15^2*a12^4*a11^2*a8^2+64*a8^4*a15^2*a4^4*a11^2+64*a8^4*a1^2*a4^4*a5^2+64*a8^4*a1^2*a12^4*a5^2-64*a8^2*a15^2*a13^2+64*a8^4*a15^2*a13^2-64*a8^2*a1^2*a3^2+64*a8^4*a1^2*a3^2+16*a15^2*a12^4*a3^2+16*a15^2*a4^4*a3^2+16*a1^2*a4^4*a13^2-128*a1^2*a12^2*a11^2*a8^2*a4^2-64*a1^2*a4^4*a11^2*a8^2-64*a13^2*a12^4*a7^2*a8^2-64*a13^2*a4^4*a7^2*a8^2+64*a8^4*a3^2*a7^2-64*a8^2*a3^2*a7^2+16*a13^2*a12^4*a7^2+16*a3^2*a4^4*a9^2+16*a3^2*a12^4*a9^2-64*a15^2*a4^4*a5^2*a8^2-64*a15^2*a12^4*a5^2*a8^2+64*a8^4*a15^2*a12^4*a5^2 +64*a8^4*a15^2*a4^4*a5^2-128*a1^2*a12^2*a13^2*a8^2*a4^2-64*a1^2*a12^4*a13^2*a8^2-64*a1^2*a4^4*a13^2*a8^2+16*a1^2*a3^2-64*a8^2*a5^2*a9^2+16*a13^2*a7^2-64*a1^2*a5^2*a8^2-64*a15^2*a11^2*a8^2 +64*a8^4*a1^2*a5^2+64*a8^4*a15^2*a11^2+16*a1^2*a12^4*a11^2+16*a1^2*a4^4*a11^2-128*a5^2*a12^2*a9^2*a8^2*a4^2-128*a11^2*a4^2*a7^2*a8^2*a12^2-64*a5^2*a12^4*a9^2*a8^2+32*a11^2*a4^2*a7^2*a12^2-64*a11^2*a4^4*a7^2*a8^2-64*a9^2*a4^4*a5^2*a8^2+64*a8^4*a15^2*a5^2-128*a8^2*a1^2*a7^2*a4^2-128*a8^2*a1^2*a7^2*a12^2-128*a8^4*a1^2*a7^2*a12^2-128*a8^4*a1^2*a7^2*a4^2-128*a8^2*a15^2*a9^2*a12^2-128*a8^2*a15^2*a9^2*a4^2-128*a8^4*a15^2*a9^2*a4^2-128*a8^4*a15^2*a9^2*a12^2+32*a1^2*a4^2*a7^2*a12^2+64*a1^2*a4^4*a7^2*a8^2+128*a8^4*a5^2*a12^2*a7^2*a4^2+128*a8^4*a15^2*a12^2*a13^2*a4^2+64*a8^4*a9^2*a4^4*a15^2+64*a8^4*a15^2*a12^4*a9^2+64*a8^4*a3^2*a12^4*a9^2+128*a8^4*a3^2*a4^2*a9^2*a12^2+128*a8^4*a13^2*a4^2*a7^2*a12^2+16*a13^2*a9^2+128*a8^4*a7^2*a12^2*a11^2*a4^2+64*a8^4*a5^2*a12^4*a9^2+64*a8^4*a9^2*a4^4*a5^2+16*a5^2*a7^2+64*a14^2*a6^2+32*a15^2*a4^2*a3^2*a12^2-64*a15^2*a4^4*a3^2*a8^2-64*a15^2*a12^4*a3^2*a8^2+ 16*a15^2*a4^4*a5^2+16*a15^2*a12^4*a5^2+32*a15^2*a4^2*a5^2*a12^2+64*a8^4*a1^2*a4^4*a3^2+64*a8^4*a1^2*a12^4*a3^2+64*a8^4*a7^2*a12^4*a1^2+128*a8^4*a7^2*a12^2*a1^2*a4^2+32*a1^2*a12^2*a13^2*a4^2-128*a8^2*a3^2*a11^2*a12^2-128*a8^4* a3^2*a11^2*a12^2-128*a8^4*a3^2*a11^2*a4^2+32*a13^2*a12^2*a5^2*a4^2-128*a13^2*a12^2*a5^2*a8^2+64*a13^2*a12^4*a5^2*a8^2+64*a8^2*a3^2*a11^2-128*a8^2*a3^2*a11^2*a4^2+128*a8^4*a9^2*a4^2*a15^2*a12^2+64*a8^4*a15^2*a12^4*a11^2-64*a1^2*a4^4*a3^2*a8^2+64*a8^4*a15^2*a12^4*a13^2+64*a8^4*a15^2 *a4^4*a13^2+16*a1^2*a13^2+64*a8^4*a11^2*a9^2+128*a8^4*a15^2*a4^2*a7^2*a12^2+64*a8^4*a15^2*a12^4*a7^2+64*a8^4*a1^2*a12^4*a9^2+64*a8^4*a1^2*a4^4*a9^2-128*a15^2*a4^2*a5^2*a8^2*a12^2+32*a15^2*a12^2*a13^2*a4^2-64*a15^2*a12^4*a13^2*a8^2+32*a1^2*a12^2*a3^2*a4^2-64*a1^2*a12^4*a3^2*a8^2-64*a15^2*a4^4*a13^2*a8^2+64*a8^4*a13^2*a4^4*a5^2+64*a8^4*a13^2*a12^4*a5^2+16*a3^2*a11^2-64*a13^2*a12^4*a9^2*a8^2+64*a8^4*a13^2*a4^4*a11^2+64*a8^4 *a11^2*a12^4*a13^2-128*a11^2*a12^2*a9^2*a8^2*a4^2-64*a11^2*a12^4*a9^2*a8^2-64*a11^2*a4^4*a9^2*a8^2+64*a8^4*a11^2*a4^4*a9^2+64*a8^4*a11^2*a12^4*a9^2+16*a11^2*a4^4*a9^2-128*a5^2*a4^2*a7^2*a8^2*a12^2-64*a5^2*a12^4*a7^2*a8^2 +128*a8^4*a15^2*a12^2*a5^2*a4^2+128*a8^4*a11^2*a4^2*a9^2*a12^2+16*a11^2*a7^2+128*a8^4*a13^2*a4^2*a5^2*a12^2+64*a8^4*a1^2*a4^4*a7^2-128*a15^2 *a4^2*a3^2*a8^2*a12^2+16*a15^2*a9^2-128*a8^2*a3^2*a5^2*a12^2-128*a8^2 *a3^2*a5^2*a4^2-128*a8^4*a3^2*a5^2*a12^2-128*a8^4*a3^2*a5^2*a4^2 +32*a13^2*a4^2*a11^2*a12^2-128*a13^2*a4^2*a11^2*a8^2+64*a13^2*a4^4*a11^2*a8^2 +32*a3^2*a12^2*a5^2*a4^2+64*a3^2*a12^4*a5^2*a8^2-128*a13^2*a12^2*a7^2*a8^2 *a4^2+16*a13^2*a4^4*a7^2+128*a8^4*a1^2*a4^2*a3^2*a12^2+256*a8^4*a2^2*a6^2+16*a1^2*a11^2-64*a3^2*a12^4*a7^2*a8^2+64*a8^4*a13^2*a4^4*a9^2 +64*a8^4*a13^2*a12^4*a9^2+128*a8^4*a1^2*a12^2*a9^2*a4^2+16*a1^2*a7^2+128*a15^2*a12^2*a9^2*a8^2*a4^2+64*a15^2*a12^4*a9^2*a8^2+64*a9^2*a4^4*a15^2*a8^2+64*a7^2*a12^4*a1^2*a8^2+128*a13^2*a12^2*a5^2*a8^2*a4^2-128*a13^2*a4^2*a5^2*a8^2 +128*a8^4*a1^2*a4^2*a11^2*a12^2+128*a8^4*a13^2*a4^2*a9^2*a12^2+64*a8^4*a1^2*a9^2+64*a8^2*a1^2*a9^2+64*a8^4*a15^2*a7^2+64*a8^2*a15^2*a7^2-32*a1^2*a4^2*a9^2+16*a1^2*a12^4*a9^2-32*a1^2*a12^2*a9^2+16*a15^2*a12^4*a7^2-32*a15^2*a12^2*a7^2-128*a13^2*a12^2*a9^2*a8^2*a4^2+64*a8^4*a1^2*a4^4*a11^2 +64*a8^4*a1^2*a12^4*a11^2-64*a8^2*a13^2*a7^2+32*a13^2*a12^2*a9^2 *a4^2+32*a3^2*a4^2*a9^2*a12^2-64*a3^2*a4^4*a9^2*a8^2-64*a3^2*a12^4*a9^2*a8^2+64*a8^4*a3^2*a4^4*a9^2+64*a8^4*a13^2*a4^4*a7^2+64*a8^4*a13^2*a12^4*a7^2+128*a8^4*a13^2*a4^2*a11^2*a12^2+128*a8^4*a5^2*a12^2*a9^2*a4^2+16*a13^2*a4^4*a11^2+32*a1^2*a12^2*a11^2*a4^2-64*a1^2*a12^4*a11^2*a8^2-128*a8^2*a1^2*a9^2*a12^2-128*a8^4*a1^2*a9^2*a12^2-128*a8^4*a1^2*a9^2*a4^2-128*a8^2*a15^2*a7^2*a12^2-128*a8^2*a15^2*a7^2*a4^2+16*a1^2*a9^2-128*a8^4*a15^2*a7^2*a4^2+32*a3^2*a4^2*a7^2*a12^2-64*a3^2*a4^4*a7^2*a8^2-64*a13^2*a4^4*a9^2*a8^2+128*a8^4*a3^2*a12^2*a7^2*a4^2
전술한 수학식의 f값이 최소가 되도록 하는 ai는 다양한 최적화 알고리즘을 적용하여 계산될 수 있다. 최적화 알고리즘 적용시에 ai 변수들은 유리수이면서, 분모는 쉬프트(shift) 연산이 가능한 2의 거듭제곱 형태의 값을 갖는 것이 바람직하다. 이와 같이 변수 ai가 2의 거듭제곱 형태인 유리수(dyadic rational)인 제한 조건을 설정하는 이유는, 분모가 2의 거듭제곱 형태인 경우 라이트 쉬프트 연산(>>)만을 이용하여 구현될 수 있기 때문이다.
일 예로, N은 16인 경우, 최적화 알고리즘을 적용하면 16개의 변수들 ai는 다음의 값들; a1=63/64, a2= 62/64, a3= 61/64, a4 = 59/64, a5 = 56/64, a6 = 53/64, a7 = 49/64, a8 = 45/64, a9 = 40/64, a10 = 35/64, a11 = 30/64, a12 = 24/64, a13 = 18/64, a14 = 12/64 및 a15 = 6/64을 갖을 수 있다.
단계 340에서 획득된 N개의 변수들(ai)에 기초한 값들로 치환된 NxN 변환 행렬(A)을 이용하여 NxN 크기의 블록을 변환한다. 즉, 입력값이 X라면 AX를 계산함으로써 N 포인트 1차원 이산 코사인 변환을 할 수 있다. 이와 같은 변환 행렬(A)는 전술한 과정을 통해 미리 획득된 다음 소정의 메모리에 저장된 후 소정 크기의 입력 블록에 적용되어 변환이 수행되도록 할 수 있다. 즉, 변환 과정을 위해서 매번 변환 행렬이 계산되는 것이 아니라, 다양한 크기의 입력 블록에 대하여 본 발명의 일 실시예에 따라서 미리 획득되어 저장된 변환 행렬이 이용되도록 할 수 있다.
전술한 예와 같이 N이 16인 경우, 즉 16x16 입력 블록에 대하여 치환된 16x16 변환 행렬(A)를 이용한 1차원 이산 코사인 변환을 수행하는 단계는, X0 내지 X15은 변환되어야 할 입력값, B0 내지 B15, C0 내지 C15, D0 내지 D15, E0 내지 E15, F0 내지 F15, G0 내지 G15은 중간값, Y0 내지 Y15은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
B0 = X0+X15; B15 = X0-X15; B1 = X1+X14; B14 = X1-X14; B2 = X2+X13;
B13 = X2-X13; B3 = X3+X12; B12 = X3-X12; B4 = X4+X11; B11 = X4-X11;
B5 = X5+X10; B10 = X5-X10; B6 = X6+X9; B9 = X6-X9; B7 = X7+X8;
B8 = X7-X8; C7 = B0-B7; C1 = B1+B6; C6 = B1-B6; C2 = B2+B5; C5 = B2-B5;
C3 = B3+B4; C4 = B3-B4; C8 = B8; C14 = B14; C10 = (45*(B13-B10)) >> 6;
C13 = (45*(B13+B10)) >> 6; C9 = B9;C15 = B15; C11 = (45*(B12-B11)) >> 6
C12 = (45*(B12+B11)) >> 6; D0 = C0+C3 ;D3 = C0-C3; D8 = C8+C11;
*D11 = C8-C11; D12 = C15-C12; D15 = C15+C12; D1 = C1+C2; D2 = C1-C2;
D9 = C9+C10; D10 = C9-C10; D13 = C14-C13; D14 = C14+C13; D4 = C4;
D5 = (45*(C6-C5)) >> 6; D6 = (45*(C6+C5)) >> 6;
D7 = C7; E0 = (45*(D0+D1)) >> 6; E1 = (45*(D0-D1)) >> 6;
E2 = (59*D3+24*D2) >> 6; E3 = (24*D3-59*D2) >> 6; E4 = D4+D5;
E5 = D4-D5; E6 = D7-D6; E7 = D7+D6; E8 = D8; E9 = (24*D14-59*D9) >> 6;
E10 = (-59*D13-24*D10) >> 6; E11 = D11; E12 = D12;
E13 = (24*D13-59*D10) >> 6; E14 = (59*D14+24*D9) >> 6; E15 = D15
F0 = E0; F1 = E1; F2 = E2; F3 = E3; F4 = (12*E4+62*E7) >> 6
F5 = (53*E5+35*E6) >> 6; F6 = (53*E6-35*E5) >> 6
F7 = (12*E7-62*E4) >> 6; F8 = E8+E9; F9 = E8-E9; F10 = E11-E10
F11 = E11+E10; F12 = E12+E13; F13 = E12-E13; F14 = E15-E14;
F15 = E15+E14; G0 = F0; G1 = F1; G2 = F2; G3 = F3; G4 = F4
G5 = F5; G6 = F6; G7 = F7; G8 = (6*F8+63*F15) >> 6
G9 = (49*F9+40*F14) >> 6; G10 = (30*F10+56*F13) >> 6
G11 = (61*F11+18*F12) >> 6; G12 = (61*F12-18*F11) >> 6
G13 = (30*F13-56*F10) >> 6; G14 = (49*F14-40*F9) >> 6
G15 = (6*F15-63*F8) >> 6
Y0 = G0; Y1 = G8; Y2 = G4; Y3 = G12; Y4 = G2; Y5 = G10; Y6 = G6
Y7 = G14; Y8 = G1; Y9 = G9; Y10 = G5; Y11 = G13; Y12 = G3
Y13 = G11; Y14 = G7; Y15 = G15;
상기 연산 과정에서 결과값이 변함없는 연산 과정, 예를 들어 F0=E0=GO=Y0와 같이 동일한 값이 계속 매핑되는 것에 불과한 연산 과정의 경우 중간 과정을 생략하고 바로 F0가 결과값 Y0로 매핑되도록 할 수 있다.
또한, 전술한 연산 과정에서 나눗셈에 대응되는 라이트 쉬프트 연산(>>)과 관련하여, 반올림 오차(rounding error)를 감소시키기 위하여 x>>y 연산은 (x+(1<<(y-1)))>>y 또는 (abs(x)+(1<<(y-1)))>>y 연산 형태로 대체될 수 있다.
다른 예로서 N이 32인 경우도 전술한 N이 16인 경우와 유사하게, 32x32 크기의 블록의 1차원 이산 코사인 변환에 이용되는 32x32 변환 행렬(Original_A)을 구성하는 원소들을 32개의 변수들(ai, i는 0부터 31까지의 정수)에 기초한 값들로 치환하여 치환된 NxN 변환 행렬(A)을 생성한다. 도 2를 다시 참조하면, N이 32인 경우, 즉 32x32 크기의 입력 블록에 대한 1차원 이산 코사인 변환 수행시에 도면 부호 240으로 도시된 흐름도를 따라서 입력 블록의 32개의 행 단위 및 32개의 열 단위 별로 1차원 이산 코사인 변환이 수행된다. 32개의 입력값을 f=[f0, f1, f2, ..., f30, f31]T, 변환 결과값을 F=[F0, F1, F2, ..., F30, F31]T, 도면 부호 240에 따른 입력값에 대한 변환 과정을 나타낸 변환 행렬을 Original_A라고 한다면 1차원 이산 코사인 변환은 F=Original_Axf 로 표현된다. 32x32 변환 행렬(Original_A)을 구성하는 원소들의 cos(πx(i/2)/32)(i는 0부터 31까지의 정수)인 성분을 유리수인 32개의 ai 변수들로 치환된다. 치환된 32x32 변환 행렬(A)과 치환된 32x32 변환 행렬의 전치 행렬(transpose)(AT)의 곱셈 행렬(AxAT)을 획득하고, 곱셈 행렬(AxAT)의 원소들 중 대각 성분을 제외한 나머지 원소들의 제곱합이 최소가 되도록 하는 32개의 변수들(ai)을 최적화 알고리즘을 적용하여 획득한다.
N이 32인 경우, 최적화 알고리즘을 적용하면 32개의 변수들 ai는 다음의 값들; a1 = 255/256, a2 = 254/256, a3 = 253/256, a4 = 251/256, a5 = 248/256, a6 = 244/256, a7 = 241/256, a8 = 236/256, a9 = 231/256, a10 = 225/256, a11 = 219/256, a12 = 212/256, a13 = 205/256, a14 = 197/256, a15 = 189/256, a16 = 181/256, a17 = 171/256, a18 = 162/256, a19 = 152/256, a20 = 142/256, a21 = 131/256, a22 = 120/256, a23 = 109/256, a24 = 97/256, a25 = 86/256, a26 = 74/256, a27 = 62/256, a28 = 49/256, a29 = 37/256, a30 = 25/256 및 a31 = 12/256 을 갖을 수 있다.
다음 획득된 32개의 변수들(ai)에 기초한 값들로 치환된 32x32 변환 행렬(A)을 이용하여 32x32 크기의 블록을 변환한다.
전술한 N이 32인 경우, 즉 32x32 입력 블록에 대하여 치환된 32x32 변환 행렬(A)를 이용한 1차원 이산 코사인 변환을 수행하는 단계는 X0 내지 X31은 변환되어야 할 입력값, A0내지 B31, B0 내지 B31, C0 내지 C31, D0 내지 D31, E0 내지 E31, F0 내지 F31, G0 내지 G31, H0 내지 H31은 중간값, Y0 내지 Y31은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
A0 = X0+X31; A31 = X0-X31; A1 = X1+X30; A30 = X1-X30; A2 = X2+X29;
A29 = X2-X29; A3 = X3+X28; A28 = X3-X28; A4 = X4+X27; A27 = X4-X27
A5 = X5+X26; A26 = X5-X26; A6 = X6+X25; A25 = X6-X25; A7 = X7+X24;
A24 = X7-X24; A8 = X8+X23; A23 = X8-X23; A9 = X9+X22; A22 = X9-X22;
A10 = X10+X21; A21 = X10-X21; A11 = X11+X20; A20 = X11-X20;
A12 = X12+X19; A19 = X12-X19; A13 = X13+X18; A18 = X13-X18;
A14 = X14+X17; A17 = X14-X17; A15 = X15+X16; A16 = X15-X16;
B0 = A0+A15; B15 = A0-A15; B1 = A1+A14; B14 = A1-A14; B2 = A2+A13;
B13 = A2-A13; B3 = A3+A12; B12 = A3-A12; B4 = A4+A11; B11 = A4-A11;
B5 = A5+A10; B10 = A5-A10; B6 = A6+A9; B9 = A6-A9; B7 = A7+A8;
B8 = A7-A8; B16 = A16; B28 = A28; B20 = (181*(A27-A20)) >> 8;
B27 = (181*(A27+A20)) >> 8; B17 = A17; B29 = A29;
B21 = (181*(A26-A21)) >> 8; B26 = (181*(A26+A21)) >> 8;
B18 = A18; B30 = A30; B22 = (181*(A25-A22)) >> 8;
B25 = (181*(A25+A22)) >> 8; B19 = A19; B31 = A31;
B23 = (181*(A24-A23)) >> 8; B24 = (181*(A24+A23)) >> 8;
C0 = B0+B7; C7 = B0-B7; C1 = B1+B6; C6 = B1-B6; C2 = B2+B5;
C5 = B2-B5; C3 = B3+B4; C4 = B3-B4; C8 = B8; C14 = B14;
C10 = (181*(B13-B10)) >> 8; C13 = (181*(B13+B10)) >> 8;
C9 = B9; C15 = B15; C11 = (181*(B12-B11)) >> 8;
C12 = (181*(B12+B11)) >> 8; C16 = B16+B23; C23 = B16-B23;
C24 = B31-B24; C31 = B31+B24; C17 = B17+B22; C22 = B17-B22;
C25 = B30-B25; C30 = B30+B25; C18 = B18+B21; C21 = B18-B21;
C26 = B29-B26; C29 = B29+B26; C19 = B19+B20; C20 = B19-B20;
C27 = B28-B27; C28 = B28+B27; D0 = C0+C3; D3 = C0-C3; D8 = C8+C11;
D11 = C8-C11; D12 = C15-C12; D15 = C15+C12; D1 = C1+C2; 2 = C1-C2;
D9 = C9+C10; D10 = C9-C10; D13 = C14-C13; D14 = C14+C13; D4 = C4;
D5 = (181*(C6-C5)) >> 8; D6 = (181*(C6+C5)) >> 8; D7 = C7;
D16 = C16; D18 = (97*C29-236*C18) >> 8; D20 = (-236*C27-97*C20) >> 8;
D22 = C22; D24 = C24; D26 = (-236*C21+97*C26) >> 8;
D28 = (97*C19+236*C28) >> 8; D30 = C30; D17 = C17;
D19 = (97*C28-236*C19) >> 8; D21 = (-236*C26-97*C21) >> 8;
D23 = C23; D25 = C25; D27 = (-236*C20+97*C27) >> 8;
D29 = (97*C18+236*C29) >> 8; D31 = C31; E0 = (181*(D0+D1)) >> 8;
E1 = (181*(D0-D1)) >> 8; E2 = (236*D3+97*D2) >> 8;
E3 = (97*D3-236*D2) >> 8; E4 = D4+D5; E5 = D4-D5; E6 = D7-D6;
E7 = D7+D6; E8 = D8; E9 = (97*D14-236*D9) >> 8;
E10 = (-236*D13-97*D10) >> 8; E11 = D11; E12 = D12;
E13 = (97*D13-236*D10) >> 8; E14 = (236*D14+97*D9) >> 8;
E15 = D15; E16 = D16+D19; E19 = D16-D19; E20 = D23-D20;E23 = D23+D20;
E24 = D24+D27; E27 = D24-D27; E28 = D31-D28; E31 = D31+D28;
E17 = D17+D18; E18 = D17-D18; E21 = D22-D21; E22 = D22+D21;
E25 = D25+D26; E26 = D25-D26; E29 = D30-D29; E30 = D30+D29;
F0 = E0; F1 = E1; F2 = E2; F3 = E3; F4 = (49*E4+251*E7) >> 8;
F5 = (212*E5+142*E6) >> 8; F6 = (212*E6-142*E5) >> 8
F7 = (49*E7-251*E4) >> 8; F8 = E8+E9; F9 = E8-E9; F10 = E11-E10;
F11 = E11+E10; F12 = E12+E13; F13 = E12-E13; F14 = E15-E14;
F15 = E15+E14; F16 = E16; F17 = (49*E30-251*E17) >> 8;
F18 = (-251*E29-49*E18) >> 8; F19 = E19; F20 = E20;
F21 = (212*E26-142*E21) >> 8; F22 = (-142*E25-212*E22) >> 8;
F23 = E23; F24 = E24; F25 = (212*E25-142*E22) >> 8;
F26 = (142*E26+212*E21) >> 8;
F27 = E27; F28 = E28; F29 = (49*E29-251*E18) >> 8;
F30 = (251*E30+49*E17) >> 8; F31 = E31; G0 = F0; G1 = F1;
G2 = F2; G3 = F3; G4 = F4; G5 = F5; G6 = F6; G7 = F7;
G8 = (25*F8+254*F15) >> 8; G9 = (197*F9+162*F14) >> 8;
G10 = (120*F10+225*F13) >> 8; G11 = (244*F11+74*F12) >> 8;
G12 = (244*F12-74*F11) >> 8; G13 = (120*F13-225*F10) >> 8;
G14 = (197*F14-162*F9) >> 8; G15 = (25*F15-254*F8) >> 8;
G16 = F16+F17; G17 = F16-F17; G18 = F19-F18; G19 = F19+F18;
G20 = F20+F21; G21 = F20-F21; G22 = F23-F22; G23 = F23+F22;
G24 = F24+F25; G25 = F24-F25; G26 = F27-F26; G27 = F27+F26;
G28 = F28+F29; G29 = F28-F29; G30 = F31-F30; G31 = F31+F30;
H0 = G0; H1 = G1; H2 = G2; H3 = G3; H4 = G4; H5 = G5; H6 = G6;
H7 = G7; H8 = G8; H9 = G9; H10 = G10; H11 = G11; H12 = G12;
H13 = G13; H14 = G14; H15 = G15; H16 = (12*G16+255*G31) >> 8;
H17 = (189*G17+171*G30) >> 8; H18 = (109*G18+231*G29) >> 8;
H19 = (241*G19+86*G28) >> 8; H20 = (62*G20+248*G27) >> 8;
H21 = (219*G21+131*G26) >> 8; H22 = (152*G22+205*G25) >> 8;
H23 = (253*G23+37*G24) >> 8; H24 = (253*G24-37*G23) >> 8;
H25 = (152*G25-205*G22) >> 8; H26 = (219*G26-131*G21) >> 8;
H27 = (62*G27-248*G20) >> 8; H28 = (241*G28-86*G19) >> 8;
H29 = (109*G29-231*G18) >> 8; H30 = (189*G30-171*G17) >> 8;
H31 = (12*G31-255*G16) >> 8;
Y0 = H0; Y1 = H16; Y2 = H8; Y3 = H24; Y4 = H4; Y5 = H20;
Y6 = H12; Y7 = H28; Y8 = H2; Y9 = H18; Y10 = H10; Y11 = H26
Y12 = H6; Y13 = H22; Y14 = H14; Y15 = H30; Y16 = H1;
Y17 = H17; Y18 = H9; Y19 = H25; Y20 = H5; Y21 = H21;
Y22 = H13; Y23 = H29; Y24 = H3; Y25 = H19; Y26 = H11;
Y27 = H27; Y28 = H7; Y29 = H23; Y30 = H15; Y31 = H31
또 다른 예로서 N이 64인 경우, 64x64 크기의 블록의 1차원 이산 코사인 변환에 이용되는 64x64 변환 행렬(Original_A)을 구성하는 원소들의 cos(πx(i/2)/64)(i는 0부터 63까지의 정수)인 성분을 유리수인 64개의 ai 변수들로 치환하여 치환된 64x64 변환 행렬(A)을 생성하고, 치환된 64x64 변환 행렬(A)과 치환된 64x64 변환 행렬의 전치 행렬(transpose)(AT)의 곱셈 행렬(AxAT)을 획득하고, 곱셈 행렬(AxAT)의 원소들 중 대각 성분을 제외한 나머지 원소들의 제곱합이 최소가 되도록 하는 64개의 변수들(ai)을 최적화 알고리즘을 적용하여 획득한다.
N이 64인 경우, 최적화 알고리즘을 적용하면 64개의 변수들 ai는 다음의 값들; a1 =1024/1024, a2 = 1023/1024, a3 = 1021/1024, a4 = 1019/1024, a5 = 1016/1024, a6 = 1013/1024, a7 = 1009/1024, a8 = 1004/1024, a9 = 999 /1024, a10 =993 /1024, a11 =987 /1024, a12 =980 /1024, a13 =972 /1024, a14 =964 /1024, a15 =955 /1024, a16 =946 /1024, a17 =936 /1024, a18 =926 /1024, a19 =915 /1024, a20 =903 /1024, a21 =891 /1024, a22 =878 /1024, a23 =865 /1024, a24 =851 /1024, a25 =837 /1024, a26 =822 /1024, a27 =807 /1024, a28 =792 /1024, a29 =775 /1024, a30 =759 /1024, a31 =742 /1024, a32 =724 /1024, a33 =706 /1024, a34 =688 /1024, a35 =669 /1024, a36 =650 /1024, a37 =630 /1024, a38 =610 /1024, a39 =590 /1024, a40 =569 /1024, a41 =548 /1024, a42 =526 /1024, a43 =505 /1024, a44 =483 /1024, a45 =460 /1024, a46 =438 /1024, a47 =415 /1024, a48 =392 /1024, a49 =369 /1024, a50 =345 /1024, a51 =321 /1024, a52 =297 /1024, a53 =273 /1024, a54 =249 /1024, a55 =224 /1024, a56 =200 /1024, a57 =175 /1024, a58 =150/1024, a59 =125 /1024, a60 =100 /1024, a61 =75 /1024, a62 =50/1024 및 a63 =25/1024 을 갖을 수 있다.
다음 획득된 64개의 변수들(ai)에 기초한 값들로 치환된 64x64 변환 행렬(A)을 이용하여 64x64 크기의 블록을 변환한다.
전술한 N이 64인 경우, 즉 64x64 입력 블록에 대하여 치환된 64x64 변환 행렬(A)를 이용한 1차원 이산 코사인 변환을 수행하는 단계는 X0 내지 X63은 변환되어야 할 입력값, A0내지 B63, B0 내지 B63, C0 내지 C63, D0 내지 D63, E0 내지 E63, F0 내지 F63, G0 내지 G63, H0 내지 H63, I0내지 I63, O0내지 O63은 중간값, Y0 내지 Y63은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
O0 = X0+X63; O63 = X0-X63; O1 = X1+X62; O62 = X1-X62; O2 = X2+X61; O61 = X2-X61; O3 = X3+X60; O60 = X3-X60; O4 = X4+X59; O59 = X4-X59; O5 = X5+X58; O58 = X5-X58; O6 = X6+X57; O57 = X6-X57; O7 = X7+X56; O56 = X7-X56; O8 = X8+X55; O55 = X8-X55; O9 = X9+X54; O54 = X9-X54; O10 = X10+X53; O53 = X10-X53; O11 = X11+X52; O52 = X11-X52; O12 = X12+X51; O51 = X12-X51; O13 = X13+X50; O50 = X13-X50; O14 = X14+X49; O49 = X14-X49; O15 = X15+X48; O48 = X15-X48; O16 = X16+X47; O47 = X16-X47; O17 = X17+X46; O46 = X17-X46; O18 = X18+X45; O45 = X18-X45; O19 = X19+X44; O44 = X19-X44; O20 = X20+X43; O43 = X20-X43; O21 = X21+X42; O42 = X21-X42; O22 = X22+X41; O41 = X22-X41; O23 = X23+X40; O40 = X23-X40; O24 = X24+X39; O39 = X24-X39; O25 = X25+X38; O38 = X25-X38; O26 = X26+X37; O37 = X26-X37; O27 = X27+X36; O36 = X27-X36; O28 = X28+X35; O35 = X28-X35; O29 = X29+X34; O34 = X29-X34; O30 = X30+X33; O33 = X30-X33; O31 = X31+X32; O32 = X31-X32; ; A0 = O0+O31; A31 = O0-O31; A1 = O1+O30; A30 = O1-O30; A2 = O2+O29; A29 = O2-O29; A3 = O3+O28; A28 = O3-O28; A4 = O4+O27; A27 = O4-O27; A5 = O5+O26; A26 = O5-O26; A6 = O6+O25; A25 = O6-O25; A7 = O7+O24; A24 = O7-O24; A8 = O8+O23; A23 = O8-O23; A9 = O9+O22; A22 = O9-O22; A10 = O10+O21; A21 = O10-O21; A11 = O11+O20; A20 = O11-O20; A12 = O12+O19; A19 = O12-O19; A13 = O13+O18; A18 = O13-O18; A14 = O14+O17; A17 = O14-O17; A15 = O15+O16; A16 = O15-O16; A32 = O32; A56 = O56; A40 = (724*(O55-O40))>>10; A55 = (724*(O55+O40))>>10; A33 = O33; A57 = O57; A41 = (724*(O54-O41))>>10; A54 = (724*(O54+O41))>>10; A34 = O34; A58 = O58; A42 = (724*(O53-O42))>>10; A53 = (724*(O53+O42))>>10; A35 = O35; A59 = O59; A43 = (724*(O52-O43))>>10; A52 = (724*(O52+O43))>>10; A36 = O36; A60 = O60; A44 = (724*(O51-O44))>>10; A51 = (724*(O51+O44))>>10; A37 = O37; A61 = O61; A45 = (724*(O50-O45))>>10; A50 = (724*(O50+O45))>>10; A38 = O38; A62 = O62; A46 = (724*(O49-O46))>>10; A49 = (724*(O49+O46))>>10; A39 = O39; A63 = O63; A47 = (724*(O48-O47))>>10; A48 = (724*(O48+O47))>>10; B0 = A0+A15; B15 = A0-A15; B1 = A1+A14; B14 = A1-A14; B2 = A2+A13; B13 = A2-A13; B3 = A3+A12; B12 = A3-A12; B4 = A4+A11; B11 = A4-A11; B5 = A5+A10; B10 = A5-A10; B6 = A6+A9; B9 = A6-A9; B7 = A7+A8; B8 = A7-A8; B16 = A16; B28 = A28; B20 = (724*(A27-A20))>>10; B27 = (724*(A27+A20))>>10; B17 = A17; B29 = A29; B21 = (724*(A26-A21))>>10; B26 = (724*(A26+A21))>>10; B18 = A18; B30 = A30; B22 = (724*(A25-A22))>>10; B25 = (724*(A25+A22))>>10; B19 = A19; B31 = A31; B23 = (724*(A24-A23))>>10; B24 = (724*(A24+A23))>>10; B32 = A32+A47; B47 = A32-A47; B48 = A63-A48; B63 = A63+A48; B33 = A33+A46; B46 = A33-A46; B49 = A62-A49; B62 = A62+A49; B34 = A34+A45; B45 = A34-A45; B50 = A61-A50; B61 = A61+A50; B35 = A35+A44; B44 = A35-A44; B51 = A60-A51; B60 = A60+A51; B36 = A36+A43; B43 = A36-A43; B52 = A59-A52; B59 = A59+A52; B37 = A37+A42; B42 = A37-A42; B53 = A58-A53; B58 = A58+A53; B38 = A38+A41; B41 = A38-A41; B54 = A57-A54; B57 = A57+A54; B39 = A39+A40; B40 = A39-A40; B55 = A56-A55; B56 = A56+A55; C0 = B0+B7; C7 = B0-B7; C1 = B1+B6; C6 = B1-B6; C2 = B2+B5; C5 = B2-B5; C3 = B3+B4; C4 = B3-B4; C8 = B8; C14 = B14; C10 = (724*(B13-B10))>>10 ; C13 = (724*(B13+B10))>>10; C9 = B9; C15 = B15; C11 = (724*(B12-B11))>>10; C12 = (724*(B12+B11))>>10; C16 = B16+B23; C23 = B16-B23; C24 = B31-B24; C31 = B31+B24; C17 = B17+B22; C22 = B17-B22; C25 = B30-B25; C30 = B30+B25; C18 = B18+B21; C21 = B18-B21; C26 = B29-B26; C29 = B29+B26; C19 = B19+B20; C20 = B19-B20; C27 = B28-B27; C28 = B28+B27; C32 = B32; C36 = (392*B59-946*B36)>>10; C40 = (-946*B55-392*B40)>>10; C44 = B44; C48 = B48; ;C52 = (-946*B43+392*B52)>>10; C56 = (392*B39+946*B56)>>10; C60 = B60; C33 = B33; C37 = (392*B58-946*B37)>>10; C41 = (-946*B54-392*B41)>>10; C45 = B45; C49 = B49; C53 = (-946*B42+392*B53)>>10; C57 = (392*B38+946*B57)>>10; C61 = B61; C34 = B34; C38 = (392*B57-946*B38)>>10; C42 = (-946*B53-392*B42)>>10; C46 = B46; C50 = B50; C54 = (-946*B41+392*B54)>>10; C58 = (392*B37+946*B58)>>10; C62 = B62; C35 = B35; C39 = (392*B56-946*B39)>>10; C43 = (-946*B52-392*B43)>>10; C47 = B47; C51 = B51; C55 = (-946*B40+392*B55)>>10; C59 = (392*B36+946*B59)>>10; C63 = B63; D0 = C0+C3; D3 = C0-C3; D8 = C8+C11; D11 = C8-C11; D12 = C15-C12; D15 = C15+C12; D1 = C1+C2; D2 = C1-C2; D9 = C9+C10; D10 = C9-C10; D13 = C14-C13; D14 = C14+C13; D4 = C4; D5 = (724*(C6-C5))>>10; D6 = (724*(C6+C5))>>10; D7 = C7; D16 = C16; D18 = (392*C29-946*C18)>>10; D20 = (-946*C27-392*C20)>>10; D22 = C22; D24 = C24; D26 = (-946*C21+392*C26)>>10; D28 = (392*C19+946*C28)>>10; D30 = C30; D17 = C17; D19 = (392*C28-946*C19)>>10; D21 = (-946*C26-392*C21)>>10; D23 = C23; D25 = C25; D27 = (-946*C20+392*C27)>>10; D29 = (392*C18+946*C29)>>10; D31 = C31; D32 = C32+C39; D39 = C32-C39; D40 = C47-C40; D47 = C47+C40; D48 = C48+C55; D55 = C48-C55; D56 = C63-C56; D63 = C63+C56; D33 = C33+C38; D38 = C33-C38; D41 = C46-C41; D46 = C46+C41; D49 = C49+C54; D54 = C49-C54; D57 = C62-C57; D62 = C62+C57; D34 = C34+C37; D37 = C34-C37; D42 = C45-C42; D45 = C45+C42; D50 = C50+C53; D53 = C50-C53; D58 = C61-C58; D61 = C61+C58; D35 = C35+C36; D36 = C35-C36; D43 = C44-C43; D44 = C44+C43; D51 = C51+C52; D52 = C51-C52; D59 = C60-C59; D60 = C60+C59; E0 = (724*(D0+D1))>>10; E1 = (724*(D0-D1))>>10; E2 = (946*D3+392*D2)>>10; E3 = (392*D3-946*D2)>>10; E4 = D4+D5; E5 = D4-D5; E6 = D7-D6; E7 = D7+D6; E8 = D8; E9 = (392*D14-946*D9)>>10; E10 = (-946*D13-392*D10)>>10; E11 = D11; E12 = D12; E13 = (392*D13-946*D10)>>10; E14 = (946*D14+392*D9)>>10; E15 = D15; E16 = D16+D19; E19 = D16-D19; E20 = D23-D20; E23 = D23+D20; E24 = D24+D27; E27 = D24-D2; E28 = D31-D28; E31 = D31+D28; E17 = D17+D18; E18 = D17-D18; E21 = D22-D21; E22 = D22+D21; E25 = D25+D26; E26 = D25-D26; E29 = D30-D29; E30 = D30+D29; E32 = D32; E33 = D33; E34 = (200*D61-1004*D34)>>10; E35 = (200*D60-1004*D35)>>10; E36 = (-1004*D59-200*D36)>>10; E37 = (-1004*D58-200*D37)>>10; E38 = D38; E39 = D39; E40 = D40; E41 = D41; E42 = (851*D53-569*D42)>>10; E43 = (851*D52-569*D43)>>10; E44 = (-569*D51-851*D44)>>10; E45 = (-569*D50-851*D45)>>10; E46 = D46; E47 = D47; E48 = D48; E49 = D49; E50 = (851*D50-569*D45)>>10; E51 = (851*D51-569*D44)>>10; E52 = (569*D52+851*D43)>>10; E53 = (569*D53+851*D42)>>10; E54 = D54; E55 = D55; E56 = D56; E57 = D57; E58 = (200*D58-1004*D37)>>10; E59 = (200*D59-1004*D36)>>10; E60 = (1004*D60+200*D35)>>10; E61 = (1004*D61+200*D34)>>10; E62 = D62; E63 = D63; F0 = E0; F1 = E1; F2 = E2; F3 = E3; F4 = (200*E4+1004*E7)>>10; F5 = (851*E5+569*E6)>>10; F6 = (851*E6-569*E5)>>10; F7 = (200*E7-1004*E4)>>10; F8 = E8+E9; F9 = E8-E9; F10 = E11-E10; F11 = E11+E10; F12 = E12+E13; F13 = E12-E13; F14 = E15-E14; F15 = E15+E14; F16 = E16; F17 = (200*E30-1004*E17)>>10; F18 = (-1004*E29-200*E18)>>10; F19 = E19; F20 = E20; F21 = (851*E26-569*E21)>>10; F22 = (-569*E25-851*E22)>>10; F23 = E23; F24 = E24; F25 = (851*E25-569*E22)>>10; F26 = (569*E26+851*E21)>>10; F27 = E27; F28 = E28; F29 = (200*E29-1004*E18)>>10; F30 = (1004*E30+200*E17)>>10; F31 = E31; F32 = E32+E35; F33 = E33+E34; F34 = E33-E34; F35 = E32-E35; F36 = E39-E36; F37 = E38-E37; F38 = E38+E37; F39 = E39+E36; F40 = E40+E43; F41 = E41+E42; F42 = E41-E42; F43 = E40-E43; F44 = E47-E44; F45 = E46-E45; F46 = E46+E45; F47 = E47+E44; F48 = E48+E51; F49 = E49+E50; F50 = E49-E50; F51 = E48-E51; F52 = E55-E52; F53 = E54-E53; F54 = E54+E53; F55 = E55+E52; F56 = E56+E59; F57 =; E57+E58; F58 = E57-E58; F59 = E56-E59; F60 = E63-E60; F61 = E62-E61; F62 = E62+E61; F63 = E63+E60; G0 = F0; G1 = F1; G2 = F2; G3 = F3; G4 = F4; G5 = F5; G6 = F6; G7 = F7; G8 = (100*F8+1019*F15)>>10; G9 = (792*F9+650*F14)>>10; G10 = (483*F10+903*F13)>>10; G11 = (980*F11+297*F12)>>10; G12 = (980*F12-297*F11)>>10; G13 = (483*F13-903*F10)>>10; G14 = (792*F14-650*F9)>>10; G15 = (100*F15-1019*F8)>>10; G16 = F16+F17; G17 = F16-F17; G18 = F19-F18; G19 = F19+F18; G20 = F20+F21; G21 = F20-F21 ; G22 = F23-F22; G23 = F23+F22; G24 = F24+F25; G25 = F24-F25; G26 = F27-F26; G27 = F27+F26; G28 = F28+F29; G29 = F28-F29; G30 = F31-F30; G31 = F31+F30; G32 = F32; G33 = (100*F62-1019*F33)>>10; G34 = (-1019*F61-100*F34)>>10; G35 = F35; G36 = F36; G37 = (792*F58-650*F37)>>10; G38 = (-650*F57-792*F38)>>10; G39 = F39; G40 = F40; G41 = (483*F54-903*F41)>>10; G42 = (-903*F53-483*F42)>>10; G43 = F43; G44 = F44; G45 = (980*F50-297*F45)>>10; G46 = (-297*F49-980*F46)>>10; G47 = F47; G48 = F48; G49 = (980*F49-297*F46)>>10; G50 = (297*F50+980*F45)>>10; G51 = F51; G52 = F52; G53 = (483*F53-903*F42)>>10; G54 = (903*F54+483*F41)>>10; G55 = F55; G56 = F56; G57 = (792*F57-650*F38)>>10; G58 = (650*F58+792*F37)>>10; G59 = F59; G60 = F60; G61 = (100*F61-1019*F34)>>10; G62 = (1019*F62+100*F33)>>10; G63 = F63; H0 = G0;H1 = G1;H2 = G2;H3 = G3;H4 = G4;H5 = G5;H6 = G6;H7 = G7;H8 = G8;H9 = G9;H10 = G10;H11 = G11;H12 = G12;H13 = G13;H14 = G14;H15 = G15;H16 = (50*G16+1023*G31)>>10;H17 = (759*G17+688*G30)>>10;H18 = (438*G18+926*G29)>>10;H19 = (964*G19+345*G28)>>10;H20 = (249*G20+993*G27)>>10;H21 = (878*G21+526*G26)>>10;H22 = (610*G22+822*G25)>>10;H23 = (1013*G23+150*G24)>>10;H24 = (1013*G24-150*G23)>>10;H25 = (610*G25-822*G22)>>10;H26 = (878*G26-526*G21)>>10;H27 = (249*G27-993*G20)>>10;H28 = (964*G28-345*G19)>>10;H29 = (438*G29-926*G18)>>10;H30 = (759*G30-688*G17)>>10;H31 = (50*G31-1023*G16)>>10;H32 = G32+G33;H33 = G32-G33;H34 = G35-G34;H35 = G35+G34;H36 = G36+G37;H37 = G36-G37;H38 = G39-G38;H39 = G39+G38;H40 = G40+G41;H41 = G40-G41;H42 = G43-G42;H43 = G43+G42;H44 = G44+G45;H45 = G44-G45;H46 = G47-G46;H47 = G47+G46;H48 = G48+G49;H49 = G48-G49;H50 = G51-G50;H51 = G51+G50;H52 = G52+G53;H53 = G52-G53;H54 = G55-G54;H55 = G55+G54;H56 = G56+G57;H57 = G56-G57;H58 = G59-G58;H59 = G59+G58;H60 = G60+G61;H61 = G60-G61;H62 = G63-G62;H63 = G63+G62;;I0 = H0;I1 = H1;I2 = H2;I3 = H3;I4 = H4;I5 = H5;I6 = H6;I7 = H7;I8 = H8;I9 = H9;I10 = H10;I11 = H11;I12 = H12;I13 = H13;I14 = H14;I15 = H15;I16 = H16;I17 = H17;I18 = H18;I19 = H19;I20 = H20;I21 = H21;I22 = H22;I23 = H23;I24 = H24;I25 = H25;I26 = H26;I27 = H27;I28 = H28;I29 = H29;I30 = H30;I31 = H31;I32 = (25*H32+1024*H63)>>10;I33 = (742*H33+706*H62)>>10;I34 = (415*H34+936*H61)>>10;I35 = (955*H35+369*H60)>>10;I36 = (224*H36+999*H59)>>10;I37 = (865*H37+548*H58)>>10;I38 = (590*H38+837*H57)>>10;I39 = (1009*H39+175*H56)>>10;I40 = (125*H40+1016*H55)>>10;I41 = (807*H41+630*H54)>>10;I42 = (505*H42+891*H53)>>10;I43 = (987*H43+273*H52)>>10;I44 = (321*H44+972*H51)>>10;I45 = (915*H45+460*H50)>>10;I46 = (669*H46+775*H49)>>10;I47 = (1021*H47+75*H48)>>10;I48 = (1021*H48-75*H47)>>10;I49 = (669*H49-775*H46)>>10;I50 = (915*H50-460*H45)>>10;I51 = (321*H51-972*H44)>>10;I52 = (987*H52-273*H43)>>10;I53 = (505*H53-891*H42)>>10;I54 = (807*H54-630*H41)>>10;I55 = (125*H55-1016*H40)>>10;I56 = (1009*H56-175*H39)>>10;I57 = (590*H57-837*H38)>>10;I58 = (865*H58-548*H37)>>10;I59 = (224*H59-999*H36)>>10;I60 = (955*H60-369*H35)>>10;I61 = (415*H61-936*H34)>>10;I62 = (742*H62-706*H33)>>10;I63 = (25*H63-1024*H32)>>10;;Y0 = I0;Y1 = I32;Y2 = I16;Y3 = I48;Y4 = I8;Y5 = I40;Y6 = I24;Y7 = I56;Y8 = I4;Y9 = I36;Y10 = I20;Y11 = I52;Y12 = I12;Y13 = I44;Y14 = I28;Y15 = I60;Y16 = I2;Y17 = I34;Y18 = I18;Y19 = I50;Y20 = I10;Y21 = I42;Y22 = I26;Y23 = I58;Y24 = I6;Y25 = I38;Y26 = I22;Y27 = I54;Y28 = I14;Y29 = I46;Y30 = I30;Y31 = I62;Y32 = I1;Y33 = I33;Y34 = I17;Y35 = I49;Y36 = I9;Y37 = I41;Y38 = I25;Y39 = I57;Y40 = I5;Y41 = I37;Y42 = I21;Y43 = I53;Y44 = I13;Y45 = I45;Y46 = I29;Y47 = I61;Y48 = I3;Y49 = I35;Y50 = I19;Y51 = I51;Y52 = I11;Y53 = I43;Y54 = I27;Y55 = I59;Y56 = I7;Y57 = I39;Y58 = I23;Y59 = I55;Y60 = I15;Y61 = I47;Y62 = I31;Y63 = I63
다시 도 3을 참조하면, 단계 350에서 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬(Original_A)과 치환된 NxN 변환 행렬(A) 사이의 차이값을 보정하기 위한 스케일링 행렬 및 시프트 연산을 적용하여 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행한다.
전술한 바와 같이, 본 발명의 일 실시예에 따르면 원래의 NxN 변환 행렬(Original_A)에 포함된 cosθ, sinθ 성분들을 유리수인 변수 ai로 치환하였기 때문에 원래의 NxN 변환 행렬(Original_A)과 치환된 변환 행렬(A)에 의한 결과값은 오차가 발생한다. 따라서, 본 발명의 일 실시예에 따르면 양자화 단계에서 양자화와 함께 수행되는 스케일링 단계에서 스케일링 행렬을 적용하여 이러한 오차를 최소화한다.
도 5는 본 발명의 일 실시예에 따른 양자화 과정을 나타낸 플로우 차트이다.
도 5를 참조하면, 단계 510에서 각 i번째 행의 원소가 Si(i는 1부터 N까지의 정수)의 값을 갖는 NxN 크기의 중간 행렬(S)의 각 원소와 치환된 NxN 크기의 변환 행렬(A)의 동일 위치의 원소들을 각각 곱한 값(SⓧA)과, 원래의 NxN 변환 행렬(Original_A) 사이의 차이인 변환 오차 행렬(Original_A-SⓧA )을 획득한다. ⓧ는 원소 단위 곱셈(element-by-element multiplication, element-wise multiplication) 연산을 나타내는 것으로, 행렬의 동일 위치의 원소가 곱해진다.
예를 들어, 16x16 크기의 중간 행렬(S)는 다음과 같다.
Figure pat00001
단계 520에서 변환 오차 행렬(Original_A-SⓧA)의 대각 성분을 제외한 나머지 원소들의 제곱합이 최소가 되도록 하는 Si 값들을 획득한다. Si 값들은 다양한 최적화 알고리즘을 이용하여 결정될 수 있다. 일 예로 S1의 초기값을 (1/4*2^(1/2))로 하고 Nelder-Mead Sipmlex 방법과 같은 최적화 알고리즘을 적용하여 Si값들을 결정할 수 있다.
단계 530에서 획득된 Si값들을 적용한 NxN 크기의 중간 행렬(S)의 각 원소와 중간 행렬(S)의 전치 행렬(ST)의 동일 위치의 원소들을 각각 곱한 행렬(SⓧST)에 기초하여 스케일링 행렬을 생성한다.
중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 곱한 행렬(SⓧST)을 PF라고 하면, 스케일링 행렬(MF)는 다음의 수학식; MF=PF*2^m/Qstep 과 같이 계산될 수 있다. 여기서, Qstep은 양자화 스텝, m은 양의 정수이다.
단계 540에서, 스케일링 행렬(MF) 및 시프트 연산을 적용하여 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행한다. 구체적으로 양자화는 스케일링 행렬(MF)와 NxN 크기의 블록을 변환한 변환 블록을 곱한 값에 소정의 오프셋을 더한 값을 다음의 수학식; q=floor(QP/6)+m 의 q 비트만큼 비트 시프트 연산함으로써 수행된다. Zij를 양자화된 계수값, Wij를 변환 계수, f를 오프셋이라고 하면,
Figure pat00002
이고,
Figure pat00003
이다. 여기서, '.MF'는 행렬의 동일 위치의 원소를 곱하는 벡터곱 연산을 의미한다. 전술한 바와 같이, 벡터곱 연산은 ⓧ와 같이 표현될 수도 있다.
도 7은 본 발명의 일 실시예에 따라서 16x16 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다. 도 7에서는 스케일링 행렬 계산시 m=10인 경우이다.
도 7에 도시된 바와 같은 스케일링 행렬은 모든 양자화 스텝에 대하여 정의될 필요없이 처음의 6단계의 Qstep 값인 (0.625, 0.6875, 0.8125, 0.875, 1, 1.25)에 대해서 정의된다. 왜냐하면 양자화 파라메터(QP)가 6 증가하면 양자화 스텝(Qstep)이 2배로 증가하기 때문에, 스케일링 행렬(MF)는 처음의 6단계의 Qstep 값에 대해서 정의되고, 나머지 QP에 따른 스케일링 행렬(MF)는 (QP mod 6) 값에 따라서 선택될 수 있다.
이와 같은 스케일링 행렬(MF)는 32x32 블록이나 64x64 블록에 대해서도 전술한 16x16 블록에 대한 스케일링 행렬을 구하는 과정과 유사한 과정을 통해 획득될 수 있다. 도 9 내지 도 14는 이와 같은 과정을 통해 획득된 32x32 블록에 적용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다. 64x64 블록에 적용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)는 다음과 같이 정의될 수 있다.
< 64x64 입력 블록에 대한 스케일링 행렬(MF)의 예>
m = 11 일 때, Q0 = 102*ONES / Q1 = 93*ONES / Q2 = 79*ONES / Q3 = 73*ONES / Q4 = 64*ONES / Q5 = 57*ONES
m = 10 일 때, Q0 = 51*ONES / Q1 = 47*ONES / Q2 = 39*ONES /
Q3 = 37*ONES / Q4 = 32*ONES / Q5 = 28*ONES
m = 9일 때, Q0 = 26*ONES / Q1 = 23*ONES / Q2 = 20*ONES /
Q3 = 18*ONES / Q4 = 16*ONES / Q5 = 14*ONES
상기 예에서 Q#의 #값은 (QP mod 6)이며, ONES는 모든 원소가 1인 64x64 행렬을 나타낸다.
한편, 역양자화 단계에서는 이산 코사인 역변환에 이용되는 원래의 NxN 역변환 행렬과 치환된 NxN 변환 행렬의 역행렬인 NxN 역변환 행렬 사이의 차이값을 보정하기 위한 역스케일링 행렬 및 시프트 연산을 적용하여 역양자화를 수행한다.
본 발명의 일 실시예에 따르면, 역스케일링 행렬(V)는 전술한 스케일링 행렬(MF)의 생성시에도 이용되는 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 각각 곱한 행렬(SⓧST)인 PF에 기초하여 생성될 수 있다. 구체적으로, 양자화 스텝을 Qstep, 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)동일 위치의 원소들을 각각 곱한 행렬을 PF, n은 양의 정수라고 할 때, 역스케일링 행렬(V)은 다음의 수학식; V=Qstep*PF*2^n 을 통해 획득된다.
전술한 바와 같이 역스케일링 행렬(V)가 결정되면, 역양자화는 역스케일링 행렬(V)와 양자화된 변환 계수를 곱한 값에 대해서 floor(QP/6)(floor[x]는 x보다 작거나 같은 최대 정수, QP는 양자화 파라메터) 비트만큼 비트 시프트 연산을 통해 수행될 수 있다. 즉, Zij를 양자화된 계수값, Wij를 변환 계수라고 하면 다음의 수학식; Wij=(Zij)<<floor(QP/6)을 통해 양자화된 계수 Zij를 역양자화한 Wij를 획득할 수 있다.
도 8은 본 발명의 일 실시예에 따라서 16x16 블록에 적용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다. 도 8에서는 역스케일링 행렬 계산시 m=10인 경우를 나타낸다. 역스케일링 행렬(V) 역시 도 7의 스케일링 행렬과 같이 모든 양자화 스텝에 대하여 정의될 필요는 없고, 처음의 6단계의 Qstep 값인 (0.625, 0.6875, 0.8125, 0.875, 1, 1.25)에 대해서 정의될 수 있다. 나머지 QP에 따른 역스케일링 행렬(V)는 (QP mod 6) 값에 따라서 선택될 수 있다.
유사하게, 32x32 입력 블록 및 64x64 블록에 적용되는 양자화 파라메터에 따른 역스케일링 행렬(V)도 전술한 16x16 블록에 적용되는 역스케일링 행렬(V) 계산 과정과 유사한 과정을 통해 획득될 수 있다. 도 94a 내지 도 94f는 본 발명의 일 실시예에 따라서 32x32 블록에 적용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예를 도시한다.
64x64 블록에 적용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)는 다음과 같이 정의될 수 있다.
< 64x64 입력 블록에 대한 역스케일링 행렬(V)의 예>
n = 11 일 때, Q0 = 40*ONES / Q1 = 44*ONES / Q2 = 52*ONES / Q3 = 56*ONES / Q4 = 64*ONES / Q5 = 72*ONES
n = 10 일 때, Q0 = 20*ONES / Q1 = 22*ONES / Q2 = 26*ONES /
Q3 = 28*ONES / Q4 = 32*ONES / Q5 = 36*ONES
n = 9일 때, Q0 = 10*ONES / Q1 = 11*ONES / Q2 = 13*ONES /
Q3 = 14*ONES / Q4 = 16*ONES / Q5 = 18*ONES
상기 예에서 Q#의 #값은 (QP mod 6)의 값이며, ONES는 모든 원소가 1인 64x64 행렬을 나타낸다.
도 6은 본 발명의 다른 실시예에 따른 양자화 과정을 나타낸 플로우 차트이다. 도 6의 본 발명의 다른 실시예에 따른 양자화 과정은 도 5의 본 발명의 일 실시예에 따른 양자화 과정과 비교할 때, 스케일링 행렬 생성에 이용되는 중간 행렬(S) 생성 과정에 있어서 차이가 나고, 나머지 과정은 전술한 도 5의 본 발명의 일 실시예에 따른 양자화 과정과 유사하다.
구체적으로, 도 6을 참조하면, 단계 610에서 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬(Original_A)의 각 원소를 치환된 NxN 변환 행렬(A)의 동일 위치의 원소들로 나눔으로써 중간 행렬(S) 획득한다.
단계 620에서, 단계 610에서 생성된 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소들을 각각 곱한 행렬(SⓧST)에 기초하여 스케일링 행렬을 생성한다. 구체적으로, 중간 행렬(S)과 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소들을 각각 곱한 행렬(SⓧST)을 PF라고 하면, 스케일링 행렬(MF)는 다음의 수학식; MF=PF*2^m/Qstep 과 같이 계산될 수 있다. 여기서, Qstep은 양자화 스텝, m은 양의 정수이다.
단계 630에서, 스케일링 행렬(MF) 및 시프트 연산을 적용하여 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행한다. 구체적으로 양자화는 스케일링 행렬(MF)와 NxN 크기의 블록을 변환한 변환 블록을 곱한 값에 소정의 오프셋을 더한 값에 대해서 다음의 수학식; q=floor(QP/6)+m 의 q 비트만큼 비트 시프트 연산을 통해 수행된다. Zij를 양자화된 계수값, Wij를 변환 계수, f를 오프셋이라고 하면,
Figure pat00004
이고,
Figure pat00005
이다. 여기서, '.MF'는 행렬의 동일 위치의 원소를 곱하는 벡터곱 연산을 의미한다.
도 15는 본 발명의 다른 실시예에 따른 32 포인트 이산 코사인 변환의 흐름도(flow graph)를 도시한다.
도 15를 참조하면, x0 내지 x31은 입력값들을 나타낸다. y0 내지 y31은 이산 코사인 변환의 출력값들을 나타낸다. 변환시에 데이터 처리 방향은 좌측에서 우측이며, 역변환시에 데이터 처리 방향은 우측에서 좌측이다. 점에서 교차하는 2개의 라인은 2개의 수의 덧셈을 나타낸다. '-'는 부정(negation)을 나타낸다. 각 라인 위의 값 R(θ)는 도 16에 도시된 바와 같은 버터플라이 구조에 기초한 연산 과정을 나타낸다.
도 16은 도 15의 32 포인트 이산 코사인 변환을 구성하는 버터플라이 구조의 연산 과정을 나타낸 참조도이다.
도 16을 참조하면, 버터 플라이 구조의 연산은 입력값 [X1,X2]에 대해서 다음의 수학식;
Figure pat00006
과 같은 연산을 통해 출력값 [Y1, Y2]를 출력하는 것이다. 이러한 버터 플라이 구조의 연산 과정은 2개의 입력값을 2개의 출력값에 매핑시키는 과정에서 총 4개의 곱셈 연산과 2개의 덧셈 연산을 하게 된다.
일반적으로 곱셈 연산은 덧셈, 뺄셈 및 쉬프트 연산에 비하여 연산이 복잡하고 연산 시간 역시 많이 소요되므로 전체적인 연산을 느리게 한다. 따라서, 본 발명의 다른 실시예에 따른 영상 변환 방법에서는 버터 플라이 구조에 기초한 4개의 곱셈 연산과 2개의 덧셈 연산 과정을 3개의 곱셈 연산과 3개의 덧셈 연산 과정으로 대체한 변경된 버터플라이 구조에 기초하여 영상 변환을 수행한다.
도 17은 본 발명의 다른 실시예에 따른 영상 변환 방법을 나타낸 플로우 차트이다. 도 17을 참조하면, 단계 1710에서 버터플라이 구조의 곱셈 인수 중 삼각 함수 성분을 유리수로 치환한다. 전술한 바와 같이 도 15에 도시된 바와 같은 32 포인트 이산 코사인 변환의 계산에는 R(θ)에 따라서, cosθ 및 sinθ가 이용된다. 본 발명의 다른 실시예에서는 상기 θ값에 따른 cosθ 및 sinθ 값으로서 다음과 같은 근사화된 유리수를 이용할 수 있다. 하기 기재된 바와 같이 근사화되는 유리수는 분모가 2의 거듭제곱꼴인 유리수(dyadic rational)를 이용하는 것이 바람직하다.
cos(pi/64) = 255/256;sin(pi/64) = 3/64;cos(pi*5/64) = 31/32;sin(pi*5/64) = 31/128;cos(pi*9/64) = 231/256 ;sin(pi*9/64) = 109/256;cos(pi*13/64) = 205/256;sin(pi*13/64) = 19/32;cos(pi*17/64) = 171/256;sin(pi*17/64) = 189/256;cos(pi*21/64) = 131/256;sin(pi*21/64) = 219/256 ;cos(pi*25/64) = 43/128 ;sin(pi*25/64) = 241/256;cos(pi*29/64) = 37/256;sin(pi*29/64) = 253/256;cos(pi*3/32) = 61/64;sin(pi*3/32) = 37/128;cos(pi*7/32) = 197/256;sin(pi*7/32) = 81/128;cos(pi*11/32) = 15/32;sin(pi*11/32) = 225/256;cos(pi*15/32) = 25/256;sin(pi*15/32) = 127/128;cos(pi/16) = 251/256;sin(pi/16) = 49/256;cos(pi*3/16) = 53/64 ;sin(pi*3/16) = 71/128;cos(pi*5/16) = 71/128;sin(pi*5/16) = 53/64;cos(pi*7/16) = 49/256;sin(pi*7/16) = 251/256;cos(pi/8) = 59/64;sin(pi/8) = 97/256;cos(pi*3/8) = 97/256;sin(pi*3/8) = 59/64;cos(pi/4) = 181/256;sin(pi/4) = 181/256;
단계 1720에서, 버터플라이 구조의 4개의 곱셈 연산과 2개의 덧셈 연산 과정을 3개의 곱셈 연산과 3개의 덧셈 연산 과정으로 대체한 변경된 버터플라이 구조에 기초하여 NxN 크기(N은 정수)의 블록의 행 단위 및 열 단위 중 어느 하나에 대한 1차원 이산 코사인 변환을 수행한다.
도 18은 본 발명의 일 실시예에 따른 변경된 버터플라이 구조를 나타낸 도면이다. 도 18을 참조하면, 좌측에 도시된 바와 같은 버터플라이 구조(1810)의 연산에 의한 입력값 X1, X2에 대한 결과값 Y1, Y2는 다음의 수학식과 같다.
Y1=a*X1+b*X2; Y2=b*X1-a*X2
도 18의 좌측에 도시된 바와 같은 버터플라이 구조(1810)의 연산에서는 결과값 Y1, Y2를 얻기 위해서 총 4번의 곱셈 연산과 2번의 덧셈 또는 뺄셈 연산이 필요하다. 우측에 도시된 변경된 버터플라이 구조(1820)의 연산에 의한 입력값 X1, X2에 대한 결과값 Y1, Y2는 다음의 수학식과 같다.
Y1=X1*(a-b)+b*(X1+X2)=a*X1+b*X2;
Y2=b*(X1+X2)-X2*(a+b)=b*X1-a*X2
우측에 도시된 변경된 버터플라이 구조(1820)의 연산 과정에서는 b*(X1+X2)의 계산에서 1번의 곱셈 연산이 수행되고 그 결과값이 Y1과 Y2의 계산에 모두 이용되므로 총 3번의 곱셈 연산과 3번의 덧셈 또는 뺄셈 연산이 필요하다. 따라서, 변경된 버터플라이 구조(1820)을 통해서 동일한 결과값을 가지면서도 복잡한 곱셈 연산 과정을 줄임으로써 연산 속도를 향상시킬 수 있다. 한편, 도 18의 우측에 도시된 바와 같은 변경된 버터플라이 구조(1820)를 도 15의 32 포인트 이산 코사인 변환에 적용할 때, sine과 cosine의 선형 조합값이 필요한 연산이 있다. 이 경우, 다음과 같은 근사화된 유리값을 이용하는 것이 바람직하다.
cos(pi*30/64) = 25/256;cos(pi*30/64)+sin(pi*30/64) = 279/256;cos(pi*30/64)-sin(pi*30/64) = -229/256;cos(pi*12/64) = 53/64;cos(pi*12/64)+sin(pi*12/64) = 355/256;cos(pi*12/64)-sin(pi*12/64) = 35/128;cos(pi*4/64) = 251/256;cos(pi*4/64)+sin(pi*4/64) = 301/256;cos(pi*4/64)-sin(pi*4/64) = 201/256;cos(pi*24/64) = 97/256;cos(pi*24/64)+sin(pi*24/64) = 167/128;cos(pi*24/64)-sin(pi*24/64) = -69/128;cos(pi*8/64) = 59/64;cos(pi*8/64)+sin(pi*8/64) = 167/128;cos(pi*8/64)-sin(pi*8/64) = 69/128; ;cos(pi*28/64) = 49/256;cos(pi*28/64)+sin(pi*28/64) = 301/256;cos(pi*28/64)-sin(pi*28/64) = -201/256;cos(pi*20/64) = 71/128;cos(pi*20/64)+sin(pi*20/64) = 355/256;cos(pi*20/64)-sin(pi*20/64) = -35/128;
도 19는 본 발명의 다른 실시예에 따른 변경된 버터플라이 구조를 나타낸 도면이다. 도 19를 참조하면, 좌측에 도시된 바와 같은 버터플라이 구조(1910)의 연산에 의한 입력값 X1, X2에 대한 결과값 Y1, Y2는 다음의 수학식과 같다.
Y1=cosθ*X1+sinθ*X2; Y2=-sinθ*X1+cosθ*X2
도 19의 좌측에 도시된 바와 같은 버터플라이 구조(1910)의 연산에서는 결과값 Y1, Y2를 얻기 위해서 총 4번의 곱셈 연산과 2번의 덧셈 또는 뺄셈 연산이 필요하다.
우측에 도시된 변경된 버터플라이 구조(1920)의 연산에 의한 입력값 X1, X2에 대한 결과값 Y1, Y2를 삼각함수 공식을 이용하여 정리하면, 우측에 도시된 변경된 버터플라이 구조(1920)는 좌측에 도시된 버터플라이 구조(1910)와 동일한 결과값을 출력한다. 우측에 도시된 변경된 버터플라이 구조(1920)의 연산 과정에서는 총 3번의 곱셈 연산과 3번의 덧셈 또는 뺄셈 연산이 필요하다. 따라서, 변경된 버터플라이 구조(1920)을 통해서 동일한 결과값을 가지면서도 복잡한 곱셈 연산 과정을 줄임으로써 연산 속도를 향상시킬 수 있다. 한편, 도 19의 우측에 도시된 바와 같은 변경된 버터플라이 구조를 도 15의 32 포인트 이산 코사인 변환에 적용할 때, sine과 cosine의 분수값 및 tangent 값이 필요한 연산이 있다. 이 경우, 다음과 같은 근사화된 유리값을 이용하는 것이 바람직하다.
(1-cos(pi*17/64))/sin(pi*17/64) = 113/256;(1-cos(pi*13/64))/sin(pi*13/64) = 21/64;(1-cos(pi*21/64))/sin(pi*21/64) = 145/256;(1-cos(pi*9/64))/sin(pi*9/64) = 57/256;(1-cos(pi*25/64))/sin(pi*25/64) = 45/64;(1-cos(pi*5/64))/sin(pi*5/64) = 31/256;(1-cos(pi*29/64))/sin(pi*29/64) = 55/64 ;(1-cos(pi*1/64))/sin(pi*1/64) = 3/128;(1-cos(pi*16/64))/sin(pi*16/64) = 53/128;tan(pi*8/64) = 53/128;sin(pi*8/64)*cos(pi*8/64) = 45/128;tan(pi*4/64) = 25/128 ;sin(pi*4/64)*cos(pi*4/64) = 3/16;tan(pi*12/64) = 171/256;sin(pi*12/64)*cos(pi*12/64) = 59/128 ;tan(pi*16/64) = 255/256;sin(pi*16/64)*cos(pi*16/64) = 1/2; ;(1-cos(pi*7/32))/sin(pi*7/32) = 91/256 ;sin(pi*7/32) = 81/128;(1-cos(pi*11/32))/sin(pi*11/32) = 153/256;sin(pi*11/32) = 225/256; ;(1-cos(pi*3/32))/sin(pi*3/32) = 37/256;sin(pi*3/32) = 37/128;;(1-cos(pi*15/32))/sin(pi*15/32) = 29/32;sin(pi*15/32) = 127/128;;(1-cos(pi*6/32))/sin(pi*6/32) = 77/256;sin(pi*6/32) = 71/128;;(1-cos(pi*2/32))/sin(pi*2/32) = 25/256;sin(pi*2/32) = 49/256; ;1/tan(pi*3/8) = 53/128 ;sin(pi*3/8)*cos(pi*3/8) = 45/128;
도 20은 본 발명의 또 다른 실시예에 따른 변경된 버터 플라이 구조를 나타낸 도면이다. 도 20을 참조하면, 좌측의 버터 플라이 구조(2010)는 동일한 결과값을 출력하는 우측의 버터 플라이 구조(2020)으로 변경될 수 있다. 본 발명의 또 다른 실시예에 따른 변경된 버터 플라이 구조(2020)에서는 최종 결과값인 Y1과 Y2가 획득되기 전에 도면 부호 2025로 표시된 바와 같이 각 연산 결과가 cosα 및 (1/(1-cosα))와 곱셈 연산이 수행된다. 이러한 도면 부호 2025로 표시된 곱셈 연산은 변환 과정에서 수행되지 않고, 양자화 과정에서 수행되는 스케일링 행렬에 반영될 수 있다. 다시 말해서, 도면 부호 2025에 표시된 곱셈 인자를 스케일링 행렬의 각 원소에 곱해줌으로써 변환 단계에서의 곱셈 연산을 감소시키고, 대신에 곱셈 연산을 양자화 과정에 통합시킬 수도 있다. 이와 같이, 도면 부호 2025에 표시된 곱셈 인자를 양자화 과정에 통합시키고 변환 단계에서 생략하는 경우, 도 20에 따른 버터 플라이 구조에서는 총 2회의 곱셈 및 2회의 덧셈 연산만으로 구성될 수 있다.
도 21은 본 발명의 또 다른 실시예에 따른 변경된 버터 플라이 구조를 나타낸 도면이다. 도 21에서는 버터 플라이 구조의 연산에서 변수에 해당하는 R(θ)의 θ가 특수한 값을 갖을 때, 예를 들어 도시된 바와 같이 θ=π/4일 때, 우측에 도시된 바와 같은 변경된 버터 플라이 구조(2120)에 의한 연산에 의해서도 좌측에 도시된 버터 플라이 구조(2110)에 의한 연산과 동일한 결과를 얻을 수 있는 것을 도시한다. 우측에 도시된 버터 플라이 구조(2120)에 의한 연산 과정에서는 좌측에 도시된 버터 플라이 구조(2110)에 비하여 전체 연산 횟수를 감소시킬 수 있다.
도 18의 우측에 도시된 바와 같은 변경된 버터 플라이 구조(1820)의 연산을 도 15의 버터 플라이 구조 각각에 적용하여 32 포인트 이산 코사인 변환을 수행하는 경우, X0 내지 X31는 변환되어야 할 입력값, A0 내지 A31, B0 내지 B31, C0 내지 C31, D0 내지 D31, E0 내지 E31, F0 내지 F31은 중간값, t는 보조 변수, Y0 내지 Y31은 변환된 값을 나타낸다고 할 때, 변환 결과 Y0 내지 Y31은 다음의 연산 과정을 통해 획득될 수 있다.
A0 = X0 + X31; A31 = X0 - X31; A1 = X1 + X30; A30 = X1 - X30; A2 = X2 + X29; A29 = X2 - X29; A3 = X3 + X28; A28 = X3 - X28; A4 = X4 + X27; A27 = X4 - X27; A5 = X5 + X26; A26 = X5 - X26; A6 = X6 + X25; A25 = X6 - X25; A7 = X7 + X24; A24 = X7 - X24; A8 = X8 + X23; A23 = X8 - X23; A9 = X9 + X22; A22 = X9 - X22; A10 = X10 + X21; A21 = X10 - X21; A11 = X11 + X20; A20 = X11 - X20; A12 = X12 + X19; A19 = X12 - X19; A13 = X13 + X18; A18 = X13 - X18; A14 = X14 + X17; A17 = X14 - X17; A15 = X15 + X16; A16 = X15 - X16;
B0 = A0 + A15; B15 = A0 - A15; B1 = A1 + A14; B14 = A1 - A14; B2 = A2 + A13; B13 = A2 - A13; B3 = A3 + A12; B12 = A3 - A12; B4 = A4 + A11; B11 = A4 - A11; B5 = A5 + A10; B10 = A5 - A10; B6 = A6 + A9; B9 = A6 - A9; B7 = A7 + A8; B8 = A7 - A8;
t = ((171*(A16 + A31) >> 8); B16 = t - ((361*A31) >> 8); B31 = t - ((-17*A16) >> 8);
t = ((205*(A17 + A30) >> 8); B17 = t - ((53*A30) >> 8); B30 = t - ((358*A17) >> 8);
t = ((131*(A18 + A29) >> 8); B18 = t - ((351*A29) >> 8); B29 = t - ((-87*A18) >> 8);
t = ((231*(A19 + A28) >> 8); B19 = t - ((121*A28) >> 8); B28 = t - ((340*A19) >> 8);
*t = ((86*(A20 + A27) >> 8); B20 = t - ((327*A27) >> 8); B27 = t - ((-77*A20) >> 8);
t = ((248*(A21 + A26) >> 8); B21 = t - ((186*A26) >> 8); B26 = t - ((310*A21) >> 8);
t = ((37*(A22 + A25) >> 8); B22 = t - ((290*A25) >> 8); B25 = t - ((-215*A22) >> 8);
t = ((255*(A23 + A24) >> 8); B23 = t - ((243*A24) >> 8); B24 = t - ((268*A23) >> 8);
C0 = B0 + B7; C7 = B0 - B7; C1 = B1 + B6; C6 = B1 - B6; C2 = B2 + B5; C5 = B2 - B5; C3 = B3 + B4; C4 = B3 - B4;
t = ((197*(B8 + B15) >> 8); C8 = t - ((35*B15) >> 8); C15 = t - ((360*B8) >> 8);
t = ((120*(B9 + B14) >> 8); C9 = t - ((346*B14) >> 8); C14 = t - ((-105*B9) >> 8);
t = ((244*(B10 + B13) >> 8); C10 = t - ((170*B13) >> 8); C13 = t - ((319*B10) >> 8);
t = ((25*(B11 + B12) >> 8); C11 = t - ((279*B12) >> 8); C12 = t - ((-229*B11) >> 8);
C16 = B16 + B23; C23 = B16 - B23; C17 = B17 + B22; C22 = B17 - B22; C18 = B18 + B21; C21 = B18 - B21; C19 = B19 + B20; C20 = B19 - B20; C24 = B24 + B31; C31 = B24 - B31; C25 = B25 + B30; C30 = B25 - B30; C26 = B26 + B29; C29 = B26 - B29; C27 = B27 + B28; C28 = B27 - B28;
D0 = C0 + C3; D3 = C0 - C3; D1 = C1 + C2; D2 = C1 - C2; t = ((49*(C4 + C7) >> 8); D4 = t - ((-201*C7) >> 8); D7 = t - ((301*C4) >> 8);
t = ((142*(C5 + C6) >> 8); D5 = t - ((-70*C6) >> 8); D6 = t - ((355*C5) >> 8); D8 = C8 + C11; D11 = C8 - C11; D9 = C9 + C10; D10 = C9 - C10; D12 = C12 + C15; D15 = C12 - C15; D13 = C13 + C14; D14 = C13 - C14; D16 = C16 + C28; D28 = C16 - C28; D17 = C17 + C29; D29 = C17 - C29; D18 = C18 + C30; D30 = C18 - C30; D19 = C19 + C31; D31 = C19 - C31; D20 = C20 + C23; D23 = C20 - C23; D21 = C21 + C22; D22 = C21 - C22; D24 = C24 + C27; D27 = C24 - C27; D25 = C25 + C26; D26 = C25 - C26;
E0 = ((D0 + D1)*181 >> 8); E1 = ((D0 - D1)*181 >> 8);
t = (97*(D2 + D3) >> 8); E2 = t - ((-138*D3) >> 8); E3 = t - ((334*D2) >> 8); E4 = D4 + D5; E5 = D4 - D5; E6 = -D6 + D7; E7 = D6 + D7; E8 = D8 + D14; E14 = D8 - D14; E9 = D9 + D15; E15 = D9 - D15; E10 = D10 + D11; E11 = D10 - D11; E12 = D12 + D13; E13 = D12 - D13; E16 = ((D16 + D19)*181 >> 8); E19 = ((D16 - D19)*181 >> 8); E20 = D20 + D26; E26 = D20 - D26; E21 = D21 + D27; E27 = D21 - D27; E22 = D22 + D23; E23 = D22 - D23; E24 = D24 + D25; E25 = D24 - D25; E28 = ((D28 + D31)*181 >> 8); E31 = ((D28 - D31)*181 >> 8);
F5 = ((E5 + E7)*181 >> 8); F7 = ((E5 - E7)*181 >> 8);
t = (97*(E8 + E9) >> 8); F8 = t - ((334*E9) >> 8); F9 = t - ((-138*E8) >> 8); F11 = ((E11 + E12)*181 >> 8); F12 = ((E12 - F11)*181 >> 8);
t = (97*(E14 + E15) >> 8); F14 = t - ((334*E15) >> 8); F15 = t - ((-138*E14) >> 8); F16 = E16 + D18; F18 = E16 - D18; F17 = D17 + E19; F19 = D17 - E19;
t = (236*(E20 + E21) >> 8); F20 = t - ((138*E21) >> 8); F21 = t - ((334*E20) >> 8); F23 = ((E23 + E24)*181 >> 8); F24 = ((E23 - E24)*181 >> 8);
t = ((236*(E26 + E27)) >> 8); F26 = t - ((138*E27) >> 8); F27 = t - ((334*E26) >> 8); F28 = -E28 + D30; F30 = E28 + D30; F29 = -D29 + E31; F31 = D29 + E31;
t = (251*(F16 + F17) >> 8); G16 = t - ((301*F17) >> 8); G17 = t - ((201*F16) >> 8);
t = (212*(F18 + F19) >> 8); G18 = t - ((355*F19) >> 8); G19 = t - ((70*F18) >> 8);
t = (212*(F28 + F29) >> 8); G28 = t - ((355*F29) >> 8); G29 = t - ((70*F28) >> 8);
t = (251*(F30 + F31) >> 8); G30 = t - ((301*F31) >> 8); G31 = t - ((201*F30) >> 8);
Y0 = E0; Y1 = F24; Y2 = -F12; Y3 = -G16; Y4 = E4; Y5 = G31; Y6 = F8; Y7 = -F26; Y8 = E2; Y9 = F21; Y10 = F15; Y11 = G29; Y12 = F5; Y13 = -G18; Y14 = E13; Y15 = E22; Y16 = E1; Y17 = E25; Y18 = E10; Y19 = -G19; Y20 = F7; Y21 = -G28; Y22 = F14; Y23 = -F20; Y24 = E3; Y25 = -F27; Y26 = F9; Y27 = -G30; Y28 = E6; Y29 = -G17; Y30 = F11; Y31 = -F23
만약, 도 19의 우측에 도시된 바와 같은 변경된 버터 플라이 구조(1920)의 연산을 도 15의 버터 플라이 구조 각각에 적용하여 32 포인트 이산 코사인 변환을 수행하는 경우, X0 내지 X31는 변환되어야 할 입력값, A0 내지 A31, B0 내지 B31, C0 내지 C31, D0 내지 D31, E0 내지 E31, F0 내지 F31, G0내지 G31은 중간값, Y0 내지 Y31은 변환된 값을 나타낸다고 할 때, 변환 결과 Y0 내지 Y31은 다음의 연산 과정을 통해 획득될 수 있다.
A0 = X0 + X31; A31 = X0 - X31; A1 = X1 + X30; A30 = X1 - X30; A2 = X2 + X29; A29 = X2 - X29; A3 = X3 + X28; A28 = X3 - X28; A4 = X4 + X27; A27 = X4 - X27; A5 = X5 + X26; A26 = X5 - X26; A6 = X6 + X25; A25 = X6 - X25; A7 = X7 + X24; A24 = X7 - X24; A8 = X8 + X23; A23 = X8 - X23; A9 = X9 + X22; A22 = X9 - X22; A10 = X10 + X21; A21 = X10 - X21; A11 = X11 + X20; A20 = X11 - X20; A12 = X12 + X19; A19 = X12 - X19; A13 = X13 + X18; A18 = X13 - X18; A14 = X14 + X17; A17 = X14 - X17; A15 = X15 + X16; A16 = X15 - X16;
B0 = A0 + A15; B15 = A0 - A15; B1 = A1 + A14; B14 = A1 - A14; B2 = A2 + A13; B13 = A2 - A13; B3 = A3 + A12; B12 = A3 - A12; B4 = A4 + A11; B11 = A4 - A11; B5 = A5 + A10; B10 = A5 - A10; B6 = A6 + A9; B9 = A6 - A9; B7 = A7 + A8; B8 = A7 - A8; B16 = A16 - ((113*A31)>> 8); B31 = A31 + ((189*B16)>> 8); B16 = B16 - ((113*B31)>> 8); B17 = A17 + ((21*A30) >> 6); B30 = A30 - ((152*B17) >> 8); B17 = B17 + ((21*B30) >> 6); B18 = A18 - ((145*A29) >> 8); B29 = A29 + ((219*B18) >> 8); B18 = B18 - ((145*B29) >> 8); B19 = A19 + ((57*A28) >> 8); B28 = A28 - ((109*B19) >> 8); B19 = B19 + ((57*B28) >> 8); B20 = A20 - ((45*A27) >> 6); B27 = A27 + ((241*B20) >> 8); B20 = B20 - ((45*B27) >> 6); B21 = A21 + ((31*A26) >> 8); B26 = A26 - ((31*B21) >> 7); B21 = B21 + ((31*B26) >> 8); B22 = A22 - ((55*A25) >> 6); B25 = A25 + ((253*B22) >> 8); B22 = B22 - ((55*B25) >> 6); B23 = A23 + ((3*A24) >> 7); B24 = A24 - ((3*B23) >> 6); B23 = B23 + ((3*B24) >> 7);
C0 = B0 + B7; C7 = B0 - B7; C1 = B1 + B6; C6 = B1 - B6;
C2 = B2 + B5; C5 = B2 - B5; C3 = B3 + B4; C4 = B3 - B4;
C15 = B15 - ((B8*91) >> 8); C8 = B8 + ((C15*81) >> 7);
C15 = C15 - ((C8*91) >> 8); C9 = B9 - ((B14*153) >> 8);
C14 = B14 + ((C9*225) >> 8); C9 = C9 - ((C14*153) >> 8);
C13 = B13 - ((B10*37) >> 8); C10 = B10 + ((C13*37) >> 7);
*C13 = C13 - ((C10*37) >> 8); C11 = B11 - ((B12*29) >> 5);
C12 = B12 + ((C11*127) >> 7); C11 = C11 - ((C12*29) >> 5);
C16 = B16 + B23; C23 = B16 - B23; C17 = B17 + B22;
C22 = B17 - B22; C18 = B18 + B21; C21 = B18 - B21;
C19 = B19 + B20; C20 = B19 - B20; C24 = B24 + B31;
C31 = B24 - B31; C25 = B25 + B30; C30 = B25 - B30;
C26 = B26 + B29; C29 = B26 - B29; C27 = B27 + B28;
C28 = B27 - B28;
D0 = C0 + C3; D3 = C0 - C3; D1 = C1 + C2; D2 = C1 - C2;
D7 = C7 - ((C4*77) >> 8); D4 = C4 + ((D7*71) >> 7);
D7 = D7 - ((D4*77) >> 8); D6 = C6 - ((C5*25) >> 8);
D5 = C5 + ((D6*49) >> 8); D6 = D6 - ((D5*25) >> 8);
D8 = C8 + C11; D11 = C8 - C11; D9 = C9 + C10;
D10 = C9 - C10; D12 = C12 + C15; D15 = C12 - C15;
D13 = C13 + C14; D14 = C13 - C14; D16 = C16 + C28;
D28 = C16 - C28; D17 = C17 + C29; D29 = C17 - C29;
D18 = C18 + C30; D30 = C18 - C30; D19 = C19 + C31;
D31 = C19 - C31; D20 = C20 + C23; D23 = C20 - C23;
D21 = C21 + C22; D22 = C21 - C22; D24 = C24 + C27;
D27 = C24 - C27; D25 = C25 + C26; D26 = C25 - C26;
E0 = D0 + D1; E1 = (E0>>1) - D1;
E2 = -D2 + ((D3*53) >> 7); E3 = D3 - ((E2*45) >> 7);
E4 = D4 + D6; E6 = D4 - D6; E5 = D7 - D5; E7 = D7 + D5;
E8 = D8 + D14; E14 = D8 - D14; E9 = D9 + D15;
E15 = D9 - D15; E10 = D10 + D11; E11 = D10 - D11;
E12 = D12 + D13; E13 = D12 - D13;
E16 = ((D16 + D19)*181) >> 8; E19 = ((-D16 + D19)*181) >> 8;
E20 = D20 + D26; E26 = D20 - D26; E21 = D21 + D27;
E27 = D21 - D27; E22 = D22 + D23; E23 = D22 - D23;
E24 = D24 + D25; E25 = D24 - D25;
E28 = ((D28 + D31)*181) >> 8; E31 = ((-D28 + D31)*181) >> 8;
F7 = E7 + E4; F4 = (F7>>1) - E4;
F8 = E8 + ((E9*53) >> 7); F9 = -E9 + ((F8*45) >> 7);
F11 = E11 + E12; F12 = E12 - (F11 >> 1);
F14 = E14 + ((E15*53) >> 7); F15 = E15 - ((F14*45) >> 7);
F16 = E16 + D18; F18 = E16 - D18; F17 = D17 + E19;
F19 = D17 - E19; F20 = E20 + ((E21*53) >> 7);
F21 = E21 - ((F20*45) >> 7); F23 = E23 + ((E24*255) >> 8);
F24 = E24 - (F23 >> 1); F26 = E26 + ((E27*53) >> 7);
F27 = E27 - ((F26*45) >> 7); F28 = -E28 + D30;
F30 = E28 + D30; F29 = -D29 +E31; F31 = D29 + E31;
*
G16 = F16 - ((F17*25) >> 7); G17 = F17 + ((G16*3) >> 4);
G18 = F18 - ((F19*171) >> 8); G19 = F19 + ((G18*59) >> 7);
G28 = F28 - ((F29*171) >> 8); G29 = F29 + ((G28*59) >> 7);
G30 = F30 - ((F31*25) >> 7); G31 = F31 + ((G30*3) >> 4);
Y0 = E0; Y1 = F24; Y2 = F12; Y3 = -G16; Y4 = F7; Y5 = G31; Y6 = F9; Y7 = -F26; Y8 = E3; Y9 = F21; Y10 = F14; Y11 = G29; Y12 = E5; Y13 = -G18; Y14 = E13; Y15 = E22; Y16 = E1; Y17 = E25; Y18 = E10; Y19 = -G19; Y20 = E6; Y21 = -G28; Y22 = F15; Y23 = -F20; Y24 = E2; Y25 = -F27; Y26 = F8; Y27 = -G30; Y28 = F4; Y29 = -G17; Y30 = F11; Y31 = -F23
한편, 도 18 및 도 19에 도시된 변경된 버터플라이 구조에 기초한 32x32 크기의 블록의 변환을 위한 변경된 이산 코사인 변환 행렬을 A라고 할 때, 도 15에 대응되는 32x32 크기의 블록의 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬(Original_A)과 변경된 이산 코사인 변환 행렬 A 사이의 차이값을 보정하기 위한 스케일링 행렬 및 시프트 연산을 적용하여 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행할 수 있다.
전술한 도 5과 같이, 스케일링 행렬은 각 i번째 행의 원소가 Si(i는 1부터 N까지의 정수)의 값을 갖는 NxN 크기의 중간 행렬(S)의 각 원소와 변경된 이산 코사인 변환 행렬 A의 동일 위치의 원소들을 각각 곱한 값(SⓧA)과, 원래의 NxN 변환 행렬 사이의 차이인 변환 오차 행렬(Original_A-SⓧA)을 획득하고, 변환 오차 행렬(Original_A- SⓧA)의 대각 성분을 제외한 나머지 원소들의 제곱합이 최소가 되도록 하는 Si 값들을 획득하며, 획득된 Si값들을 적용한 NxN 크기의 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소들을 각각 곱한 행렬(SⓧST)에 기초하여 생성될 수 있다. 원래의 NxN 변환 행렬(Original_A)이 차이가 난다는 점을 제외하고는 구체적인 과정은 전술한 도 5의 단계 530 및 540과 동일하므로 구체적인 설명은 생략한다. 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 22 내지 도 27과 같다. 도 22 내지 도 27에서는 m=10인 경우이다. 또한, 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 28 내지 도33과 같다. 도 28 내지 도 33에서는 m=10인 경우이다.
한편, 역양자화 단계에서는 이산 코사인 역변환에 이용되는 원래의 NxN 역변환 행렬과 치환된 NxN 변환 행렬의 역행렬인 NxN 역변환 행렬 사이의 차이값을 보정하기 위한 역스케일링 행렬 및 시프트 연산을 적용하여 역양자화를 수행한다. 전술한 도 18 및 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하는 경우 이산 코사인 변환을 나타내는 행렬이 변화되기 때문에 역스케일링 행렬 역시 변화된다.
역스케일링 행렬(V)는 전술한 스케일링 행렬(MF)의 생성시에도 이용되는 중간 행렬(S)과 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소들을 각각 곱한 행렬(SⓧST)에 해당하는 PF에 기초하여 생성될 수 있다. 구체적으로, 양자화 스텝을 Qstep, 중간 행렬(S)과 중간 행렬의 전치 행렬(ST)동일 위치의 원소들을 각각 곱한 행렬을 PF, n은 양의 정수라고 할 때, 역스케일링 행렬(V)은 다음의 수학식; V=Qstep*PF*2^n 을 통해 획득된다.
전술한 바와 같이 역스케일링 행렬(V)가 결정되면, 역양자화는 역스케일링 행렬(V)와 양자화된 변환 계수를 곱한 값에 대해서 floor(QP/6)(floor[x]는 x보다 작거나 같은 최대 정수, QP는 양자화 파라메터) 비트만큼 비트 시프트 연산을 통해 수행될 수 있다. 즉, Zij를 양자화된 계수값, Wij를 변환 계수라고 하면 다음의 수학식; Wij=(Zij)<<floor(QP/6)을 통해 양자화된 계수를 역양자화한 Wij를 획득할 수 있다.
도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬(v)의 예는 도 34 내지 도 39과 같다. 도 34 내지 도 39에서는 n=10인 경우이다. 또한, 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예는 도 40 내지 도 45과 같다. 도 40내지 도 45에서는 n=10인 경우이다.
또한, 전술한 도 6과 유사하게 스케일링 행렬은 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬의 각 원소를 변경된 이산 코사인 변환 행렬 A의 동일 위치의 원소들로 나눔으로써 획득된 중간 행렬의 각 원소와 중간 행렬의 전치 행렬의 동일 위치의 원소를 곱하여 획득된 행렬일 수 있다. 도 18 및 도 19의 우측에 도시된 변경된 버터플라이 구조를 도 15의 알고리즘에 적용한 N 포인트 1차원 이산 코사인 변환을 나타내는 변경된 이산 코사인 변환 행렬(A)이 차이가 난다는 점을 제외하고는 구체적인 과정은 전술한 도 6과 동일하므로 구체적인 설명은 생략한다. 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 46 내지 도 51과 같다. 도 46 내지 도 51에서는 m=10인 경우이다. 또한, 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 52 내지 도 57과 같다. 도 52 내지 도 57에서는 m=10인 경우이다.
스케일링 행렬을 도 46 내지 57에 적용된 바와 같이 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬의 각 원소를 변경된 이산 코사인 변환 행렬 A의 동일 위치의 원소들로 나눔으로써 중간 행렬을 획득하고, 획득된 중간 행렬의 각 원소를 중간 행렬의 전치 행렬의 동일 위치의 원소와 곱하여 획득하는 경우, 원래의 NxN 변환 행렬이 차이가 나기 때문에 역스케일링 행렬(V) 역시 변경된다. 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬(v)의 예는 도 58 내지 도 63과 같다. 도 58 내지 도 63에서는 n=10인 경우이다. 또한, 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예는 도 64 내지 도 69과 같다. 도 64 내지 도 69에서는 n=10인 경우이다.
한편, 전술한 도 6과 유사하게 스케일링 행렬은 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬의 각 원소를 변경된 이산 코사인 변환 행렬 A의 동일 위치의 원소들로 나눔으로써 획득된 중간 행렬의 각 원소를 중간 행렬의 전치 행렬의 동일 위치의 원소들을 곱하여 획득된 행렬을 이용하는 한편, 역스케일링 행렬은 중간 행렬(S)을 이용하는 대신에 원래의 32 포인트 이산 코사인 역변환 행렬(Original_InverseA)의 각 원소와, 본 발명의 일 실시예에 따른 변경된 버터 플라이 구조에 대응되는 32 포인트 이산 코사인 변환 행렬(InverseA)의 동일 위치의 원소를 직접 나눔으로써 획득된 중간 행렬(R)을 이용하여 결정될 수 있다. 이 경우, 중간 행렬(R)의 각 원소와 중간 행렬(R)의 전치 행렬(RT)의 동일 위치의 원소들을 각각 곱한 행렬(RⓧRT)에 기초하여 역스케일링 행렬(V)을 생성한다. 구체적으로, 중간 행렬(R)과 중간 행렬의 전치 행렬(RT)의 동일 위치의 원소들을 각각 곱한 행렬(RⓧRT)을 BF, n은 양의 정수라고 할 때, 역스케일링 행렬(V)은 다음의 수학식; V=Qstep*BF*2^n 을 통해 획득된다. 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 70 내지 도 75과 같다. 도 70 내지 도 75에서는 m=10인 경우이다. 또한, 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 76 내지 도 81과 같다. 도 76 내지 도 81에서는 m=10인 경우이다. 도 18의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬(v)의 예는 도 82 내지 도 87과 같다. 도 82 내지 도 87에서는 n=10인 경우이다. 또한, 도 19의 우측에 도시된 변경된 버터 플라이 구조를 적용하였을 때 32x32 입력 블록에 대한 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예는 도 88 내지 도 93과 같다. 도 88 내지 도 93에서는 n=10인 경우이다.
도 95은 본 발명의 일 실시예에 따른 영상 복호화 장치를 나타낸 블록도이다.
도 95을 참조하면, 본 발명의 일 실시예에 따른 영상 복호화 장치(10000)는 엔트로피 복호화부(10010), 역양자화부(10020), 역변환부(10030) 및 예측부(10040)를 포함한다.
엔트로피 복호화부(10010)는 입력 비트스트림으로부터 복호화되는 현재 블록의 예측 모드 정보, 참조 픽처 정보 및 레지듀얼 정보를 추출한다.
역양자화부(10020)는 엔트로피복호화부(10010)에서 엔트로피 복호화된 양자화된 변환 계수들을 역양자화한다. 전술한 바와 같이 본 발명의 다양한 실시예를 통해서 역스케일링 행렬(V)이 결정되면, 역양자화부(10020)는 역스케일링 행렬(V)와 양자화된 변환 계수를 곱한 값에 대해서 floor(QP/6)(floor[x]는 x보다 작거나 같은 최대 정수, QP는 양자화 파라메터) 비트만큼 비트 시프트 연산을 통해 역양자화를 수행한다. 즉, Zij를 양자화된 계수값, Wij를 변환 계수라고 하면 다음의 수학식; Wij=(Zij)<<floor(QP/6)을 통해 양자화된 계수를 역양자화한 Wij를 획득할 수 있다.
역변환부(10030)는 역양자화된 변환 계수들을 역변환한다. 역변환 결과, 블록 단위에 대한 레지듀얼 값들이 복원된다. 역변환 과정은 본 발명의 다양한 실시예를 통해서 획득된 NxN 변환 행렬(A)의 역행렬(A-1)을 이용한 N 포인트 이산 코사인 역변환을 통해 수행될 수 있다.
전술한 도 3의 실시예에 따라서 변환된 16x16 입력 블록에 대하여 치환된 16x16 변환 행렬(A)의 역변환 행렬(A-1)를 이용한 1차원 이산 코사인 역변환을 수행하는 경우, X0 내지 X15은 역변환되어야 할 입력값, B0 내지 B15, C0 내지 C15, D0 내지 D15, E0 내지 E15, F0 내지 F15, G0 내지 G15은 중간값, Y0 내지 Y15은 역변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
G0 = X0;G8 = X1;G4 = X2;G12 = X3;G2 = X4;G10 = X5;G6 = X6;G14 = X7;G1 = X8;G9 = X9;G5 = X10;G13 = X11;G3 = X12;G11 = X13;G7 = X14;G15 = X15;F0 = G0;F1 = G1;F2 = G2;F3 = G3;F4 = G4;F5 = G5;F6 = G6;F7 = G7;F8 = (6*G8-63*G15) >> 6;F9 = (49*G9-40*G14) >> 6;F10 = (30*G10-56*G13) >> 6;F11 = (61*G11-18*G12) >> 6;F12 = (61*G12+18*G11) >> 6;F13 = (30*G13+56*G10) >> 6;F14 = (49*G14+40*G9) >> 6;F15 = (6*G15+63*G8) >> 6;E0 = F0;E1 = F1;E2 = F2;E3 = F3;E4 = (12*F4-62*F7) >> 6;E5 = (53*F5-35*F6) >> 6;E6 = (53*F6+35*F5) >> 6;E7 = (12*F7+62*F4) >> 6;E8 = F8+F9;E9 = F8-F9;E10 = F11-F10;E11 = F11+F10;E12 = F12+F13;E13 = F12-F13;E14 = F15-F14;E15 = F15+F14;D0 = (45*(E0+E1)) >> 6;D1 = (45*(E0-E1)) >> 6;D2 = (24*E2-59*E3) >> 6;D3 = (59*E2+24*E3) >> 6;D4 = E4+E5;D5 = E4-E5;D6 = E7-E6;D7 = E7+E6;D8 = E8;D9 = (24*E14-59*E9) >> 6;D10 = (-59*E13-24*E10) >> 6;D11 = E11;D12 = E12;D13 = (24*E13-59*E10) >> 6;D14 = (59*E14+24*E9) >> 6;D15 = E15;C0 = D0+D3;C3 = D0-D3;C8 = D8+D11;C11 = D8-D11;C12 = D15-D12;C15 = D15+D12;C1 = D1+D2;C2 = D1-D2;C9 = D9+D10;C10 = D9-D10;C13 = D14-D13;C14 = D14+D13;C4 = D4;C5 = (45*(D6-D5)) >> 6;C6 = (45*(D6+D5)) >> 6;C7 = D7;B0 = C0+C7;B7 = C0-C7;B1 = C1+C6;B6 = C1-C6;B2 = C2+C5;B5 = C2-C5;B3 = C3+C4;B4 = C3-C4;B8 = C8;B14 = C14;B10 = (45*(C13-C10)) >> 6;B13 = (45*(C13+C10)) >> 6;B9 = C9;B15 = C15;B11 = (45*(C12-C11)) >> 6;B12 = (45*(C12+C11)) >> 6;Y0 = B0+B15;Y15 = B0-B15;Y1 = B1+B14;Y14 = B1-B14;Y2 = B2+B13;Y13 = B2-B13;Y3 = B3+B12;Y12 = B3-B12;Y4 = B4+B11;Y11 = B4-B11;Y5 = B5+B10;Y10 = B5-B10;Y6 = B6+B9;Y9 = B6-B9;Y7 = B7+B8;Y8 = B7-B8
전술한 도 3의 실시예에 따라서 변환된 32x32 입력 블록에 대하여 치환된 32x32 변환 행렬(A)의 역변환 행렬(A-1)를 이용한 1차원 이산 코사인 역변환을 수행하는 경우, X0 내지 X31은 역변환되어야 할 입력값, A0 내지 A31, B0 내지 B31, C0 내지 C31, D0 내지 D31, E0 내지 E31, F0 내지 F31, G0 내지 G31, H0 내지 H31은 중간값, Y0 내지 Y31은 역변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
H0 = X0;H16 = X1;H8 = X2;H24 = X3;H4 = X4;H20 = X5;H12 = X6;H28 = X7;H2 = X8;H18 = X9;H10 = X10;H26 = X11;H6 = X12;H22 = X13;H14 = X14;H30 = X15;H1 = X16;H17 = X17;H9 = X18;H25 = X19;H5 = X20;H21 = X21;H13 = X22;H29 = X23;H3 = X24;H19 = X25;H11 = X26;H27 = X27;H7 = X28;H23 = X29;H15 = X30;H31 = X31;G0 = H0;G1 = H1;G2 = H2;G3 = H3;G4 = H4;G5 = H5;G6 = H6;G7 = H7;G8 = H8;G9 = H9;G10 = H10;G11 = H11;G12 = H12;G13 = H13;G14 = H14;G15 = H15;G16 = (12*H16-255*H31) >> 8;G17 = (189*H17-171*H30) >> 8;G18 = (109*H18-231*H29) >> 8;G19 = (241*H19-86*H28) >> 8;G20 = (62*H20-248*H27) >> 8;G21 = (219*H21-131*H26) >> 8;G22 = (152*H22-205*H25) >> 8;G23 = (253*H23-37*H24) >> 8;G24 = (253*H24+37*H23) >> 8;G25 = (152*H25+205*H22) >> 8;G26 = (219*H26+131*H21) >> 8;G27 = (62*H27+248*H20) >> 8;G28 = (241*H28+86*H19) >> 8;G29 = (109*H29+231*H18) >> 8;G30 = (189*H30+171*H17) >> 8;G31 = (12*H31+255*H16) >> 8;F0 = G0;F1 = G1;F2 = G2;F3 = G3;F4 = G4;F5 = G5;F6 = G6;F7 = G7;F8 = (25*G8-254*G15) >> 8;F9 = (197*G9-162*G14) >> 8;F10 = (120*G10-225*G13) >> 8;F11 = (244*G11-74*G12) >> 8;F12 = (244*G12+74*G11) >> 8;F13 = (120*G13+225*G10) >> 8;F14 = (197*G14+162*G9) >> 8;F15 = (25*G15+254*G8) >> 8;F16 = G16+G17;F17 = G16-G17;F18 = G19-G18;F19 = G19+G18;F20 = G20+G21;F21 = G20-G21;F22 = G23-G22;F23 = G23+G22;F24 = G24+G25;F25 = G24-G25;F26 = G27-G26;F27 = G27+G26;F28 = G28+G29;F29 = G28-G29;F30 = G31-G30;F31 = G31+G30;E0 = F0;E1 = F1;E2 = F2;E3 = F3;E4 = (49*F4-251*F7) >> 8;E5 = (212*F5-142*F6) >> 8;E6 = (212*F6+142*F5) >> 8;E7 = (49*F7+251*F4) >> 8;E8 = F8+F9;E9 = F8-F9;E10 = F11-F10;E11 = F11+F10;E12 = F12+F13;E13 = F12-F13;E14 = F15-F14;E15 = F15+F14;E16 = F16;E17 = (49*F30-251*F17) >> 8;E18 = (-251*F29-49*F18) >> 8;E19 = F19;E20 = F20;E21 = (212*F26-142*F21) >> 8;E22 = (-142*F25-212*F22) >> 8;E23 = F23;E24 = F24;E25 = (212*F25-142*F22) >> 8;E26 = (142*F26+212*F21) >> 8;E27 = F27;E28 = F28;E29 = (49*F29-251*F18) >> 8;E30 = (251*F30+49*F17) >> 8;E31 = F31;D0 = (181*(E0+E1)) >> 8;D1 = (181*(E0-E1)) >> 8;D2 = (97*E2-236*E3) >> 8;D3 = (236*E2+97*E3) >> 8;D4 = E4+E5;D5 = E4-E5;D6 = E7-E6;D7 = E7+E6;D8 = E8;D9 = (97*E14-236*E9) >> 8;D10 = (-236*E13-97*E10) >> 8;D11 = E11;D12 = E12;D13 = (97*E13-236*E10) >> 8;D14 = (236*E14+97*E9) >> 8;D15 = E15;D16 = E16+E19;D19 = E16-E19;D20 = E23-E20;D23 = E23+E20;D24 = E24+E27;D27 = E24-E27;D28 = E31-E28;D31 = E31+E28;D17 = E17+E18;D18 = E17-E18;D21 = E22-E21;D22 = E22+E21;D25 = E25+E26;D26 = E25-E26;D29 = E30-E29;D30 = E30+E29;C0 = D0+D3;C3 = D0-D3;C8 = D8+D11;C11 = D8-D11;C12 = D15-D12;C15 = D15+D12;C1 = D1+D2;C2 = D1-D2;C9 = D9+D10;C10 = D9-D10;C13 = D14-D13;C14 = D14+D13;C4 = D4;C5 = (181*(D6-D5)) >> 8;C6 = (181*(D6+D5)) >> 8;C7 = D7;C16 = D16;C18 = (97*D29-236*D18) >> 8;C20 = (-236*D27-97*D20) >> 8;C22 = D22;C24 = D24;C26 = (-236*D21+97*D26) >> 8;C28 = (97*D19+236*D28) >> 8;C30 = D30;C17 = D17;C19 = (97*D28-236*D19) >> 8;C21 = (-236*D26-97*D21) >> 8;C23 = D23;C25 = D25;C27 = (-236*D20+97*D27) >> 8;C29 = (97*D18+236*D29) >> 8;C31 = D31;B0 = C0+C7;B7 = C0-C7;B1 = C1+C6;B6 = C1-C6;B2 = C2+C5;B5 = C2-C5;B3 = C3+C4;B4 = C3-C4;B8 = C8;B14 = C14;B10 = (181*(C13-C10)) >> 8;B13 = (181*(C13+C10)) >> 8;B9 = C9;B15 = C15;B11 = (181*(C12-C11)) >> 8;B12 = (181*(C12+C11)) >> 8;B16 = C16+C23;B23 = C16-C23;B24 = C31-C24;B31 = C31+C24;B17 = C17+C22;B22 = C17-C22;B25 = C30-C25;B30 = C30+C25;B18 = C18+C21;B21 = C18-C21;B26 = C29-C26;B29 = C29+C26;B19 = C19+C20;B20 = C19-C20;B27 = C28-C27;B28 = C28+C27;A0 = B0+B15;A15 = B0-B15;A1 = B1+B14;A14 = B1-B14;A2 = B2+B13;A13 = B2-B13;A3 = B3+B12;A12 = B3-B12;A4 = B4+B11;A11 = B4-B11;A5 = B5+B10;A10 = B5-B10;A6 = B6+B9;A9 = B6-B9;A7 = B7+B8;A8 = B7-B8;A16 = B16;A28 = B28;A20 = (181*(B27-B20)) >> 8;A27 = (181*(B27+B20)) >> 8;A17 = B17;A29 = B29;A21 = (181*(B26-B21)) >> 8;A26 = (181*(B26+B21)) >> 8;A18 = B18;A30 = B30;A22 = (181*(B25-B22)) >> 8;A25 = (181*(B25+B22)) >> 8;A19 = B19;A31 = B31;A23 = (181*(B24-B23)) >> 8;A24 = (181*(B24+B23)) >> 8;Y0 = (A0+A31);Y31 = (A0-A31);Y1 = (A1+A30);Y30 = (A1-A30);Y2 = (A2+A29);Y29 = (A2-A29);Y3 = (A3+A28);Y28 = (A3-A28);Y4 = (A4+A27);Y27 = (A4-A27);Y5 = (A5+A26);Y26 = (A5-A26);Y6 = (A6+A25);Y25 = (A6-A25);Y7 = (A7+A24);Y24 = (A7-A24);Y8 = (A8+A23);Y23 = (A8-A23);Y9 = (A9+A22);Y22 = (A9-A22);Y10 = (A10+A21);Y21 = (A10-A21);Y11 = (A11+A20);Y20 = (A11-A20);Y12 = (A12+A19);Y19 = (A12-A19);Y13 = (A13+A18);Y18 = (A13-A18);Y14 = (A14+A17);Y17 = (A14-A17);Y15 = (A15+A16);Y16 = (A15-A16)
전술한 도 3의 실시예에 따라서 변환된 64x64 입력 블록에 대하여 치환된 64x64 변환 행렬(A)의 역변환 행렬(A-1)를 이용한 1차원 이산 코사인 역변환을 수행하는 경우, X0 내지 X63은 역변환되어야 할 입력값, A0 내지 A63, B0 내지 B63, C0 내지 C63, D0 내지 D63, E0 내지 E63, F0 내지 F63, G0 내지 G63, H0 내지 H63, I0 내지 I63, O0 내지 O63은 중간값, Y0 내지 Y63은 역변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
I0 = X0;I32 = X1;I16 = X2;I48 = X3;I8 = X4;I40 = X5;I24 = X6;I56 = X7;I4 = X8;I36 = X9;I20 = X10;I52 = X11;I12 = X12;I44 = X13;I28 = X14;I60 = X15;I2 = X16;I34 = X17;I18 = X18;I50 = X19;I10 = X20;I42 = X21;I26 = X22;I58 = X23;I6 = X24;I38 = X25;I22 = X26;I54 = X27;I14 = X28;I46 = X29;I30 = X30;I62 = X31;I1 = X32;I33 = X33;I17 = X34;I49 = X35;I9 = X36;I41 = X37;I25 = X38;I57 = X39;I5 = X40;I37 = X41;I21 = X42;I53 = X43;I13 = X44;I45 = X45;I29 = X46;I61 = X47;I3 = X48;I35 = X49;I19 = X50;I51 = X51;I11 = X52;I43 = X53;I27 = X54;I59 = X55;I7 = X56;I39 = X57;I23 = X58;I55 = X59;I15 = X60;I47 = X61;I31 = X62;I63 = X63;H0 = I0;H1 = I1;H2 = I2;H3 = I3;H4 = I4;H5 = I5;H6 = I6;H7 = I7;H8 = I8;H9 = I9;H10 = I10;H11 = I11;H12 = I12;H13 = I13;H14 = I14;H15 = I15;H16 = I16;H17 = I17;H18 = I18;H19 = I19;H20 = I20;H21 = I21;H22 = I22;H23 = I23;H24 = I24;H25 = I25;H26 = I26;H27 = I27;H28 = I28;H29 = I29;H30 = I30;H31 = I31;H32 = (25*I32-1024*I63) >> 10;H33 = (742*I33-706*I62) >> 10;H34 = (415*I34-936*I61) >> 10;H35 = (955*I35-369*I60) >> 10;H36 = (224*I36-999*I59) >> 10;H37 = (865*I37-548*I58) >> 10;H38 = (590*I38-837*I57) >> 10;H39 = (1009*I39-175*I56) >> 10;H40 = (125*I40-1016*I55) >> 10;H41 = (807*I41-630*I54) >> 10;H42 = (505*I42-891*I53) >> 10;H43 = (987*I43-273*I52) >> 10;H44 = (321*I44-972*I51) >> 10;H45 = (915*I45-460*I50) >> 10;H46 = (669*I46-775*I49) >> 10;H47 = (1021*I47-75*I48) >> 10;H48 = (1021*I48+75*I47) >> 10;H49 = (669*I49+775*I46) >> 10;H50 = (915*I50+460*I45) >> 10;H51 = (321*I51+972*I44) >> 10;H52 = (987*I52+273*I43) >> 10;H53 = (505*I53+891*I42) >> 10;H54 = (807*I54+630*I41) >> 10;H55 = (125*I55+1016*I40) >> 10;H56 = (1009*I56+175*I39) >> 10;H57 = (590*I57+837*I38) >> 10;H58 = (865*I58+548*I37) >> 10;H59 = (224*I59+999*I36) >> 10;H60 = (955*I60+369*I35) >> 10;H61 = (415*I61+936*I34) >> 10;H62 = (742*I62+706*I33) >> 10;H63 = (25*I63+1024*I32) >> 10;G0 = H0;G1 = H1;G2 = H2;G3 = H3;G4 = H4;G5 = H5;G6 = H6;G7 = H7;G8 = H8;G9 = H9;G10 = H10;G11 = H11;G12 = H12;G13 = H13;G14 = H14;G15 = H15;G16 = (50*H16-1023*H31) >> 10;G17 = (759*H17-688*H30) >> 10;G18 = (438*H18-926*H29) >> 10;G19 = (964*H19-345*H28) >> 10;G20 = (249*H20-993*H27) >> 10;G21 = (878*H21-526*H26) >> 10;G22 = (610*H22-822*H25) >> 10;G23 = (1013*H23-150*H24) >> 10;G24 = (1013*H24+150*H23) >> 10;G25 = (610*H25+822*H22) >> 10;G26 = (878*H26+526*H21) >> 10;G27 = (249*H27+993*H20) >> 10;G28 = (964*H28+345*H19) >> 10;G29 = (438*H29+926*H18) >> 10;G30 = (759*H30+688*H17) >> 10;G31 = (50*H31+1023*H16) >> 10;G32 = H32+H33;G33 = H32-H33;G34 = H35-H34;G35 = H35+H34;G36 = H36+H37;G37 = H36-H37;G38 = H39-H38;G39 = H39+H38;G40 = H40+H41;G41 = H40-H41;G42 = H43-H42;G43 = H43+H42;G44 = H44+H45;G45 = H44-H45;G46 = H47-H46;G47 = H47+H46;G48 = H48+H49;G49 = H48-H49;G50 = H51-H50;G51 = H51+H50;G52 = H52+H53;G53 = H52-H53;G54 = H55-H54;G55 = H55+H54;G56 = H56+H57;G57 = H56-H57;G58 = H59-H58;G59 = H59+H58;G60 = H60+H61;G61 = H60-H61;G62 = H63-H62;G63 = H63+H62;F0 = G0;F1 = G1;F2 = G2;F3 = G3;F4 = G4;F5 = G5;F6 = G6;F7 = G7;F8 = (100*G8-1019*G15) >> 10;F9 = (792*G9-650*G14) >> 10;F10 = (483*G10-903*G13) >> 10;F11 = (980*G11-297*G12) >> 10;F12 = (980*G12+297*G11) >> 10;F13 = (483*G13+903*G10) >> 10;F14 = (792*G14+650*G9) >> 10;F15 = (100*G15+1019*G8) >> 10;F16 = G16+G17;F17 = G16-G17;F18 = G19-G18;F19 = G19+G18;F20 = G20+G21;F21 = G20-G21;F22 = G23-G22;F23 = G23+G22;F24 = G24+G25;F25 = G24-G25;F26 = G27-G26;F27 = G27+G26;F28 = G28+G29;F29 = G28-G29;F30 = G31-G30;F31 = G31+G30;F32 = G32;F33 = (100*G62-1019*G33) >> 10;F34 = (-1019*G61-100*G34) >> 10;F35 = G35;F36 = G36;F37 = (792*G58-650*G37) >> 10;F38 = (-650*G57-792*G38) >> 10;F39 = G39;F40 = G40;F41 = (483*G54-903*G41) >> 10;F42 = (-903*G53-483*G42) >> 10;F43 = G43;F44 = G44;F45 = (980*G50-297*G45) >> 10;F46 = (-297*G49-980*G46) >> 10;F47 = G47;F48 = G48;F49 = (980*G49-297*G46) >> 10;F50 = (297*G50+980*G45) >> 10;F51 = G51;F52 = G52;F53 = (483*G53-903*G42) >> 10;F54 = (903*G54+483*G41) >> 10;F55 = G55;F56 = G56;F57 = (792*G57-650*G38) >> 10;F58 = (650*G58+792*G37) >> 10;F59 = G59;F60 = G60;F61 = (100*G61-1019*G34) >> 10;F62 = (1019*G62+100*G33) >> 10;F63 = G63;E0 = F0;E1 = F1;E2 = F2;E3 = F3;E4 = (200*F4-1004*F7) >> 10;E5 = (851*F5-569*F6) >> 10;E6 = (851*F6+569*F5) >> 10;E7 = (200*F7+1004*F4) >> 10;E8 = F8+F9;E9 = F8-F9;E10 = F11-F10;E11 = F11+F10;E12 = F12+F13;E13 = F12-F13;E14 = F15-F14;E15 = F15+F14;E16 = F16;E17 = (200*F30-1004*F17) >> 10;E18 = (-1004*F29-200*F18) >> 10;E19 = F19;E20 = F20;E21 = (851*F26-569*F21) >> 10;E22 = (-569*F25-851*F22) >> 10;E23 = F23;E24 = F24;E25 = (851*F25-569*F22) >> 10;E26 = (569*F26+851*F21) >> 10;E27 = F27;E28 = F28;E29 = (200*F29-1004*F18) >> 10;E30 = (1004*F30+200*F17) >> 10;E31 = F31;E32 = F32+F35;E33 = F33+F34;E34 = F33-F34;E35 = F32-F35;E36 = F39-F36;E37 = F38-F37;E38 = F38+F37;E39 = F39+F36;E40 = F40+F43;E41 = F41+F42;E42 = F41-F42;E43 = F40-F43;E44 = F47-F44;E45 = F46-F45;E46 = F46+F45;E47 = F47+F44;E48 = F48+F51;E49 = F49+F50;E50 = F49-F50;E51 = F48-F51;E52 = F55-F52;E53 = F54-F53;E54 = F54+F53;E55 = F55+F52;E56 = F56+F59;E57 = F57+F58;E58 = F57-F58;E59 = F56-F59;E60 = F63-F60;E61 = F62-F61;E62 = F62+F61;E63 = F63+F60;D0 = (724*(E0+E1)) >> 10;D1 = (724*(E0-E1)) >> 10;D2 = (392*E2-946*E3) >> 10;D3 = (946*E2+392*E3) >> 10;D4 = E4+E5;D5 = E4-E5;D6 = E7-E6;D7 = E7+E6;D8 = E8;D9 = (392*E14-946*E9) >> 10;D10 = (-946*E13-392*E10) >> 10;D11 = E11;D12 = E12;D13 = (392*E13-946*E10) >> 10;D14 = (946*E14+392*E9) >> 10;D15 = E15;D16 = E16+E19;D19 = E16-E19;D20 = E23-E20;D23 = E23+E20;D24 = E24+E27;D27 = E24-E27;D28 = E31-E28;D31 = E31+E28;D17 = E17+E18;D18 = E17-E18;D21 = E22-E21;D22 = E22+E21;D25 = E25+E26;D26 = E25-E26;D29 = E30-E29;D30 = E30+E29;D32 = E32;D33 = E33;D34 = (200*E61-1004*E34) >> 10;D35 = (200*E60-1004*E35) >> 10;D36 = (-1004*E59-200*E36) >> 10;D37 = (-1004*E58-200*E37) >> 10;D38 = E38;D39 = E39;D40 = E40;D41 = E41;D42 = (851*E53-569*E42) >> 10;D43 = (851*E52-569*E43) >> 10;D44 = (-569*E51-851*E44) >> 10;D45 = (-569*E50-851*E45) >> 10;D46 = E46;D47 = E47;D48 = E48;D49 = E49;D50 = (851*E50-569*E45) >> 10;D51 = (851*E51-569*E44) >> 10;D52 = (569*E52+851*E43) >> 10;D53 = (569*E53+851*E42) >> 10;D54 = E54;D55 = E55;D56 = E56;D57 = E57;D58 = (200*E58-1004*E37) >> 10;D59 = (200*E59-1004*E36) >> 10;D60 = (1004*E60+200*E35) >> 10;D61 = (1004*E61+200*E34) >> 10;D62 = E62;D63 = E63;C0 = D0+D3;C3 = D0-D3;C8 = D8+D11;C11 = D8-D11;C12 = D15-D12;C15 = D15+D12;C1 = D1+D2;C2 = D1-D2;C9 = D9+D10;C10 = D9-D10;C13 = D14-D13;C14 = D14+D13;C4 = D4;C5 = (724*(D6-D5)) >> 10;C6 = (724*(D6+D5)) >> 10;C7 = D7;C16 = D16;C18 = (392*D29-946*D18) >> 10;C20 = (-946*D27-392*D20) >> 10;C22 = D22;C24 = D24;C26 = (-946*D21+392*D26) >> 10;C28 = (392*D19+946*D28) >> 10;C30 = D30;C17 = D17;C19 = (392*D28-946*D19) >> 10;C21 = (-946*D26-392*D21) >> 10;C23 = D23;C25 = D25;C27 = (-946*D20+392*D27) >> 10;C29 = (392*D18+946*D29) >> 10;C31 = D31;C32 = D32+D39;C39 = D32-D39;C40 = D47-D40;C47 = D47+D40;C48 = D48+D55;C55 = D48-D55;C56 = D63-D56;C63 = D63+D56;C33 = D33+D38;C38 = D33-D38;C41 = D46-D41;C46 = D46+D41;C49 = D49+D54;C54 = D49-D54;C57 = D62-D57;C62 = D62+D57;C34 = D34+D37;C37 = D34-D37;C42 = D45-D42;C45 = D45+D42;C50 = D50+D53;C53 = D50-D53;C58 = D61-D58;C61 = D61+D58;C35 = D35+D36;C36 = D35-D36;C43 = D44-D43;C44 = D44+D43;C51 = D51+D52;C52 = D51-D52;C59 = D60-D59;C60 = D60+D59;B0 = C0+C7;B7 = C0-C7;B1 = C1+C6;B6 = C1-C6;B2 = C2+C5;B5 = C2-C5;B3 = C3+C4;B4 = C3-C4;B8 = C8;B14 = C14;B10 = (724*(C13-C10)) >> 10;B13 = (724*(C13+C10)) >> 10;B9 = C9;B15 = C15;B11 = (724*(C12-C11)) >> 10;B12 = (724*(C12+C11)) >> 10;B16 = C16+C23;B23 = C16-C23;B24 = C31-C24;B31 = C31+C24;B17 = C17+C22;B22 = C17-C22;B25 = C30-C25;B30 = C30+C25;B18 = C18+C21;B21 = C18-C21;B26 = C29-C26;B29 = C29+C26;B19 = C19+C20;B20 = C19-C20;B27 = C28-C27;B28 = C28+C27;B32 = C32;B36 = (392*C59-946*C36) >> 10;B40 = (-946*C55-392*C40) >> 10;B44 = C44;B48 = C48;B52 = (-946*C43+392*C52) >> 10;B56 = (392*C39+946*C56) >> 10;B60 = C60;B33 = C33;B37 = (392*C58-946*C37) >> 10;B41 = (-946*C54-392*C41) >> 10;B45 = C45;B49 = C49;B53 = (-946*C42+392*C53) >> 10;B57 = (392*C38+946*C57) >> 10;B61 = C61;B34 = C34;B38 = (392*C57-946*C38) >> 10;B42 = (-946*C53-392*C42) >> 10;B46 = C46;B50 = C50;B54 = (-946*C41+392*C54) >> 10;B58 = (392*C37+946*C58) >> 10;B62 = C62;B35 = C35;B39 = (392*C56-946*C39) >> 10;B43 = (-946*C52-392*C43) >> 10;B47 = C47;B51 = C51;B55 = (-946*C40+392*C55) >> 10;B59 = (392*C36+946*C59) >> 10;B63 = C63;A0 = B0+B15;A15 = B0-B15;A1 = B1+B14;A14 = B1-B14;A2 = B2+B13;A13 = B2-B13;A3 = B3+B12;A12 = B3-B12;A4 = B4+B11;A11 = B4-B11;A5 = B5+B10;A10 = B5-B10;A6 = B6+B9;A9 = B6-B9;A7 = B7+B8;A8 = B7-B8;A16 = B16;A28 = B28;A20 = (724*(B27-B20)) >> 10;A27 = (724*(B27+B20)) >> 10;A17 = B17;A29 = B29;A21 = (724*(B26-B21)) >> 10;A26 = (724*(B26+B21)) >> 10;A18 = B18;A30 = B30;A22 = (724*(B25-B22)) >> 10;A25 = (724*(B25+B22)) >> 10;A19 = B19;A31 = B31;A23 = (724*(B24-B23)) >> 10;A24 = (724*(B24+B23)) >> 10;A32 = B32+B47;A47 = B32-B47;A48 = B63-B48;A63 = B63+B48;A33 = B33+B46;A46 = B33-B46;A49 = B62-B49;A62 = B62+B49;A34 = B34+B45;A45 = B34-B45;A50 = B61-B50;A61 = B61+B50;A35 = B35+B44;A44 = B35-B44;A51 = B60-B51;A60 = B60+B51;A36 = B36+B43;A43 = B36-B43;A52 = B59-B52;A59 = B59+B52;A37 = B37+B42;A42 = B37-B42;A53 = B58-B53;A58 = B58+B53;A38 = B38+B41;A41 = B38-B41;A54 = B57-B54;A57 = B57+B54;A39 = B39+B40;A40 = B39-B40;A55 = B56-B55;A56 = B56+B55;O0 = A0+A31;O31 = A0-A31;O1 = A1+A30;O30 = A1-A30;O2 = A2+A29;O29 = A2-A29;O3 = A3+A28;O28 = A3-A28;O4 = A4+A27;O27 = A4-A27;O5 = A5+A26;O26 = A5-A26;O6 = A6+A25;O25 = A6-A25;O7 = A7+A24;O24 = A7-A24;O8 = A8+A23;O23 = A8-A23;O9 = A9+A22;O22 = A9-A22;O10 = A10+A21;O21 = A10-A21;O11 = A11+A20;O20 = A11-A20;O12 = A12+A19;O19 = A12-A19;O13 = A13+A18;O18 = A13-A18;O14 = A14+A17;O17 = A14-A17;O15 = A15+A16;O16 = A15-A16;O32 = A32;O56 = A56;O40 = (724*(A55-A40)) >> 10;O55 = (724*(A55+A40)) >> 10;O33 = A33;O57 = A57;O41 = (724*(A54-A41)) >> 10;O54 = (724*(A54+A41)) >> 10;O34 = A34;O58 = A58;O42 = (724*(A53-A42)) >> 10;O53 = (724*(A53+A42)) >> 10;O35 = A35;O59 = A59;O43 = (724*(A52-A43)) >> 10;O52 = (724*(A52+A43)) >> 10;O36 = A36;O60 = A60;O44 = (724*(A51-A44)) >> 10;O51 = (724*(A51+A44)) >> 10;O37 = A37;O61 = A61;O45 = (724*(A50-A45)) >> 10;O50 = (724*(A50+A45)) >> 10;O38 = A38;O62 = A62;O46 = (724*(A49-A46)) >> 10;O49 = (724*(A49+A46)) >> 10;O39 = A39;O63 = A63;O47 = (724*(A48-A47)) >> 10;O48 = (724*(A48+A47)) >> 10;Y0 = O0+O63;Y63 = O0-O63;Y1 = O1+O62;Y62 = O1-O62;Y2 = O2+O61;Y61 = O2-O61;Y3 = O3+O60;Y60 = O3-O60;Y4 = O4+O59;Y59 = O4-O59;Y5 = O5+O58;Y58 = O5-O58;Y6 = O6+O57;Y57 = O6-O57;Y7 = O7+O56;Y56 = O7-O56;Y8 = O8+O55;Y55 = O8-O55;Y9 = O9+O54;Y54 = O9-O54;Y10 = O10+O53;Y53 = O10-O53;Y11 = O11+O52;Y52 = O11-O52;Y12 = O12+O51;Y51 = O12-O51;Y13 = O13+O50;Y50 = O13-O50;Y14 = O14+O49;Y49 = O14-O49;Y15 = O15+O48;Y48 = O15-O48;Y16 = O16+O47;Y47 = O16-O47;Y17 = O17+O46;Y46 = O17-O46;Y18 = O18+O45;Y45 = O18-O45;Y19 = O19+O44;Y44 = O19-O44;Y20 = O20+O43;Y43 = O20-O43;Y21 = O21+O42;Y42 = O21-O42;Y22 = O22+O41;Y41 = O22-O41;Y23 = O23+O40;Y40 = O23-O40;Y24 = O24+O39;Y39 = O24-O39;Y25 = O25+O38;Y38 = O25-O38;Y26 = O26+O37;Y37 = O26-O37;Y27 = O27+O36;Y36 = O27-O36;Y28 = O28+O35;Y35 = O28-O35;Y29 = O29+O34;Y34 = O29-O34;Y30 = O30+O33;Y33 = O30-O33;Y31 = O31+O32;Y32 = O31-O32;
전술한 도 18의 우측에 도시된 변경된 버터플라이 구조의 실시예에 따라서 변환된 32x32 입력 블록에 대하여 1차원 이산 코사인 역변환을 수행하는 경우, X0 내지 X31은 역변환되어야 할 입력값, A0 내지 A31, B0 내지 B31, C0 내지 C31, D0 내지 D31, E0 내지 E31, F0 내지 F31, G0 내지 G31, H0 내지 H31은 중간값, t는 보조 변수, Y0 내지 Y31은 역변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
E0= X0;F24 = X1;F12 = -X2;G16 = -X3;E4 = X4; ;G31 = X5; ;F8 = X6; ;F26 = -X7;E2 = X8; ;F21 = X9; ;F15 = X10; ;G29 = X11;F5 = X12; ;G18 = -X13; ;E13 = X14; ;E22 = X15;E1 = X16; ;E25 = X17; ;E10 = X18; ;G19 = -X19;F7 = X20; ;G28 = -X21 ; ;F14 = X22; ;F20 = -X23;E3 = X24; ;F27 = -X25; ;F9 = X26; ;G30 = -X27;E6 = X28; ;G17 = -X29 ; ;F11 = X30; ;F23 = -X31;;t = (251*(G16 + G17) >> 8);F16 = t - ((201*G17) >> 8);F17 = t - ((301*G16) >> 8);t = (212*(G18 + G19) >> 8);F18 = t - ((70*G19) >> 8);F19 = t - ((355*G18) >> 8); ;t = ((212*(G28 + G29)) >> 8);F28 = t - ((70*G29) >> 8);F29 = t - ((355*G28) >> 8);t = (251*(G30 + G31) >> 8);F30 = t - ((201*G31) >> 8);F31 = t - ((301*G30) >> 8);E5 = ((F5 + F7)*181 >> 8);E7 = ((F5 - F7)*181 >> 8);t = (97*(F8 + F9) >> 8);E8 = t - ((-138*F9) >> 8);E9 = t - ((334*F8) >> 8);;E11 = ((F11 + F12)*181 >> 8);E12 = ((F11 - F12)*181 >> 8);t = (97*(F14 + F15) >> 8);E14 = t - ((-138*F15) >> 8);E15 = t - ((334*F14) >> 8);;E16 = F16 + F18;D18 = F16 - F18;D17 = F17 + F19;E19 = F17 - F19;;t = (236*(F20 + F21) >> 8);E20 = t - ((334*F21) >> 8);E21 = t - ((138*F20) >> 8);E23 = ((F23 + F24)*181 >> 8);E24 = ((F23 - F24)*181 >> 8);;t = (236*(F26 + F27) >> 8);E26 = t - ((334*F27) >> 8);E27 = t - ((138*F26) >> 8);;E28 = -F28 + F30;D30 = F28 + F30;D29 = -F29 + F31;E31 = F29 + F31;;D0 = ((E0 + E1)*181 >> 8);D1 = ((E0 - E1)*181 >> 8);t = (97*(E2 + E3) >> 8);D2 = t - ((334*E3) >> 8);D3 = t - ((-138*E2) >> 8);D4 = E4 + E5;D5 = E4 - E5;D6 = -E6 + E7;D7 = E6 + E7;D8 = E8 + E14;D14 = E8 - E14;D9 = E9 + E15;D15 = E9 - E15;D10 = E10 + E11; ;D11 = E10 - E11;D12 = E12 + E13;D13 = E12 - E13; ;;D16 = ((E16 + E19)*181 >> 8);D19 = ((E16 - E19)*181 >> 8);D20 = E20 + E26;D26 = E20 - E26;D21 = E21 + E27;D27 = E21 - E27;D22 = E22 + E23;D23 = E22 - E23;D24 = E24 + E25;D25 = E24 - E25;D28 = ((E28 + E31)*181 >> 8);D31 = ((E28 - E31)*181 >> 8);;C0 = D0 + D3;C3 = D0 - D3;C1 = D1 + D2;C2 = D1 - D2;t = (49*(D4 + D7) >> 8);C4 = t - ((301*D7) >> 8);C7 = t - ((-201*D4) >> 8);;t = (142*(D5 + D6) >> 8);C5 = t - ((355*D6) >> 8);C6 = t - ((-70*D5) >> 8);C8 = D8 + D11;C11 = D8 - D11;C9 = D9 + D10;C10 = D9 - D10;C12 = D12 + D15;C15 = D12 - D15;C13 = D13 + D14;C14 = D13 - D14;;C16 = D16 + D28;C28 = D16 - D28;C17 = D17 + D29;C29 = D17 - D29;C18 = D18 + D30;C30 = D18 - D30;C19 = D19 + D31;C31 = D19 - D31;C20 = D20 + D23;C23 = D20 - D23;C21 = D21 + D22;C22 = D21 - D22;C24 = D24 + D27;C27 = D24 - D27;C25 = D25 + D26;C26 = D25 - D26;;B0 = C0 + C7;B7 = C0 - C7;B1 = C1 + C6;B6 = C1 - C6;B2 = C2 + C5;B5 = C2 - C5;B3 = C3 + C4;B4 = C3 - C4;;t = (197*(C8 + C15) >> 8);B8 = t - ((360*C15) >> 8);B15 = t - ((35*C8) >> 8);t = (120*(C9 + C14) >> 8);B9 = t - ((-105*C14) >> 8);B14 = t - ((346*C9) >> 8);t = (244*(C10 + C13) >> 8);B10 = t - ((319*C13) >> 8);B13 = t - ((170*C10) >> 8);t = (25*(C11 + C12) >> 8);B11 = t - ((-229*C12) >> 8);B12 = t - ((279*C11) >> 8);B16 = C16 + C23;B23 = C16 - C23; ;B17 = C17 + C22;B22 = C17 - C22;B18 = C18 + C21;B21 = C18 - C21;B19 = C19 + C20;B20 = C19 - C20;B24 = C24 + C31;B31 = C24 - C31; ;B25 = C25 + C30;B30 = C25 - C30;B26 = C26 + C29;B29 = C26 - C29;B27 = C27 + C28;B28 = C27 - C28;A0 = B0 + B15;A1 = B1 + B14;A2 = B2 + B13;A3 = B3 + B12;A4 = B4 + B11;A5 = B5 + B10;A6 = B6 + B9;A7 = B7 + B8;A8 = B7 - B8;A9 = B6 - B9;A10 = B5 - B10;A11 = B4 - B11;A12 = B3 - B12;A13 = B2 - B13;A14 = B1 - B14;A15 = B0 - B15;;t = (171*(B16 + B31) >> 8);A16 = t - ((-17*B31) >> 8);A31 = t - ((361*B16) >> 8);t = (205*(B17 + B30) >> 8);A17 = t - ((358*B30) >> 8);A30 = t - ((53*B17) >> 8);t = (131*(B18 + B29) >> 8);A18 = t - ((-87*B29) >> 8);A29 = t - ((351*B18) >> 8);t = (231*(B19 + B28) >> 8);A19 = t - ((340*B28) >> 8);A28 = t - ((121*B19) >> 8);t = (86*(B20 + B27) >> 8);A20 = t - ((-154*B27) >> 8);A27 = t - ((327*B20) >> 8);t = (248*(B21 + B26) >> 8);A21 = t - ((310*B26) >> 8);A26 = t - ((186*B21) >> 8);t = (37*(B22 + B25) >> 8);A22 = t - ((-215*B25) >> 8);A25 = t - ((290*B22) >> 8);t = (255*(B23 + B24) >> 8);A23 = t - ((243*B24) >> 8);A24 = t - ((268*B23) >> 8);Y0 = A0 + A31;Y31 = A0 - A31;Y1 = A1 + A30;Y30 = A1 - A30;Y2 = A2 + A29;Y29 = A2 - A29;Y3 = A3 + A28;Y28 = A3 - A28;Y4 = A4 + A27;Y27 = A4 - A27;Y5 = A5 + A26;Y26 = A5 - A26;Y6 = A6 + A25;Y25 = A6 - A25;Y7 = A7 + A24;Y24 = A7 - A24;Y8 = A8 + A23;Y23 = A8 - A23;Y9 = A9 + A22;Y22 = A9 - A22;Y10 = A10 + A21;Y21 = A10 - A21;Y11 = A11 + A20;Y20 = A11 - A20;Y12 = A12 + A19;Y19 = A12 - A19;Y13 = A13 + A18;Y18 = A13 - A18;Y14 = A14 + A17;Y17 = A14 - A17;Y15 = A15 + A16;Y16 = A15 - A16 E0= X0; F24 = X1; F12 = -X2; G16 = -X3; E4 = X4; ; G31 = X5; ; F8 = X6; ; F26 = -X7; E2 = X8; ; F21 = X9; ; F15 = X10; ; G29 = X11; F5 = X12; ; G18 = -X13; ; E13 = X14; ; E22 = X15; E1 = X16; ; E25 = X17; ; E10 = X18; ; G19 = -X19; F7 = X20; ; G28 = -X21 ; ; F14 = X22; ; F20 = -X23; E3 = X24; ; F27 = -X25; ; F9 = X26; ; G30 = -X27; E6 = X28; ; G17 = -X29 ; ; F11 = X30; ; F23 = -X31; ; t = (251*(G16 + G17) >> 8); F16 = t - ((201*G17) >> 8); F17 = t - ((301*G16) >> 8); t = (212*(G18 + G19) >> 8); F18 = t - ((70*G19) >> 8); F19 = t - ((355*G18) >> 8); ; t = ((212*(G28 + G29)) >> 8); F28 = t - ((70*G29) >> 8); F29 = t - ((355*G28) >> 8); t = (251*(G30 + G31) >> 8); F30 = t - ((201*G31) >> 8); F31 = t - ((301*G30) >> 8); E5 = ((F5 + F7)*181 >> 8); E7 = ((F5 - F7)*181 >> 8); t = (97*(F8 + F9) >> 8); E8 = t - ((-138*F9) >> 8); E9 = t - ((334*F8) >> 8); ; E11 = ((F11 + F12)*181 >> 8); E12 = ((F11 - F12)*181 >> 8); t = (97*(F14 + F15) >> 8); E14 = t - ((-138*F15) >> 8); E15 = t - ((334*F14) >> 8); ; E16 = F16 + F18; D18 = F16 - F18; D17 = F17 + F19; E19 = F17 - F19;; t = (236*(F20 + F21) >> 8); E20 = t - ((334*F21) >> 8); E21 = t - ((138*F20) >> 8); E23 = ((F23 + F24)*181 >> 8); E24 = ((F23 - F24)*181 >> 8); ; t = (236*(F26 + F27) >> 8); E26 = t - ((334*F27) >> 8); E27 = t - ((138*F26) >> 8); ; E28 = -F28 + F30; D30 = F28 + F30; D29 = -F29 + F31; E31 = F29 + F31; ; D0 = ((E0 + E1)*181 >> 8); D1 = ((E0 - E1)*181 >> 8); t = (97*(E2 + E3) >> 8); D2 = t - ((334*E3) >> 8); D3 = t - ((-138*E2) >> 8); D4 = E4 + E5; D5 = E4 - E5; D6 = -E6 + E7; D7 = E6 + E7; D8 = E8 + E14; D14 = E8 - E14; D9 = E9 + E15; D15 = E9 - E15; D10 = E10 + E11; ; D11 = E10 - E11; D12 = E12 + E13; D13 = E12 - E13; ; ; D16 = ((E16 + E19)*181 >> 8); D19 = ((E16 - E19)*181 >> 8); D20 = E20 + E26; D26 = E20 - E26; D21 = E21 + E27; D27 = E21 - E27; D22 = E22 + E23; D23 = E22 - E23; D24 = E24 + E25; D25 = E24 - E25; D28 = ((E28 + E31)*181 >> 8); D31 = ((E28 - E31)*181 >> 8); ; C0 = D0 + D3; C3 = D0 - D3; C1 = D1 + D2; C2 = D1 - D2; t = (49*(D4 + D7) >> 8); C4 = t - ((301*D7) >> 8); C7 = t - ((-201*D4) >> 8); ; t = (142*(D5 + D6) >> 8); C5 = t - ((355*D6) >> 8); C6 = t - ((-70*D5) >> 8); C8 = D8 + D11; C11 = D8 - D11; C9 = D9 + D10; C10 = D9 - D10; C12 = D12 + D15; C15 = D12 - D15; C13 = D13 + D14; C14 = D13 - D14; ; C16 = D16 + D28; C28 = D16 - D28; C17 = D17 + D29; C29 = D17 - D29; C18 = D18 + D30; C30 = D18 - D30; C19 = D19 + D31; C31 = D19 - D31; C20 = D20 + D23; C23 = D20 - D23; C21 = D21 + D22; C22 = D21 - D22; C24 = D24 + D27; C27 = D24 - D27; C25 = D25 + D26; C26 = D25 - D26; ; B0 = C0 + C7; B7 = C0 - C7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + C4; B4 = C3 - C4; ; t = (197*(C8 + C15) >> 8); B8 = t - ((360*C15) >> 8); B15 = t - ((35*C8) >> 8); t = (120*(C9 + C14) >> 8); B9 = t - ((-105*C14) >> 8); B14 = t - ((346*C9) >> 8); t = (244*(C10 + C13) >> 8); B10 = t - ((319*C13) >> 8); B13 = t - ((170*C10) >> 8); t = (25*(C11 + C12) >> 8); B11 = t - ((-229*C12) >> 8); B12 = t - ((279*C11) >> 8); B16 = C16 + C23; B23 = C16 - C23; ; B17 = C17 + C22; B22 = C17 - C22; B18 = C18 + C21; B21 = C18 - C21; B19 = C19 + C20; B20 = C19 - C20; B24 = C24 + C31; B31 = C24 - C31; ; B25 = C25 + C30; B30 = C25 - C30; B26 = C26 + C29; B29 = C26 - C29; B27 = C27 + C28; B28 = C27 - C28; A0 = B0 + B15; A1 = B1 + B14; A2 = B2 + B13; A3 = B3 + B12; A4 = B4 + B11; A5 = B5 + B10; A6 = B6 + B9; A7 = B7 + B8; A8 = B7 - B8; A9 = B6 - B9; A10 = B5 - B10; A11 = B4 - B11; A12 = B3 - B12; A13 = B2 - B13; A14 = B1 - B14; A15 = B0 - B15; ; t = (171*(B16 + B31) >> 8); A16 = t - ((-17*B31) >> 8); A31 = t - ((361*B16) >> 8); t = (205*(B17 + B30) >> 8); A17 = t - ((358*B30) >> 8); A30 = t - ((53*B17) >> 8); t = (131*(B18 + B29) >> 8); A18 = t - ((-87*B29) >> 8); A29 = t - ((351*B18) >> 8); t = (231*(B19 + B28) >> 8); A19 = t - ((340*B28) >> 8); A28 = t - ((121*B19) >> 8); t = (86*(B20 + B27) >> 8); A20 = t - ((-154*B27) >> 8); A27 = t - ((327*B20) >> 8); t = (248*(B21 + B26) >> 8); A21 = t - ((310*B26) >> 8); A26 = t - ((186*B21) >> 8); t = (37*(B22 + B25) >> 8); A22 = t - ((-215*B25) >> 8); A25 = t - ((290*B22) >> 8); t = (255*(B23 + B24) >> 8); A23 = t - ((243*B24) >> 8); A24 = t - ((268*B23) >> 8); Y0 = A0 + A31; Y31 = A0 - A31; Y1 = A1 + A30; Y30 = A1 - A30; Y2 = A2 + A29; Y29 = A2 - A29; Y3 = A3 + A28; Y28 = A3 - A28; Y4 = A4 + A27; Y27 = A4 - A27; Y5 = A5 + A26; Y26 = A5 - A26; Y6 = A6 + A25; Y25 = A6 - A25; Y7 = A7 + A24; Y24 = A7 - A24; Y8 = A8 + A23; Y23 = A8 - A23; Y9 = A9 + A22; Y22 = A9 - A22; Y10 = A10 + A21; Y21 = A10 - A21; Y11 = A11 + A20; Y20 = A11 - A20; Y12 = A12 + A19; Y19 = A12 - A19; Y13 = A13 + A18; Y18 = A13 - A18; Y14 = A14 + A17; Y17 = A14 - A17; Y15 = A15 + A16; Y16 = A15 - A16 E0= X0; F24 = X1; F12 = -X2; G16 = -X3; E4 = X4; ; G31 = X5; ; F8 = X6; ; F26 = -X7; E2 = X8; ; F21 = X9; ; F15 = X10; ; G29 = X11; F5 = X12; ; G18 = -X13; ; E13 = X14; ; E22 = X15; E1 = X16; ; E25 = X17; ; E10 = X18; ; G19 = -X19; F7 = X20; ; G28 = -X21 ; ; F14 = X22; ; F20 = -X23; E3 = X24; ; F27 = -X25; ; F9 = X26; ; G30 = -X27; E6 = X28; ; G17 = -X29 ; ; F11 = X30; ; F23 = -X31; ; t = (251*(G16 + G17) >> 8); F16 = t - ((201*G17) >> 8); F17 = t - ((301*G16) >> 8); t = (212*(G18 + G19) >> 8); F18 = t - ((70*G19) >> 8); F19 = t - ((355*G18) >> 8); ; t = ((212*(G28 + G29)) >> 8); F28 = t - ((70*G29) >> 8); F29 = t - ((355*G28) >> 8); t = (251*(G30 + G31) >> 8); F30 = t - ((201*G31) >> 8); F31 = t - ((301*G30) >> 8); E5 = ((F5 + F7)*181 >> 8); E7 = ((F5 - F7)*181 >> 8); t = (97*(F8 + F9) >> 8); E8 = t - ((-138*F9) >> 8); E9 = t - ((334*F8) >> 8); ; E11 = ((F11 + F12)*181 >> 8); E12 = ((F11 - F12)*181 >> 8); t = (97*(F14 + F15) >> 8); E14 = t - ((-138*F15) >> 8); E15 = t - ((334*F14) >> 8); ; E16 = F16 + F18; D18 = F16 - F18; D17 = F17 + F19; E19 = F17 - F19;; t = (236*(F20 + F21) >> 8); E20 = t - ((334*F21) >> 8); E21 = t - ((138*F20) >> 8); E23 = ((F23 + F24)*181 >> 8); E24 = ((F23 - F24)*181 >> 8); ; t = (236*(F26 + F27) >> 8); E26 = t - ((334*F27) >> 8); E27 = t - ((138*F26) >> 8); ; E28 = -F28 + F30; D30 = F28 + F30; D29 = -F29 + F31; E31 = F29 + F31; ; D0 = ((E0 + E1)*181 >> 8); D1 = ((E0 - E1)*181 >> 8); t = (97*(E2 + E3) >> 8); D2 = t - ((334*E3) >> 8); D3 = t - ((-138*E2) >> 8); D4 = E4 + E5; D5 = E4 - E5; D6 = -E6 + E7; D7 = E6 + E7; D8 = E8 + E14; D14 = E8 - E14; D9 = E9 + E15; D15 = E9 - E15; D10 = E10 + E11; ; D11 = E10 - E11; D12 = E12 + E13; D13 = E12 - E13; ; ; D16 = ((E16 + E19)*181 >> 8); D19 = ((E16 - E19)*181 >> 8); D20 = E20 + E26; D26 = E20 - E26; D21 = E21 + E27; D27 = E21 - E27; D22 = E22 + E23; D23 = E22 - E23; D24 = E24 + E25; D25 = E24 - E25; D28 = ((E28 + E31)*181 >> 8); D31 = ((E28 - E31)*181 >> 8); ; C0 = D0 + D3; C3 = D0 - D3; C1 = D1 + D2; C2 = D1 - D2; t = (49*(D4 + D7) >> 8); C4 = t - ((301*D7) >> 8); C7 = t - ((-201*D4) >> 8); ; t = (142*(D5 + D6) >> 8); C5 = t - ((355*D6) >> 8); C6 = t - ((-70*D5) >> 8); C8 = D8 + D11; C11 = D8 - D11; C9 = D9 + D10; C10 = D9 - D10; C12 = D12 + D15; C15 = D12 - D15; C13 = D13 + D14; C14 = D13 - D14; ; C16 = D16 + D28; C28 = D16 - D28; C17 = D17 + D29; C29 = D17 - D29; C18 = D18 + D30; C30 = D18 - D30; C19 = D19 + D31; C31 = D19 - D31; C20 = D20 + D23; C23 = D20 - D23; C21 = D21 + D22; C22 = D21 - D22; C24 = D24 + D27; C27 = D24 - D27; C25 = D25 + D26; C26 = D25 - D26; ; B0 = C0 + C7; B7 = C0 - C7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + C4; B4 = C3 - C4; ; t = (197*(C8 + C15) >> 8); B8 = t - ((360*C15) >> 8); B15 = t - ((35*C8) >> 8); t = (120*(C9 + C14) >> 8); B9 = t - ((-105*C14) >> 8); B14 = t - ((346*C9) >> 8); t = (244*(C10 + C13) >> 8); B10 = t - ((319*C13) >> 8); B13 = t - ((170*C10) >> 8); t = (25*(C11 + C12) >> 8); B11 = t - ((-229*C12) >> 8); B12 = t - ((279*C11) >> 8); B16 = C16 + C23; B23 = C16 - C23; ; B17 = C17 + C22; B22 = C17 - C22; B18 = C18 + C21; B21 = C18 - C21; B19 = C19 + C20; B20 = C19 - C20; B24 = C24 + C31; B31 = C24 - C31; ; B25 = C25 + C30; B30 = C25 - C30; B26 = C26 + C29; B29 = C26 - C29; B27 = C27 + C28; B28 = C27 - C28; A0 = B0 + B15; A1 = B1 + B14; A2 = B2 + B13; A3 = B3 + B12; A4 = B4 + B11; A5 = B5 + B10; A6 = B6 + B9; A7 = B7 + B8; A8 = B7 - B8; A9 = B6 - B9; A10 = B5 - B10; A11 = B4 - B11; A12 = B3 - B12; A13 = B2 - B13; A14 = B1 - B14; A15 = B0 - B15; ; t = (171*(B16 + B31) >> 8); A16 = t - ((-17*B31) >> 8); A31 = t - ((361*B16) >> 8); t = (205*(B17 + B30) >> 8); A17 = t - ((358*B30) >> 8); A30 = t - ((53*B17) >> 8); t = (131*(B18 + B29) >> 8); A18 = t - ((-87*B29) >> 8); A29 = t - ((351*B18) >> 8); t = (231*(B19 + B28) >> 8); A19 = t - ((340*B28) >> 8); A28 = t - ((121*B19) >> 8); t = (86*(B20 + B27) >> 8); A20 = t - ((-154*B27) >> 8); A27 = t - ((327*B20) >> 8); t = (248*(B21 + B26) >> 8); A21 = t - ((310*B26) >> 8); A26 = t - ((186*B21) >> 8); t = (37*(B22 + B25) >> 8); A22 = t - ((-215*B25) >> 8); A25 = t - ((290*B22) >> 8); t = (255*(B23 + B24) >> 8); A23 = t - ((243*B24) >> 8); A24 = t - ((268*B23) >> 8); Y0 = A0 + A31; Y31 = A0 - A31; Y1 = A1 + A30; Y30 = A1 - A30; Y2 = A2 + A29; Y29 = A2 - A29; Y3 = A3 + A28; Y28 = A3 - A28; Y4 = A4 + A27; Y27 = A4 - A27; Y5 = A5 + A26; Y26 = A5 - A26; Y6 = A6 + A25; Y25 = A6 - A25; Y7 = A7 + A24; Y24 = A7 - A24; Y8 = A8 + A23; Y23 = A8 - A23; Y9 = A9 + A22; Y22 = A9 - A22; Y10 = A10 + A21; Y21 = A10 - A21; Y11 = A11 + A20; Y20 = A11 - A20; Y12 = A12 + A19; Y19 = A12 - A19; Y13 = A13 + A18; Y18 = A13 - A18; Y14 = A14 + A17; Y17 = A14 - A17; Y15 = A15 + A16; Y16 = A15 - A16 E0= X0; F24 = X1; F12 = -X2; G16 = -X3; E4 = X4; ; G31 = X5; ; F8 = X6; ; F26 = -X7; E2 = X8; ; F21 = X9; ; F15 = X10; ; G29 = X11; F5 = X12; ; G18 = -X13; ; E13 = X14; ; E22 = X15; E1 = X16; ; E25 = X17; ; E10 = X18; ; G19 = -X19; F7 = X20; ; G28 = -X21 ; ; F14 = X22; ; F20 = -X23; E3 = X24; ; F27 = -X25; ; F9 = X26; ; G30 = -X27; E6 = X28; ; G17 = -X29 ; ; F11 = X30; ; F23 = -X31; ; t = (251*(G16 + G17) >> 8); F16 = t - ((201*G17) >> 8); F17 = t - ((301*G16) >> 8); t = (212*(G18 + G19) >> 8); F18 = t - ((70*G19) >> 8); F19 = t - ((355*G18) >> 8); ; t = ((212*(G28 + G29)) >> 8); F28 = t - ((70*G29) >> 8); F29 = t - ((355*G28) >> 8); t = (251*(G30 + G31) >> 8); F30 = t - ((201*G31) >> 8); F31 = t - ((301*G30) >> 8); E5 = ((F5 + F7)*181 >> 8); E7 = ((F5 - F7)*181 >> 8); t = (97*(F8 + F9) >> 8); E8 = t - ((-138*F9) >> 8); E9 = t - ((334*F8) >> 8); ; E11 = ((F11 + F12)*181 >> 8); E12 = ((F11 - F12)*181 >> 8); t = (97*(F14 + F15) >> 8); E14 = t - ((-138*F15) >> 8); E15 = t - ((334*F14) >> 8); ; E16 = F16 + F18; D18 = F16 - F18; D17 = F17 + F19; E19 = F17 - F19;; t = (236*(F20 + F21) >> 8); E20 = t - ((334*F21) >> 8); E21 = t - ((138*F20) >> 8); E23 = ((F23 + F24)*181 >> 8); E24 = ((F23 - F24)*181 >> 8); ; t = (236*(F26 + F27) >> 8); E26 = t - ((334*F27) >> 8); E27 = t - ((138*F26) >> 8); ; E28 = -F28 + F30; D30 = F28 + F30; D29 = -F29 + F31; E31 = F29 + F31; ; D0 = ((E0 + E1)*181 >> 8); D1 = ((E0 - E1)*181 >> 8); t = (97*(E2 + E3) >> 8); D2 = t - ((334*E3) >> 8); D3 = t - ((-138*E2) >> 8); D4 = E4 + E5; D5 = E4 - E5; D6 = -E6 + E7; D7 = E6 + E7; D8 = E8 + E14; D14 = E8 - E14; D9 = E9 + E15; D15 = E9 - E15; D10 = E10 + E11; ; D11 = E10 - E11; D12 = E12 + E13; D13 = E12 - E13; ; ; D16 = ((E16 + E19)*181 >> 8); D19 = ((E16 - E19)*181 >> 8); D20 = E20 + E26; D26 = E20 - E26; D21 = E21 + E27; D27 = E21 - E27; D22 = E22 + E23; D23 = E22 - E23; D24 = E24 + E25; D25 = E24 - E25; D28 = ((E28 + E31)*181 >> 8); D31 = ((E28 - E31)*181 >> 8); ; C0 = D0 + D3; C3 = D0 - D3; C1 = D1 + D2; C2 = D1 - D2; t = (49*(D4 + D7) >> 8); C4 = t - ((301*D7) >> 8); C7 = t - ((-201*D4) >> 8); ; t = (142*(D5 + D6) >> 8); C5 = t - ((355*D6) >> 8); C6 = t - ((-70*D5) >> 8); C8 = D8 + D11; C11 = D8 - D11; C9 = D9 + D10; C10 = D9 - D10; C12 = D12 + D15; C15 = D12 - D15; C13 = D13 + D14; C14 = D13 - D14; ; C16 = D16 + D28; C28 = D16 - D28; C17 = D17 + D29; C29 = D17 - D29; C18 = D18 + D30; C30 = D18 - D30; C19 = D19 + D31; C31 = D19 - D31; C20 = D20 + D23; C23 = D20 - D23; C21 = D21 + D22; C22 = D21 - D22; C24 = D24 + D27; C27 = D24 - D27; C25 = D25 + D26; C26 = D25 - D26; ; B0 = C0 + C7; B7 = C0 - C7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + C4; B4 = C3 - C4; ; t = (197*(C8 + C15) >> 8); B8 = t - ((360*C15) >> 8); B15 = t - ((35*C8) >> 8); t = (120*(C9 + C14) >> 8); B9 = t - ((-105*C14) >> 8); B14 = t - ((346*C9) >> 8); t = (244*(C10 + C13) >> 8); B10 = t - ((319*C13) >> 8); B13 = t - ((170*C10) >> 8); t = (25*(C11 + C12) >> 8); B11 = t - ((-229*C12) >> 8); B12 = t - ((279*C11) >> 8); B16 = C16 + C23; B23 = C16 - C23; ; B17 = C17 + C22; B22 = C17 - C22; B18 = C18 + C21; B21 = C18 - C21; B19 = C19 + C20; B20 = C19 - C20; B24 = C24 + C31; B31 = C24 - C31; ; B25 = C25 + C30; B30 = C25 - C30; B26 = C26 + C29; B29 = C26 - C29; B27 = C27 + C28; B28 = C27 - C28; A0 = B0 + B15; A1 = B1 + B14; A2 = B2 + B13; A3 = B3 + B12; A4 = B4 + B11; A5 = B5 + B10; A6 = B6 + B9; A7 = B7 + B8; A8 = B7 - B8; A9 = B6 - B9; A10 = B5 - B10; A11 = B4 - B11; A12 = B3 - B12; A13 = B2 - B13; A14 = B1 - B14; A15 = B0 - B15; ; t = (171*(B16 + B31) >> 8); A16 = t - ((-17*B31) >> 8); A31 = t - ((361*B16) >> 8); t = (205*(B17 + B30) >> 8); A17 = t - ((358*B30) >> 8); A30 = t - ((53*B17) >> 8); t = (131*(B18 + B29) >> 8); A18 = t - ((-87*B29) >> 8); A29 = t - ((351*B18) >> 8); t = (231*(B19 + B28) >> 8); A19 = t - ((340*B28) >> 8); A28 = t - ((121*B19) >> 8); t = (86*(B20 + B27) >> 8); A20 = t - ((-154*B27) >> 8); A27 = t - ((327*B20) >> 8); t = (248*(B21 + B26) >> 8); A21 = t - ((310*B26) >> 8); A26 = t - ((186*B21) >> 8); t = (37*(B22 + B25) >> 8); A22 = t - ((-215*B25) >> 8); A25 = t - ((290*B22) >> 8); t = (255*(B23 + B24) >> 8); A23 = t - ((243*B24) >> 8); A24 = t - ((268*B23) >> 8); Y0 = A0 + A31; Y31 = A0 - A31; Y1 = A1 + A30; Y30 = A1 - A30; Y2 = A2 + A29; Y29 = A2 - A29; Y3 = A3 + A28; Y28 = A3 - A28; Y4 = A4 + A27; Y27 = A4 - A27; Y5 = A5 + A26; Y26 = A5 - A26; Y6 = A6 + A25; Y25 = A6 - A25; Y7 = A7 + A24; Y24 = A7 - A24; Y8 = A8 + A23; Y23 = A8 - A23; Y9 = A9 + A22; Y22 = A9 - A22; Y10 = A10 + A21; Y21 = A10 - A21; Y11 = A11 + A20; Y20 = A11 - A20; Y12 = A12 + A19; Y19 = A12 - A19; Y13 = A13 + A18; Y18 = A13 - A18; Y14 = A14 + A17; Y17 = A14 - A17; Y15 = A15 + A16; Y16 = A15 - A16 E0= X0; F24 = X1; F12 = -X2; G16 = -X3; E4 = X4; ; G31 = X5; ; F8 = X6; ; F26 = -X7; E2 = X8; ; F21 = X9; ; F15 = X10; ; G29 = X11; F5 = X12; ; G18 = -X13; ; E13 = X14; ; E22 = X15; E1 = X16; ; E25 = X17; ; E10 = X18; ; G19 = -X19; F7 = X20; ; G28 = -X21 ; ; F14 = X22; ; F20 = -X23; E3 = X24; ; F27 = -X25; ; F9 = X26; ; G30 = -X27; E6 = X28; ; G17 = -X29 ; ; F11 = X30; ; F23 = -X31; ; t = (251*(G16 + G17) >> 8); F16 = t - ((201*G17) >> 8); F17 = t - ((301*G16) >> 8); t = (212*(G18 + G19) >> 8); F18 = t - ((70*G19) >> 8); F19 = t - ((355*G18) >> 8); ; t = ((212*(G28 + G29)) >> 8); F28 = t - ((70*G29) >> 8); F29 = t - ((355*G28) >> 8); t = (251*(G30 + G31) >> 8); F30 = t - ((201*G31) >> 8); F31 = t - ((301*G30) >> 8); E5 = ((F5 + F7)*181 >> 8); E7 = ((F5 - F7)*181 >> 8); t = (97*(F8 + F9) >> 8); E8 = t - ((-138*F9) >> 8); E9 = t - ((334*F8) >> 8); ; E11 = ((F11 + F12)*181 >> 8); E12 = ((F11 - F12)*181 >> 8); t = (97*(F14 + F15) >> 8); E14 = t - ((-138*F15) >> 8); E15 = t - ((334*F14) >> 8); ; E16 = F16 + F18; D18 = F16 - F18; D17 = F17 + F19; E19 = F17 - F19;; t = (236*(F20 + F21) >> 8); E20 = t - ((334*F21) >> 8); E21 = t - ((138*F20) >> 8); E23 = ((F23 + F24)*181 >> 8); E24 = ((F23 - F24)*181 >> 8); ; t = (236*(F26 + F27) >> 8); E26 = t - ((334*F27) >> 8); E27 = t - ((138*F26) >> 8); ; E28 = -F28 + F30; D30 = F28 + F30; D29 = -F29 + F31; E31 = F29 + F31; ; D0 = ((E0 + E1)*181 >> 8); D1 = ((E0 - E1)*181 >> 8); t = (97*(E2 + E3) >> 8); D2 = t - ((334*E3) >> 8); D3 = t - ((-138*E2) >> 8); D4 = E4 + E5; D5 = E4 - E5; D6 = -E6 + E7; D7 = E6 + E7; D8 = E8 + E14; D14 = E8 - E14; D9 = E9 + E15; D15 = E9 - E15; D10 = E10 + E11; ; D11 = E10 - E11; D12 = E12 + E13; D13 = E12 - E13; ; ; D16 = ((E16 + E19)*181 >> 8); D19 = ((E16 - E19)*181 >> 8); D20 = E20 + E26; D26 = E20 - E26; D21 = E21 + E27; D27 = E21 - E27; D22 = E22 + E23; D23 = E22 - E23; D24 = E24 + E25; D25 = E24 - E25; D28 = ((E28 + E31)*181 >> 8); D31 = ((E28 - E31)*181 >> 8); ; C0 = D0 + D3; C3 = D0 - D3; C1 = D1 + D2; C2 = D1 - D2; t = (49*(D4 + D7) >> 8); C4 = t - ((301*D7) >> 8); C7 = t - ((-201*D4) >> 8); ; t = (142*(D5 + D6) >> 8); C5 = t - ((355*D6) >> 8); C6 = t - ((-70*D5) >> 8); C8 = D8 + D11; C11 = D8 - D11; C9 = D9 + D10; C10 = D9 - D10; C12 = D12 + D15; C15 = D12 - D15; C13 = D13 + D14; C14 = D13 - D14; ; C16 = D16 + D28; C28 = D16 - D28; C17 = D17 + D29; C29 = D17 - D29; C18 = D18 + D30; C30 = D18 - D30; C19 = D19 + D31; C31 = D19 - D31; C20 = D20 + D23; C23 = D20 - D23; C21 = D21 + D22; C22 = D21 - D22; C24 = D24 + D27; C27 = D24 - D27; C25 = D25 + D26; C26 = D25 - D26; ; B0 = C0 + C7; B7 = C0 - C7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + C4; B4 = C3 - C4; ; t = (197*(C8 + C15) >> 8); B8 = t - ((360*C15) >> 8); B15 = t - ((35*C8) >> 8); t = (120*(C9 + C14) >> 8); B9 = t - ((-105*C14) >> 8); B14 = t - ((346*C9) >> 8); t = (244*(C10 + C13) >> 8); B10 = t - ((319*C13) >> 8); B13 = t - ((170*C10) >> 8); t = (25*(C11 + C12) >> 8); B11 = t - ((-229*C12) >> 8); B12 = t - ((279*C11) >> 8); B16 = C16 + C23; B23 = C16 - C23; ; B17 = C17 + C22; B22 = C17 - C22; B18 = C18 + C21; B21 = C18 - C21; B19 = C19 + C20; B20 = C19 - C20; B24 = C24 + C31; B31 = C24 - C31; ; B25 = C25 + C30; B30 = C25 - C30; B26 = C26 + C29; B29 = C26 - C29; B27 = C27 + C28; B28 = C27 - C28; A0 = B0 + B15; A1 = B1 + B14; A2 = B2 + B13; A3 = B3 + B12; A4 = B4 + B11; A5 = B5 + B10; A6 = B6 + B9; A7 = B7 + B8; A8 = B7 - B8; A9 = B6 - B9; A10 = B5 - B10; A11 = B4 - B11; A12 = B3 - B12; A13 = B2 - B13; A14 = B1 - B14; A15 = B0 - B15; ; t = (171*(B16 + B31) >> 8); A16 = t - ((-17*B31) >> 8); A31 = t - ((361*B16) >> 8); t = (205*(B17 + B30) >> 8); A17 = t - ((358*B30) >> 8); A30 = t - ((53*B17) >> 8); t = (131*(B18 + B29) >> 8); A18 = t - ((-87*B29) >> 8); A29 = t - ((351*B18) >> 8); t = (231*(B19 + B28) >> 8); A19 = t - ((340*B28) >> 8); A28 = t - ((121*B19) >> 8); t = (86*(B20 + B27) >> 8); A20 = t - ((-154*B27) >> 8); A27 = t - ((327*B20) >> 8); t = (248*(B21 + B26) >> 8); A21 = t - ((310*B26) >> 8); A26 = t - ((186*B21) >> 8); t = (37*(B22 + B25) >> 8); A22 = t - ((-215*B25) >> 8); A25 = t - ((290*B22) >> 8); t = (255*(B23 + B24) >> 8); A23 = t - ((243*B24) >> 8); A24 = t - ((268*B23) >> 8); Y0 = A0 + A31; Y31 = A0 - A31; Y1 = A1 + A30; Y30 = A1 - A30; Y2 = A2 + A29; Y29 = A2 - A29; Y3 = A3 + A28; Y28 = A3 - A28; Y4 = A4 + A27; Y27 = A4 - A27; Y5 = A5 + A26; Y26 = A5 - A26; Y6 = A6 + A25; Y25 = A6 - A25; Y7 = A7 + A24; Y24 = A7 - A24; Y8 = A8 + A23; Y23 = A8 - A23; Y9 = A9 + A22; Y22 = A9 - A22; Y10 = A10 + A21; Y21 = A10 - A21; Y11 = A11 + A20; Y20 = A11 - A20; Y12 = A12 + A19; Y19 = A12 - A19; Y13 = A13 + A18; Y18 = A13 - A18; Y14 = A14 + A17; Y17 = A14 - A17; Y15 = A15 + A16; Y16 = A15 - A16 E0= X0; F24 = X1; F12 = -X2; G16 = -X3; E4 = X4; ; G31 = X5; ; F8 = X6; ; F26 = -X7; E2 = X8; ; F21 = X9; ; F15 = X10; ; G29 = X11; F5 = X12; ; G18 = -X13; ; E13 = X14; ; E22 = X15; E1 = X16; ; E25 = X17; ; E10 = X18; ; G19 = -X19; F7 = X20; ; G28 = -X21 ; ; F14 = X22; ; F20 = -X23; E3 = X24; ; F27 = -X25; ; F9 = X26; ; G30 = -X27; E6 = X28; ; G17 = -X29 ; ; F11 = X30; ; F23 = -X31; ; t = (251*(G16 + G17) >> 8); F16 = t - ((201*G17) >> 8); F17 = t - ((301*G16) >> 8); t = (212*(G18 + G19) >> 8); F18 = t - ((70*G19) >> 8); F19 = t - ((355*G18) >> 8); ; t = ((212*(G28 + G29)) >> 8); F28 = t - ((70*G29) >> 8); F29 = t - ((355*G28) >> 8); t = (251*(G30 + G31) >> 8); F30 = t - ((201*G31) >> 8); F31 = t - ((301*G30) >> 8); E5 = ((F5 + F7)*181 >> 8); E7 = ((F5 - F7)*181 >> 8); t = (97*(F8 + F9) >> 8); E8 = t - ((-138*F9) >> 8); E9 = t - ((334*F8) >> 8); ; E11 = ((F11 + F12)*181 >> 8); E12 = ((F11 - F12)*181 >> 8); t = (97*(F14 + F15) >> 8); E14 = t - ((-138*F15) >> 8); E15 = t - ((334*F14) >> 8); ; E16 = F16 + F18; D18 = F16 - F18; D17 = F17 + F19; E19 = F17 - F19;; t = (236*(F20 + F21) >> 8); E20 = t - ((334*F21) >> 8); E21 = t - ((138*F20) >> 8); E23 = ((F23 + F24)*181 >> 8); E24 = ((F23 - F24)*181 >> 8); ; t = (236*(F26 + F27) >> 8); E26 = t - ((334*F27) >> 8); E27 = t - ((138*F26) >> 8); ; E28 = -F28 + F30; D30 = F28 + F30; D29 = -F29 + F31; E31 = F29 + F31; ; D0 = ((E0 + E1)*181 >> 8); D1 = ((E0 - E1)*181 >> 8); t = (97*(E2 + E3) >> 8); D2 = t - ((334*E3) >> 8); D3 = t - ((-138*E2) >> 8); D4 = E4 + E5; D5 = E4 - E5; D6 = -E6 + E7; D7 = E6 + E7; D8 = E8 + E14; D14 = E8 - E14; D9 = E9 + E15; D15 = E9 - E15; D10 = E10 + E11; ; D11 = E10 - E11; D12 = E12 + E13; D13 = E12 - E13; ; ; D16 = ((E16 + E19)*181 >> 8); D19 = ((E16 - E19)*181 >> 8); D20 = E20 + E26; D26 = E20 - E26; D21 = E21 + E27; D27 = E21 - E27; D22 = E22 + E23; D23 = E22 - E23; D24 = E24 + E25; D25 = E24 - E25; D28 = ((E28 + E31)*181 >> 8); D31 = ((E28 - E31)*181 >> 8); ; C0 = D0 + D3; C3 = D0 - D3; C1 = D1 + D2; C2 = D1 - D2; t = (49*(D4 + D7) >> 8); C4 = t - ((301*D7) >> 8); C7 = t - ((-201*D4) >> 8); ; t = (142*(D5 + D6) >> 8); C5 = t - ((355*D6) >> 8); C6 = t - ((-70*D5) >> 8); C8 = D8 + D11; C11 = D8 - D11; C9 = D9 + D10; C10 = D9 - D10; C12 = D12 + D15; C15 = D12 - D15; C13 = D13 + D14; C14 = D13 - D14; ; C16 = D16 + D28; C28 = D16 - D28; C17 = D17 + D29; C29 = D17 - D29; C18 = D18 + D30; C30 = D18 - D30; C19 = D19 + D31; C31 = D19 - D31; C20 = D20 + D23; C23 = D20 - D23; C21 = D21 + D22; C22 = D21 - D22; C24 = D24 + D27; C27 = D24 - D27; C25 = D25 + D26; C26 = D25 - D26; ; B0 = C0 + C7; B7 = C0 - C7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + C4; B4 = C3 - C4; ; t = (197*(C8 + C15) >> 8); B8 = t - ((360*C15) >> 8); B15 = t - ((35*C8) >> 8); t = (120*(C9 + C14) >> 8); B9 = t - ((-105*C14) >> 8); B14 = t - ((346*C9) >> 8); t = (244*(C10 + C13) >> 8); B10 = t - ((319*C13) >> 8); B13 = t - ((170*C10) >> 8); t = (25*(C11 + C12) >> 8); B11 = t - ((-229*C12) >> 8); B12 = t - ((279*C11) >> 8); B16 = C16 + C23; B23 = C16 - C23; ; B17 = C17 + C22; B22 = C17 - C22; B18 = C18 + C21; B21 = C18 - C21; B19 = C19 + C20; B20 = C19 - C20; B24 = C24 + C31; B31 = C24 - C31; ; B25 = C25 + C30; B30 = C25 - C30; B26 = C26 + C29; B29 = C26 - C29; B27 = C27 + C28; B28 = C27 - C28; A0 = B0 + B15; A1 = B1 + B14; A2 = B2 + B13; A3 = B3 + B12; A4 = B4 + B11; A5 = B5 + B10; A6 = B6 + B9; A7 = B7 + B8; A8 = B7 - B8; A9 = B6 - B9; A10 = B5 - B10; A11 = B4 - B11; A12 = B3 - B12; A13 = B2 - B13; A14 = B1 - B14; A15 = B0 - B15; ; t = (171*(B16 + B31) >> 8); A16 = t - ((-17*B31) >> 8); A31 = t - ((361*B16) >> 8); t = (205*(B17 + B30) >> 8); A17 = t - ((358*B30) >> 8); A30 = t - ((53*B17) >> 8); t = (131*(B18 + B29) >> 8); A18 = t - ((-87*B29) >> 8); A29 = t - ((351*B18) >> 8); t = (231*(B19 + B28) >> 8); A19 = t - ((340*B28) >> 8); A28 = t - ((121*B19) >> 8); t = (86*(B20 + B27) >> 8); A20 = t - ((-154*B27) >> 8); A27 = t - ((327*B20) >> 8); t = (248*(B21 + B26) >> 8); A21 = t - ((310*B26) >> 8); A26 = t - ((186*B21) >> 8); t = (37*(B22 + B25) >> 8); A22 = t - ((-215*B25) >> 8); A25 = t - ((290*B22) >> 8); t = (255*(B23 + B24) >> 8); A23 = t - ((243*B24) >> 8); A24 = t - ((268*B23) >> 8); Y0 = A0 + A31; Y31 = A0 - A31; Y1 = A1 + A30; Y30 = A1 - A30; Y2 = A2 + A29; Y29 = A2 - A29; Y3 = A3 + A28; Y28 = A3 - A28; Y4 = A4 + A27; Y27 = A4 - A27; Y5 = A5 + A26; Y26 = A5 - A26; Y6 = A6 + A25; Y25 = A6 - A25; Y7 = A7 + A24; Y24 = A7 - A24; Y8 = A8 + A23; Y23 = A8 - A23; Y9 = A9 + A22; Y22 = A9 - A22; Y10 = A10 + A21; Y21 = A10 - A21; Y11 = A11 + A20; Y20 = A11 - A20; Y12 = A12 + A19; Y19 = A12 - A19; Y13 = A13 + A18; Y18 = A13 - A18; Y14 = A14 + A17; Y17 = A14 - A17; Y15 = A15 + A16; Y16 = A15 - A16 E0= X0; F24 = X1; F12 = -X2; G16 = -X3; E4 = X4; ; G31 = X5; ; F8 = X6; ; F26 = -X7; E2 = X8; ; F21 = X9; ; F15 = X10; ; G29 = X11; F5 = X12; ; G18 = -X13; ; E13 = X14; ; E22 = X15; E1 = X16; ; E25 = X17; ; E10 = X18; ; G19 = -X19; F7 = X20; ; G28 = -X21 ; ; F14 = X22; ; F20 = -X23; E3 = X24; ; F27 = -X25; ; F9 = X26; ; G30 = -X27; E6 = X28; ; G17 = -X29 ; ; F11 = X30; ; F23 = -X31; ; t = (251*(G16 + G17) >> 8); F16 = t - ((201*G17) >> 8); F17 = t - ((301*G16) >> 8); t = (212*(G18 + G19) >> 8); F18 = t - ((70*G19) >> 8); F19 = t - ((355*G18) >> 8); ; t = ((212*(G28 + G29)) >> 8); F28 = t - ((70*G29) >> 8); F29 = t - ((355*G28) >> 8); t = (251*(G30 + G31) >> 8); F30 = t - ((201*G31) >> 8); F31 = t - ((301*G30) >> 8); E5 = ((F5 + F7)*181 >> 8); E7 = ((F5 - F7)*181 >> 8); t = (97*(F8 + F9) >> 8); E8 = t - ((-138*F9) >> 8); E9 = t - ((334*F8) >> 8); ; E11 = ((F11 + F12)*181 >> 8); E12 = ((F11 - F12)*181 >> 8); t = (97*(F14 + F15) >> 8); E14 = t - ((-138*F15) >> 8); E15 = t - ((334*F14) >> 8); ; E16 = F16 + F18; D18 = F16 - F18; D17 = F17 + F19; E19 = F17 - F19;; t = (236*(F20 + F21) >> 8); E20 = t - ((334*F21) >> 8); E21 = t - ((138*F20) >> 8); E23 = ((F23 + F24)*181 >> 8); E24 = ((F23 - F24)*181 >> 8); ; t = (236*(F26 + F27) >> 8); E26 = t - ((334*F27) >> 8); E27 = t - ((138*F26) >> 8); ; E28 = -F28 + F30; D30 = F28 + F30; D29 = -F29 + F31; E31 = F29 + F31; ; D0 = ((E0 + E1)*181 >> 8); D1 = ((E0 - E1)*181 >> 8); t = (97*(E2 + E3) >> 8); D2 = t - ((334*E3) >> 8); D3 = t - ((-138*E2) >> 8); D4 = E4 + E5; D5 = E4 - E5; D6 = -E6 + E7; D7 = E6 + E7; D8 = E8 + E14; D14 = E8 - E14; D9 = E9 + E15; D15 = E9 - E15; D10 = E10 + E11; ; D11 = E10 - E11; D12 = E12 + E13; D13 = E12 - E13; ; ; D16 = ((E16 + E19)*181 >> 8); D19 = ((E16 - E19)*181 >> 8); D20 = E20 + E26; D26 = E20 - E26; D21 = E21 + E27; D27 = E21 - E27; D22 = E22 + E23; D23 = E22 - E23; D24 = E24 + E25; D25 = E24 - E25; D28 = ((E28 + E31)*181 >> 8); D31 = ((E28 - E31)*181 >> 8); ; C0 = D0 + D3; C3 = D0 - D3; C1 = D1 + D2; C2 = D1 - D2; t = (49*(D4 + D7) >> 8); C4 = t - ((301*D7) >> 8); C7 = t - ((-201*D4) >> 8); ; t = (142*(D5 + D6) >> 8); C5 = t - ((355*D6) >> 8); C6 = t - ((-70*D5) >> 8); C8 = D8 + D11; C11 = D8 - D11; C9 = D9 + D10; C10 = D9 - D10; C12 = D12 + D15; C15 = D12 - D15; C13 = D13 + D14; C14 = D13 - D14; ; C16 = D16 + D28; C28 = D16 - D28; C17 = D17 + D29; C29 = D17 - D29; C18 = D18 + D30; C30 = D18 - D30; C19 = D19 + D31; C31 = D19 - D31; C20 = D20 + D23; C23 = D20 - D23; C21 = D21 + D22; C22 = D21 - D22; C24 = D24 + D27; C27 = D24 - D27; C25 = D25 + D26; C26 = D25 - D26; ; B0 = C0 + C7; B7 = C0 - C7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + C4; B4 = C3 - C4; ; t = (197*(C8 + C15) >> 8); B8 = t - ((360*C15) >> 8); B15 = t - ((35*C8) >> 8); t = (120*(C9 + C14) >> 8); B9 = t - ((-105*C14) >> 8); B14 = t - ((346*C9) >> 8); t = (244*(C10 + C13) >> 8); B10 = t - ((319*C13) >> 8); B13 = t - ((170*C10) >> 8); t = (25*(C11 + C12) >> 8); B11 = t - ((-229*C12) >> 8); B12 = t - ((279*C11) >> 8); B16 = C16 + C23; B23 = C16 - C23; ; B17 = C17 + C22; B22 = C17 - C22; B18 = C18 + C21; B21 = C18 - C21; B19 = C19 + C20; B20 = C19 - C20; B24 = C24 + C31; B31 = C24 - C31; ; B25 = C25 + C30; B30 = C25 - C30; B26 = C26 + C29; B29 = C26 - C29; B27 = C27 + C28; B28 = C27 - C28; A0 = B0 + B15; A1 = B1 + B14; A2 = B2 + B13; A3 = B3 + B12; A4 = B4 + B11; A5 = B5 + B10; A6 = B6 + B9; A7 = B7 + B8; A8 = B7 - B8; A9 = B6 - B9; A10 = B5 - B10; A11 = B4 - B11; A12 = B3 - B12; A13 = B2 - B13; A14 = B1 - B14; A15 = B0 - B15; ; t = (171*(B16 + B31) >> 8); A16 = t - ((-17*B31) >> 8); A31 = t - ((361*B16) >> 8); t = (205*(B17 + B30) >> 8); A17 = t - ((358*B30) >> 8); A30 = t - ((53*B17) >> 8); t = (131*(B18 + B29) >> 8); A18 = t - ((-87*B29) >> 8); A29 = t - ((351*B18) >> 8); t = (231*(B19 + B28) >> 8); A19 = t - ((340*B28) >> 8); A28 = t - ((121*B19) >> 8); t = (86*(B20 + B27) >> 8); A20 = t - ((-154*B27) >> 8); A27 = t - ((327*B20) >> 8); t = (248*(B21 + B26) >> 8); A21 = t - ((310*B26) >> 8); A26 = t - ((186*B21) >> 8); t = (37*(B22 + B25) >> 8); A22 = t - ((-215*B25) >> 8); A25 = t - ((290*B22) >> 8); t = (255*(B23 + B24) >> 8); A23 = t - ((243*B24) >> 8); A24 = t - ((268*B23) >> 8); Y0 = A0 + A31; Y31 = A0 - A31; Y1 = A1 + A30; Y30 = A1 - A30; Y2 = A2 + A29; Y29 = A2 - A29; Y3 = A3 + A28; Y28 = A3 - A28; Y4 = A4 + A27; Y27 = A4 - A27; Y5 = A5 + A26; Y26 = A5 - A26; Y6 = A6 + A25; Y25 = A6 - A25; Y7 = A7 + A24; Y24 = A7 - A24; Y8 = A8 + A23; Y23 = A8 - A23; Y9 = A9 + A22; Y22 = A9 - A22; Y10 = A10 + A21; Y21 = A10 - A21; Y11 = A11 + A20; Y20 = A11 - A20; Y12 = A12 + A19; Y19 = A12 - A19; Y13 = A13 + A18; Y18 = A13 - A18; Y14 = A14 + A17; Y17 = A14 - A17; Y15 = A15 + A16; Y16 = A15 - A16
전술한 도 19의 우측에 도시된 변경된 버터플라이 구조의 실시예에 따라서 변환된 32x32 입력 블록에 대하여 1차원 이산 코사인 역변환을 수행하는 경우, X0 내지 X31은 역변환되어야 할 입력값, A0 내지 A31, B0 내지 B31, C0 내지 C31, D0 내지 D31, E0 내지 E31, F0 내지 F31, G0 내지 G31, H0 내지 H31은 중간값, t는 보조 변수, Y0 내지 Y31은 역변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
E0= X0; F24 = X1; F12 = X2; G16 = -X3; F7 = X4; ; G31 = X5; ; F9 = X6; ; F26 = -X7; E3 = X8; ; F21 = X9; ; F14 = X10; ; G29 = X11; E5 = X12; ; G18 = -X13; ; E13 = X14; ; E22 = X15; E1 = X16; ; E25 = X17; ; E10 = X18; ; G19 = -X19; E6 = X20; ; G28 = -X21 ; ; F15 = X22; ; F20 = -X23; E2 = X24; ; F27 = -X25; ; F8 = X26; ; G30 = -X27; F4 = X28; ; G17 = -X29 ; ; F11 = X30; ; F23 = -X31; ; F17 = G17 - ((G16*3) >> 4); F16 = G16 + ((F17*25) >> 7); ; F19 = G19 - ((G18*59) >> 7); F18 = G18 + ((F19*171) >> 8); ; F29 = G29 - ((G28*59) >> 7); F28 = G28 + ((F29*171) >> 8); ; F31 = G31 - ((G30*3) >> 4); F30 = G30 + ((F31*25) >> 7); ; ; ; E4 = (F7 >> 1) - F4; E7 = F7 - E4; ; E9 = -F9 + ((F8*45) >> 7); E8 = F8 - ((E9*53) >> 7); ; E12 = F12 + (F11 >> 1); E11 = F11 - E12; ; E15 = F15 + ((F14*45) >> 7); E14 = F14 - ((E15*53) >> 7); ; ; E16 = F16 + F18; D18 = F16 - F18; D17 = F17 + F19; E19 = F17 - F19; ; E21 = F21 + ((F20*45) >> 7); E20 = F20 - ((E21*53) >> 7); ; E24 = F24 + (F23 >> 1); E23 = F23 - ((E24*255) >> 8); ; E27 = F27 + ((F26*45) >> 7); E26 = F26 - ((E27*53) >> 7); ; E28 = -F28 + F30; D30 = F28 + F30; D29 = -F29 + F31; E31 = F29 + F31; ; D1 = (E0 >> 1) - E1; D0 = E0 - D1; ; D3 = E3 + ((E2*45) >> 7); D2 = ((D3*53) >> 7)- E2; ; D4 = E4 + E6; D6 = E4 - E6; D5 = E7 - E5; ; D7 = E7 + E5; ; D8 = E8 + E14; D14 = E8 - E14; D9 = E9 + E15; D15 = E9 - E15; D10 = E10 + E11; ; D11 = E10 - E11; D12 = E12 + E13; D13 = E12 - E13; ; D16 = ((E16 - E19)*181) >> 8; D19 = ((E16 + E19)*181) >> 8; D20 = E20 + E26; D26 = E20 - E26; D21 = E21 + E27; D27 = E21 - E27; D22 = E22 + E23; D23 = E22 - E23; D24 = E24 + E25; D25 = E24 - E25; ; D28 = ((E28 - E31)*181) >> 8; D31 = ((E28 + E31)*181) >> 8; C0 = D0 + D3; C3 = D0 - D3; C1 = D1 + D2; C2 = D1 - D2; ; D7 = D7 + ((D4*77) >> 8); C4 = D4 - ((D7*71) >> 7); C7 = D7 + ((C4*77) >> 8); ; D6 = D6 + ((D5*25) >> 8); C5 = D5 - ((D6*49) >> 8); C6 = D6 + ((C5*25) >> 8); ; C8 = D8 + D11; C11 = D8 - D11; C9 = D9 + D10; C10 = D9 - D10; ; C12 = D12 + D15; C15 = D12 - D15; C13 = D13 + D14; C14 = D13 - D14; ; C16 = D16 + D28; C28 = D16 - D28; C17 = D17 + D29; C29 = D17 - D29; C18 = D18 + D30; C30 = D18 - D30; C19 = D19 + D31; C31 = D19 - D31; ; C20 = D20 + D23; C23 = D20 - D23; C21 = D21 + D22; C22 = D21 - D22; ; C24 = D24 + D27; C27 = D24 - D27; C25 = D25 + D26; C26 = D25 - D26; ; ; B0 = C0 + C7; B7 = C0 - C7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + C4; B4 = C3 - C4; ; C15 = C15 + ((C8*91) >> 8); B8 = C8 - ((C15*81) >> 7); B15 = C15 + ((B8*91) >> 8); ; C9 = C9 + ((C14*153) >> 8); B14 = C14 - ((C9*225) >> 8); B9 = C9 + ((B14*153) >> 8); ; C13 = C13 + ((C10*37) >> 8); B10 = C10 - ((C13*37) >> 7); B13 = C13 + ((B10*37) >> 8); ; C11 = C11 + ((C12*29) >> 5); B12 = C12 - ((C11*127) >> 7); B11 = C11 + ((B12*29) >> 5); ; B16 = C16 + C23; B23 = C16 - C23; ; B17 = C17 + C22; B22 = C17 - C22; B18 = C18 + C21; B21 = C18 - C21; B19 = C19 + C20; B20 = C19 - C20; ; B24 = C24 + C31; B31 = C24 - C31; ; B25 = C25 + C30; B30 = C25 - C30; B26 = C26 + C29; B29 = C26 - C29; B27 = C27 + C28; B28 = C27 - C28; ; A0 = B0 + B15; A1 = B1 + B14; A2 = B2 + B13; A3 = B3 + B12; A4 = B4 + B11; A5 = B5 + B10; A6 = B6 + B9; A7 = B7 + B8; A8 = B7 - B8; A9 = B6 - B9; A10 = B5 - B10; A11 = B4 - B11; A12 = B3 - B12; A13 = B2 - B13; A14 = B1 - B14; A15 = B0 - B15; ; ; B16 = B16 + ((113*B31) >> 8); A31 = B31 - ((189*B16) >> 8); A16 = B16 + ((113*A31) >> 8); ; B17 = B17 - ((21*B30) >> 6); A30 = B30 + ((19*B17) >> 5); A17 = B17 - ((21*A30) >> 6); ; B18 = B18 + ((145*B29) >> 8); A29 = B29 - ((219*B18) >> 8); A18 = B18 + ((145*A29) >> 8); ; B19 = B19 - ((57*B28) >> 8); A28 = B28 + ((109*B19) >> 8); A19 = B19 - ((57*A28) >> 8); ; B20 = B20 + ((45*B27) >> 6); A27 = B27 - ((241*B20) >> 8); A20 = B20 + ((45*A27) >> 6); ; B21 = B21 - ((31*B26) >> 8); A26 = B26 + ((31*B21) >> 7); A21 = B21 - ((31*A26) >> 8); ; B22 = B22 + ((55*B25) >> 6); A25 = B25 - ((253*B22) >> 8); A22 = B22 + ((55*A25) >> 6); ; B23 = B23 - ((3*B24) >> 7); A24 = B24 + ((3*B23) >> 6); A23 = B23 - ((3*A24) >> 7); ; Y0 = A0 + A31; Y31 = A0 - A31; Y1 = A1 + A30; Y30 = A1 - A30; Y2 = A2 + A29; Y29 = A2 - A29; Y3 = A3 + A28; Y28 = A3 - A28; Y4 = A4 + A27; Y27 = A4 - A27; Y5 = A5 + A26; Y26 = A5 - A26; Y6 = A6 + A25; Y25 = A6 - A25; Y7 = A7 + A24; Y24 = A7 - A24; Y8 = A8 + A23; Y23 = A8 - A23; Y9 = A9 + A22; Y22 = A9 - A22; Y10 = A10 + A21; Y21 = A10 - A21; Y11 = A11 + A20; Y20 = A11 - A20; Y12 = A12 + A19; Y19 = A12 - A19; Y13 = A13 + A18; Y18 = A13 - A18; Y14 = A14 + A17; Y17 = A14 - A17; Y15 = A15 + A16; Y16 = A15 - A16
도 96은 본 발명의 일 실시예에 따른 영상의 역변환 방법을 나타낸 플로우 차트이다.
도 96을 참조하면, 단계 10110에서 복호화되는 영상을 구성하는 NxN(N은 정수) 크기의 블록의 양자화된 변환 계수들을 수신한다.
단계 10120에서, 수신된 양자화된 변환 계수들을 역양자화한다. 전술한 바와 같이, 역양자화는 역스케일링 행렬(V)와 양자화된 변환 계수를 곱한 값에 대해서 floor(QP/6)(floor[x]는 x보다 작거나 같은 최대 정수, QP는 양자화 파라메터) 비트만큼 비트 시프트를 통해 수행될 수 있다.
단계 10130에서, NxN 크기의 블록의 1차원 이산 코사인 변환에 이용되는 NxN 변환 행렬을 구성하는 원소들을 N개의 변수들에 기초한 값들로 치환하여 치환된 NxN 변환 행렬을 생성하고, 치환된 NxN 변환 행렬과 치환된 NxN 변환 행렬의 전치 행렬의 곱셈 행렬을 획득하며, 획득된 곱셈 행렬의 대각 성분을 제외한 나머지 원소들의 제곱합이 최소가 되도록 하는 N개의 변수들을 획득하고, 획득된 N개의 변수들에 기초한 값들로 치환된 NxN 변환 행렬(A)의 역행렬인 NxN 역변환 행렬(A-1)을 이용하여 NxN 크기의 블록의 역양자화된 변환 계수들을 역변환한다.
도 97는 본 발명의 다른 실시예에 다른 영상의 역변환 방법을 나타낸 플로우 차트이다.
도 97를 참조하면, 단계 10210에서 복호화되는 영상을 구성하는 NxN(N은 정수) 크기의 블록의 양자화된 변환 계수들을 수신한다.
단계 10220에서 수신된 양자화된 변환 계수들을 역양자화한다. 이 때, 역양자화는 전술한 도 18 및 도 19에 대응되는 변경된 버터 플라이 구조에 대응되는 변환 행렬의 역행렬을 이용하여 수행될 수 있다.
단계 10230에서 버터플라이 구조의 곱셈 인수 중 삼각 함수 성분을 유리수로 치환하고, 버터플라이 구조의 4개의 곱셈 연산과 2개의 덧셈 연산 과정을 3개의 곱셈 연산과 3개의 덧셈 연산 과정으로 대체한 변경된 버터플라이 구조에 기초하여 역양자화된 변환 계수들에 대한 1차원 이산 코사인 역변환을 수행한다.
예측부(10040)는 인터 예측 또는 인트라 예측을 통해 복호화되는 현재 블록의 예측 블록을 생성하고, 역변환부(10030)에서 출력되는 레지듀얼 값과 예측 블록을 가산하여 현재 블록을 복원한다.
도 98은 본 발명의 또 다른 실시예에 따른 영상 변환 방법을 나타낸 플로우 차트이다.
도 98를 참조하면, 단계 9810에서 NxN(N은 정수) 크기의 블록의 1차원 이산 코사인 변환에 이용되는 NxN 변환 행렬을 소정의 순열 행렬과 회전 행렬들의 곱셈 형태로 분해된다.
다시 도 2를 참조하면, 도 2에 도시된 이산 코사인 변환의 과정은 순열(permutation)과 회전(rotation)과 결합된 행렬로 표현될 수 있다. 예를 들어, 16 포인트 이산 코사인 변환은 하나의 순열 행렬(permutation matrix)과 6개의 회전 행렬들의 곱셈 형태로 표현될 수 있다. 행렬 In을 NxN 크기의 단위 행렬(identity matrix), Jn은 역대각선 행렬(opposite diagonal matrix)로써 Jn(i,j)=δi, n-j+1의 값을 갖는 행렬이다. Jn은 In 행렬의 (i,j)번째 원소를 (i,N+1-j)번째 원소로 매핑한 행렬일 수 있다. 일 예로, J4={0001;0010;0100;1000}이다. 또한, On을 모든 성분이 0인 nxn 크기의 영행렬(zero matrix)라고 정의한다. 이와 같이 정의할 때, 도 2의 16포인트 이산 코사인 변환을 수행하는 행렬 F16은 소정의 순열 행렬 P 및 회전 행렬 A1 내지 A6을 이용하여 다음의 수학식 1과 같이 표현될 수 있다.
Figure pat00007
수학식 1에서 순열행렬 P 및 회전 행렬 A1 내지 A6는 도 99a 내지 도 99g와 같이 표현된다.
또한, 도 2에서 32 포인트 이산 코사인 변환을 수행하는 행렬 F32는 다음의 수학식 2와 같이 표현된다.
Figure pat00008
전술한 바와 같이, 행렬 I16은 16x16 크기의 단위 행렬, J16은 (i,j)째의 행렬 성분이 +i 또는 -i의 값을 갖는 16x16 크기의 대각선 행렬이다. 또한, O16은 모든 성분이 0인 16x16 크기의 영행렬이다. F16은 도 2의 16포인트 이산 코사인 변환을 수행하는 행렬로써 전술한 수학식 1과 같다. 또한, 수학식 2에서 G16은 다음의 수학식 3과 같이 정의되는 행렬이다.
Figure pat00009
수학식 3에서 행렬 A1 내지 A7은 도 100a 내지 도 100g와 같이 표현된다.
다시 도 98을 참조하면, 단계 9820에서 분해된 순열 행렬과 회전 행렬들의 원소들 중 삼각함수 sin 및 cos에 기초한 값들을 분모가 2의 거듭 제곱 형태인 소정의 유리수 값들로 치환한다. 전술한 수학식 1 내지 3에서는 cos 및 sin 함수에 기초한 값들이 포함되어있다. 본 발명의 또 다른 실시예에서는 이러한 cos 및 sin 등의 삼각함수에 기초한 값들을 분모가 2의 거듭제곱 형태인 유리수(dyadic rational)로 치환한다. 구체적으로, 16 포인트 이산 코사인 변환에 이용되는 다음의 cos 및 sin 값들은 우측의 분모가 2의 거듭제곱 형태인 유리수로 치환되어 치환된 값을 대신 이용한다.
cos(pi/4) ~= 45/64, sin(pi/4) ~= 45/64, cos(pi/8) ~= 59/64, sin(pi/8) ~= 24/64, cos(pi/16) ~= 62/64, sin(pi/16) ~= 12/64, cos(pi*5/16) ~= 35/64, sin(pi*5/16) ~= 53/64, cos(pi/32) ~= 63/64, sin(pi/32) ~= 6/64, cos(pi*5/32) ~= 56/64, sin(pi*5/32) ~= 30/64, cos(pi*9/32) ~= 40/64, sin(pi*9/32) ~= 49/64, cos(pi*13/32) ~= 18/64, sin(pi*13/32) ~= 61/64
32 포인트 이산 코사인 변환에 이용되는 다음의 cos 및 sin 값들은 우측의 분모가 2의 거듭제곱 형태인 유리수로 치환되어 치환된 값을 대신 이용한다.
cos(pi/4) ~= 181/256, sin(pi/4) ~= 181/256, cos(pi/8) ~= 236/256, sin(pi/8) ~= 97/256, cos(pi/16) ~= 251/256, sin(pi/16) ~= 49/256, cos(pi*5/16) ~= 142/256, sin(pi*5/16) ~= 212/256, cos(pi/32) ~= 254/256, sin(pi/32) ~= 25/256, cos(pi*5/32) ~= 225/256, sin(pi*5/32) ~= 120/256, cos(pi*9/32) ~= 162/256, sin(pi*9/32) ~= 197/256, cos(pi*13/32) ~= 74/256, sin(pi*13/32) ~= 244/256, cos(pi/64) ~= 255/256, sin(pi/64) ~= 12/256, cos(pi*5/64) ~= 248/256, sin(pi*5/64) ~= 62/256, cos(pi*9/64) ~= 231/256, sin(pi*9/64) ~= 109/256, cos(pi*13/64) ~= 205/256, sin(pi*13/64) ~= 152/256, cos(pi*17/64) ~= 171/256, sin(pi*17/64) ~= 189/256, cos(pi*21/64) ~= 131/256, sin(pi*21/64) ~= 219/256, cos(pi*25/64) ~= 86/256, sin(pi*25/64) ~= 241/256, cos(pi*29/64) ~= 37/256, sin(pi*29/64) ~= 253/256
64 포인트 이산 코사인 변환에 이용되는 다음의 cos 및 sin 값들은 우측의 분모가 2의 거듭제곱 형태인 유리수로 치환되어 치환된 값을 대신 이용한다.
cos(pi/4) ~= 724/1024, sin(pi/4) ~= 724/1024, cos(pi/8) ~= 946/1024, sin(pi/8) ~= 392/1024, cos(pi/16) ~= 1004/1024, sin(pi/16) ~= 200/1024, cos(pi*5/16) ~= 569/1024, sin(pi*5/16) ~= 851/1024, cos(pi/32) ~= 1019/1024, sin(pi/32) ~= 100/1024, cos(pi*5/32) ~= 903/1024, sin(pi*5/32) ~= 483/1024, cos(pi*9/32) ~= 650/1024, sin(pi*9/32) ~= 792/1024, cos(pi*13/32) ~= 297/1024, sin(pi*13/32) ~= 980/1024, cos(pi/64) ~= 1023/1024, sin(pi/64) ~= 50/1024, cos(pi*5/64) ~= 993/1024, sin(pi*5/64) ~= 249/1024, cos(pi*9/64) ~= 926/1024, sin(pi*9/64) ~= 438/1024, cos(pi*13/64) ~= 822/1024, sin(pi*13/64) ~= 610/1024, cos(pi*17/64) ~= 688/1024, sin(pi*17/64) ~= 759/1024, cos(pi*21/64) ~= 526/1024, sin(pi*21/64) ~= 878/1024, cos(pi*25/64) ~= 345/1024, sin(pi*25/64) ~= 964/1024, cos(pi*29/64) ~= 150/1024, sin(pi*29/64) ~= 1013/1024, cos(pi/128) ~= 1024/1024, sin(pi/128) ~= 25/1024, cos(pi*5/128) ~= 1016/1024, sin(pi*5/128) ~= 125/1024, cos(pi*9/128) ~= 999/1024, sin(pi*9/128) ~= 224/1024, cos(pi*13/128) ~= 972/1024, sin(pi*13/128) ~= 321/1024, cos(pi*17/128) ~= 936/1024, sin(pi*17/128) ~= 415/1024, cos(pi*21/128) ~= 891/1024, sin(pi*21/128) ~= 505/1024, cos(pi*25/128) ~= 837/1024, sin(pi*25/128) ~= 590/1024, cos(pi*29/128) ~= 775/1024, sin(pi*29/128) ~= 669/1024, cos(pi*33/128) ~= 706/1024, sin(pi*33/128) ~= 742/1024, cos(pi*37/128) ~= 630/1024, sin(pi*37/128) ~= 807/1024, cos(pi*41/128) ~= 548/1024, sin(pi*41/128) ~= 865/1024, cos(pi*45/128) ~= 460/1024, sin(pi*45/128) ~= 915/1024, cos(pi*49/128) ~= 369/1024, sin(pi*49/128) ~= 955/1024, cos(pi*53/128) ~= 273/1024, sin(pi*53/128) ~= 987/1024, cos(pi*57/128) ~= 175/1024, sin(pi*57/128) ~= 1009/1024, cos(pi*61/128) ~= 75/1024, sin(pi*61/128) ~= 1021/1024,
단계 9830에서, 치환된 값들을 갖는 순열 행렬과 회전 행렬들의 곱셉을 이용하여 NxN 크기의 블록을 변환한다. 즉, 입력값이 X라면 16포인트 이산 코사인 변환은 수학식 1의 F16을 이용하여 F16xX를 계산함으로써 16 포인트 1차원 이산 코사인 변환을 수행할 수 있다. 32포인트 이산 코사인 변환은 수학식 2의 F32를 이용하여 F32xX를 계산함으로써 32 포인트 1차원 이산 코사인 변환을 수행할 수 있다. F16 또는 F32와 같은 변환 행렬은 전술한 과정을 통해 미리 획득된 다음 소정의 메모리에 저장된 후 소정 크기의 입력 블록에 적용되어 변환이 수행되도록 할 수 있다. 즉, 변환 과정을 위해서 매번 변환 행렬이 계산되는 것이 아니라, 다양한 크기의 입력 블록에 대하여 본 발명의 실시예에 따라서 미리 획득되어 저장된 변환 행렬이 이용되도록 할 수 있다.
N이 16인 경우, 즉 16x16 입력 블록에 대하여 치환된 삼각 함수값을 이용한 수학식 1의 1차원 이산 코사인 변환을 수행하는 단계는, X0 내지 X15은 변환되어야 할 입력값, B0 내지 B15, C0 내지 C15, D0 내지 D15, E0 내지 E15, F0 내지 F15, G0 내지 G15은 중간값, Y0 내지 Y15은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
B0 = x0 + x15; B15 = x0 - x15; B1 = x1 + x14; B14 = x1 - x14; B2 = x2 + x13; B13 = x2 - x13; B3 = x3 + x12; B12 = x3 - x12; B4 = x4 + x11; B11 = x4 - x11; B5 = x5 + x10; B10 = x5 - x10; B6 = x6 + x9; B9 = x6 - x9; B7 = x7 + x8; B8 = x7 - x8; C0 = B0 + B7; C7 = B0 - B7; C1 = B1 + B6; C6 = B1 - B6; C2 = B2 + B5; C5 = B2 - B5; C3 = B3 + B4; C4 = B3 - B4; C10 = ( 45 * ( B13 - B10 ) >> 6); C13 = ( 45 * ( B13 + B10 ) >> 6); C11 = ( 45 * ( B12 - B11 ) >> 6); C12 = ( 45 * ( B12 + B11 ) >> 6); D0 = C0 + C3; D3 = C0 - C3; D8 = B8 + C11; D11 = B8 - C11; D12 = B15 - C12; D15 = B15 + C12; D1 = C1 + C2; D2 = C1 - C2; D9 = B9 + C10; D10 = B9 - C10; D13 = B14 - C13; D14 = B14 + C13; D5 = ( 45 * ( C6 - C5 ) >> 6); D6 = ( 45 * ( C6 + C5 ) >> 6); y0 = ( 45 * ( D0 + D1 ) >> 6); y8 = ( 45 * ( D0 - D1 ) >> 6); y4 = ( 59 * D3 + 24 * D2 >> 6); y12 = ( 24 * D3 - 59 * D2 >> 6); E4 = C4 + D5; E5 = C4 - D5; E6 = C7 - D6; E7 = C7 + D6; E9 = ( 24 * D14 - 59 * D9 >> 6); E10 = ( -59 * D13 - 24 * D10 >> 6); E13 = ( 24 * D13 - 59 * D10 >> 6); E14 = ( 59 * D14 + 24 * D9 >> 6); y2 = ( 12 * E4 + 62 * E7 >> 6); y10 = ( 53 * E5 + 35 * E6 >> 6); y6 = ( 53 * E6 - 35 * E5 >> 6); y14 = ( 12 * E7 - 62 * E4 >> 6); F8 = D8 + E9; F9 = D8 - E9; F10 = D11 - E10; F11 = D11 + E10; F12 = D12 + E13; F13 = D12 - E13; F14 = D15 - E14; F15 = D15 + E14; y1 = ( 6 * F8 + 63 * F15 >> 6); y9 = ( 49 * F9 + 40 * F14 >> 6); y5 = ( 30 * F10 + 56 * F13 >> 6); y13 = ( 61 * F11 + 18 * F12 >> 6); y3 = ( 61 * F12 - 18 * F11 >> 6); y11 = ( 30 * F13 - 56 * F10 >> 6); y7 = ( 49 * F14 - 40 * F9 >> 6); y15 = ( 6 * F15 - 63 * F8 >> 6);
이에 대응되는 16 포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y15은 역변환되어야 할 입력값, B0 내지 B15, C0 내지 C15, D0 내지 D15, E0 내지 E15, F0 내지 F15, G0 내지 G15은 중간값, X0 내지 X15는 역변환된 값을 나타낸다.
F8 = ( 6 * y1 - 63 * y15 ) >> 6; F9 = ( 49 * y9 - 40 * y7 ) >> 6; F10 = ( 30 * y5 - 56 * y11 ) >> 6; F11 = ( 61 * y13 - 18 * y3 ) >> 6; F12 = ( 61 * y3 + 18 * y13 ) >> 6; F13 = ( 30 * y11 + 56 * y5 ) >> 6; F14 = ( 49 * y7 + 40 * y9 ) >> 6; F15 = ( 6 * y15 + 63 * y1 ) >> 6; E4 = ( 12 * y2 - 62 * y14 ) >> 6; E5 = ( 53 * y10 - 35 * y6 ) >> 6; E6 = ( 53 * y6 + 35 * y10 ) >> 6; E7 = ( 12 * y14 + 62 * y2 ) >> 6; E8 = F8 + F9; E9 = F8 - F9; E10 = F11 - F10; E11 = F11 + F10; E12 = F12 + F13; E13 = F12 - F13; E14 = F15 - F14; E15 = F15 + F14; D0 = ( 45 * ( y0 + y8 ) >> 6); D1 = ( 45 * ( y0 - y8 ) >> 6); D2 = ( 24 * y4 - 59 * y12 ) >> 6; D3 = ( 59 * y4 + 24 * y12 ) >> 6; D4 = E4 + E5; D5 = E4 - E5; D6 = E7 - E6; D7 = E7 + E6; D9 = ( 24 * E14 - 59 * E9 ) >> 6; D10 = ( - 59 * E13 - 24 * E10 ) >> 6; D13 = ( 24 * E13 - 59 * E10 ) >> 6; D14 = ( 59 * E14 + 24 * E9 ) >> 6; C0 = D0 + D3; C3 = D0 - D3; C8 = E8 + E11; C11 = E8 - E11; C12 = E15 - E12; C15 = E15 + E12; C1 = D1 + D2; C2 = D1 - D2; C9 = D9 + D10; C10 = D9 - D10; C13 = D14 - D13; C14 = D14 + D13; C5 = ( 45 * ( D6 - D5 ) >> 6); C6 = ( 45 * ( D6 + D5 ) >> 6); B0 = C0 + D7; B7 = C0 - D7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + D4; B4 = C3 - D4; B10 = ( 45 * ( C13 - C10 ) >> 6); B13 = ( 45 * ( C13 + C10 ) >> 6); B11 = ( 45 * ( C12 - C11 ) >> 6); B12 = ( 45 * ( C12 + C11 ) >> 6); x0 = B0 + C15; x15 = B0 - C15; x1 = B1 + C14; x14 = B1 - C14; x2 = B2 + B13; x13 = B2 - B13; x3 = B3 + B12; x12 = B3 - B12; x4 = B4 + B11; x11 = B4 - B11; x5 = B5 + B10; x10 = B5 - B10; x6 = B6 + C9; x9 = B6 - C9; x7 = B7 + C8; x8 = B7 - C8;
N이 32인 경우, 즉 32x32 입력 블록에 대하여 치환된 삼각 함수값을 이용한 수학식 2의 1차원 이산 코사인 변환을 수행하는 단계는, X0 내지 X31은 변환되어야 할 입력값, A0 내지 G31은 중간값, Y0 내지 Y31은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
A0 = x0 + x31; A31 = x0 - x31; A1 = x1 + x30; A30 = x1 - x30; A2 = x2 + x29; A29 = x2 - x29; A3 = x3 + x28; A28 = x3 - x28; A4 = x4 + x27; A27 = x4 - x27; A5 = x5 + x26; A26 = x5 - x26; A6 = x6 + x25; A25 = x6 - x25; A7 = x7 + x24; A24 = x7 - x24; A8 = x8 + x23; A23 = x8 - x23; A9 = x9 + x22; A22 = x9 - x22; A10 = x10 + x21; A21 = x10 - x21; A11 = x11 + x20; A20 = x11 - x20; A12 = x12 + x19; A19 = x12 - x19; A13 = x13 + x18; A18 = x13 - x18; A14 = x14 + x17; A17 = x14 - x17; A15 = x15 + x16; A16 = x15 - x16; B0 = A0 + A15; B15 = A0 - A15; B1 = A1 + A14; B14 = A1 - A14; B2 = A2 + A13; B13 = A2 - A13; B3 = A3 + A12; B12 = A3 - A12; B4 = A4 + A11; B11 = A4 - A11; B5 = A5 + A10; B10 = A5 - A10; B6 = A6 + A9; B9 = A6 - A9; B7 = A7 + A8; B8 = A7 - A8; B20 = ( 181 * ( A27 - A20 ) >> 6); B27 = ( 181 * ( A27 + A20 ) >> 6); B21 = ( 181 * ( A26 - A21 ) >> 6); B26 = ( 181 * ( A26 + A21 ) >> 6); B22 = ( 181 * ( A25 - A22 ) >> 6); B25 = ( 181 * ( A25 + A22 ) >> 6); B23 = ( 181 * ( A24 - A23 ) >> 6); B24 = ( 181 * ( A24 + A23 ) >> 6); C0 = B0 + B7; C7 = B0 - B7; C1 = B1 + B6; C6 = B1 - B6; C2 = B2 + B5; C5 = B2 - B5; C3 = B3 + B4; C4 = B3 - B4; C10 = ( 181 * ( B13 - B10 ) >> 6); C13 = ( 181 * ( B13 + B10 ) >> 6); C11 = ( 181 * ( B12 - B11 ) >> 6); C12 = ( 181 * ( B12 + B11 ) >> 6); C16 = A16 + B23; C23 = A16 - B23; C24 = A31 - B24; C31 = A31 + B24; C17 = A17 + B22; C22 = A17 - B22; C25 = A30 - B25; C30 = A30 + B25; C18 = A18 + B21; C21 = A18 - B21; C26 = A29 - B26; C29 = A29 + B26; C19 = A19 + B20; C20 = A19 - B20; C27 = A28 - B27; C28 = A28 + B27; D0 = C0 + C3; D3 = C0 - C3; D8 = B8 + C11; D11 = B8 - C11; D12 = B15 - C12; D15 = B15 + C12; D1 = C1 + C2; D2 = C1 - C2; D9 = B9 + C10; D10 = B9 - C10; D13 = B14 - C13; D14 = B14 + C13; D5 = ( 181 * ( C6 - C5 ) >> 6); D6 = ( 181 * ( C6 + C5 ) >> 6); D18 = ( 97 * C29 - 236 * C18 ) >> 6; D20 = ( - 236 * C27 - 97 * C20 ) >> 6; D26 = ( - 236 * C21 + 97 * C26) >> 6; D28 = ( 97 * C19 + 236 * C28) >> 6; D19 = ( 97 * C28 - 236 * C19) >> 6; D21 = ( - 236 * C26 - 97 * C21) >> 6; D27 = ( - 236 * C20 + 97 * C27) >> 6; D29 = ( 97 * C18 + 236 * C29) >> 6; y0 = ( 181 * ( D0 + D1 ) >> 6); y16 = ( 181 * ( D0 - D1 ) >> 6); y8 = ( 236 * D3 + 97 * D2) >> 6; y24 = ( 97 * D3 - 236 * D2) >> 6; E4 = C4 + D5;
E5 = C4 - D5; E6 = C7 - D6; E7 = C7 + D6; E9 = ( 97 * D14 - 236 * D9) >> 6; E10 = ( - 236 * D13 - 97 * D10) >> 6; E13 = ( 97 * D13 - 236 * D10 ) >> 6; E14 = ( 236 * D14 + 97 * D9 ) >> 6; E16 = C16 + D19; E19 = C16 - D19; E20 = C23 - D20; E23 = C23 + D20; E24 = C24 + D27; E27 = C24 - D27; E28 = C31 - D28; E31 = C31 + D28; E17 = C17 + D18; E18 = C17 - D18; E21 = C22 - D21; E22 = C22 + D21; E25 = C25 + D26; E26 = C25 - D26; E29 = C30 - D29; E30 = C30 + D29; y4 = ( 49 * E4 + 251 * E7 ) >> 6; y20 = ( 212 * E5 + 142 * E6 ) >> 6; y12 = ( 212 * E6 - 142 * E5 ) >> 6; y28 = ( 49 * E7 - 251 * E4 ) >> 6; F8 = D8 + E9; F9 = D8 - E9; F10 = D11 - E10; F11 = D11 + E10; F12 = D12 + E13; F13 = D12 - E13; F14 = D15 - E14; F15 = D15 + E14; F17 = ( 49 * E30 - 251 * E17 ) >> 6; F18 = ( - 251 * E29 - 49 * E18 ) >> 6; F21 = ( 212 * E26 - 142 * E21 ) >> 6; F22 = ( - 142 * E25 - 212 * E22 ) >> 6; F25 = ( 212 * E25 - 142 * E22 ) >> 6; F26 = ( 142 * E26 + 212 * E21 ) >> 6; F29 = ( 49 * E29 - 251 * E18 ) >> 6; F30 = ( 251 * E30 + 49 * E17 ) >> 6;; y2 = ( 25 * F8 + 254 * F15 ) >> 6; y18 = ( 197 * F9 + 162 * F14 ) >> 6; y10 = ( 120 * F10 + 225 * F13 ) >> 6; y26 = ( 244 * F11 + 74 * F12 ) >> 6; y6 = ( 244 * F12 - 74 * F11 ) >> 6; y22 = ( 120 * F13 - 225 * F10 ) >> 6; y14 = ( 197 * F14 - 162 * F9 ) >> 6; y30 = ( 25 * F15 - 254 * F8 ) >> 6; G16 = E16 + F17; G17 = E16 - F17; G18 = E19 - F18; G19 = E19 + F18; G20 = E20 + F21; G21 = E20 - F21; G22 = E23 - F22; G23 = E23 + F22; G24 = E24 + F25; G25 = E24 - F25; G26 = E27 - F26; G27 = E27 + F26; G28 = E28 + F29; G29 = E28 - F29;
G30 = E31 - F30; G31 = E31 + F30; y1 = ( 12 * G16 + 255 * G31 ) >> 6; y17 = ( 189 * G17 + 171 * G30 ) >> 6; y9 = ( 109 * G18 + 231 * G29 ) >> 6; y25 = ( 241 * G19 + 86 * G28 ) >> 6; y5 = ( 62 * G20 + 248 * G27 ) >> 6; y21 = ( 219 * G21 + 131 * G26 ) >> 6; y13 = ( 152 * G22 + 205 * G25 ) >> 6; y29 = ( 253 * G23 + 37 * G24 ) >> 6; y3 = ( 253 * G24 - 37 * G23 ) >> 6; y19 = ( 152 * G25 - 205 * G22 ) >> 6; y11 = ( 219 * G26 - 131 * G21 ) >> 6; y27 = ( 62 * G27 - 248 * G20 ) >> 6; y7 = ( 241 * G28 - 86 * G19 ) >> 6; y23 = ( 109 * G29 - 231 * G18 ) >> 6; y15 = ( 189 * G30 - 171 * G17 ) >> 6; y31 = ( 12 * G31 - 255 * G16 ) >> 6;
이에 대응되는 32 포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y31은 역변환되어야 할 입력값, A0 내지 G31은 중간값, X0 내지 X31은 역변환된 값을 나타낸다.
G16 = ( 12 * y1 - 255 * y31 ) >> 6; G17 = ( 189 * y17 - 171 * y15 ) >> 6; G18 = ( 109 * y9 - 231 * y23 ) >> 6; G19 = ( 241 * y25 - 86 * y7 ) >> 6; G20 = ( 62 * y5 - 248 * y27 ) >> 6; G21 = ( 219 * y21 - 131 * y11 ) >> 6; G22 = ( 152 * y13 - 205 * y19 ) >> 6; G23 = ( 253 * y29 - 37 * y3 ) >> 6; G24 = ( 253 * y3 + 37 * y29 ) >> 6; G25 = ( 152 * y19 + 205 * y13 ) >> 6; G26 = ( 219 * y11 + 131 * y21 ) >> 6; G27 = ( 62 * y27 + 248 * y5 ) >> 6; G28 = ( 241 * y7 + 86 * y25 ) >> 6; G29 = ( 109 * y23 + 231 * y9 ) >> 6; G30 = ( 189 * y15 + 171 * y17 ) >> 6; G31 = ( 12 * y31 + 255 * y1 ) >> 6; F8 = ( 25 * y2 - 254 * y30 ) >> 6; F9 = ( 197 * y18 - 162 * y14 ) >> 6; F10 = ( 120 * y10 - 225 * y22 ) >> 6; F11 = ( 244 * y26 - 74 * y6 ) >> 6; F12 = ( 244 * y6 + 74 * y26 ) >> 6; F13 = ( 120 * y22 + 225 * y10 ) >> 6; F14 = ( 197 * y14 + 162 * y18 ) >> 6; F15 = ( 25 * y30 + 254 * y2 ) >> 6; F16 = G16 + G17; F17 = G16 - G17; F18 = G19 - G18; F19 = G19 + G18; F20 = G20 + G21; F21 = G20 - G21; F22 = G23 - G22; F23 = G23 + G22; F24 = G24 + G25; F25 = G24 - G25; F26 = G27 - G26; F27 = G27 + G26; F28 = G28 + G29; F29 = G28 - G29; F30 = G31 - G30; F31 = G31 + G30; E4 = ( 49 * y4 - 251 * y28 ) >> 6; E5 = ( 212 * y20 - 142 * y12 ) >> 6; E6 = ( 212 * y12 + 142 * y20 ) >> 6; E7 = ( 49 * y28 + 251 * y4 ) >> 6; E8 = F8 + F9; E9 = F8 - F9; E10 = F11 - F10; E11 = F11 + F10; E12 = F12 + F13; E13 = F12 - F13; E14 = F15 - F14; E15 = F15 + F14; E17 = ( 49 * F30 - 251 * F17 ) >> 6; E18 = ( - 251 * F29 - 49 * F18 ) >> 6; E21 = ( 212 * F26 - 142 * F21 ) >> 6; E22 = ( - 142 * F25 - 212 * F22 ) >> 6; E25 = ( 212 * F25 - 142 * F22 ) >> 6; E26 = ( 142 * F26 + 212 * F21 ) >> 6; E29 = ( 49 * F29 - 251 * F18 ) >> 6; E30 = ( 251 * F30 + 49 * F17 ) >> 6; D0 = ( 181 * ( y0 + y16 ) >> 6); D1 = ( 181 * ( y0 - y16 ) >> 6); D2 = ( 97 * y8 - 236 * y24 ) >> 6; D3 = ( 236 * y8 + 97 * y24 ) >> 6; D4 = E4 + E5; D5 = E4 - E5; D6 = E7 - E6; D7 = E7 + E6; D9 = ( 97 * E14 - 236 * E9 ) >> 6; D10 = ( - 236 * E13 - 97 * E10 ) >> 6; D13 = ( 97 * E13 - 236 * E10 ) >> 6; D14 = ( 236 * E14 + 97 * E9 ) >> 6; D16 = F16 + F19; D19 = F16 - F19; D20 = F23 - F20; D23 = F23 + F20; D24 = F24 + F27; D27 = F24 - F27; D28 = F31 - F28; D31 = F31 + F28; D17 = E17 + E18; D18 = E17 - E18; D21 = E22 - E21; D22 = E22 + E21; D25 = E25 + E26; D26 = E25 - E26; D29 = E30 - E29; D30 = E30 + E29; C0 = D0 + D3; C3 = D0 - D3; C8 = E8 + E11; C11 = E8 - E11; C12 = E15 - E12; C15 = E15 + E12; C1 = D1 + D2; C2 = D1 - D2; C9 = D9 + D10; C10 = D9 - D10; C13 = D14 - D13; C14 = D14 + D13; C5 = ( 181 * ( D6 - D5 ) >> 6); C6 = ( 181 * ( D6 + D5 ) >> 6); C18 = ( 97 * D29 - 236 * D18 ) >> 6; C20 = ( - 236 * D27 - 97 * D20 ) >> 6; C26 = ( - 236 * D21 + 97 * D26 ) >> 6; C28 = ( 97 * D19 + 236 * D28 ) >> 6; C19 = ( 97 * D28 - 236 * D19 ) >> 6; C21 = ( - 236 * D26 - 97 * D21 ) >> 6; C27 = ( - 236 * D20 + 97 * D27 ) >> 6; C29 = ( 97 * D18 + 236 * D29 ) >> 6; B0 = C0 + D7; B7 = C0 - D7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + D4; B4 = C3 - D4; B10 = ( 181 * ( C13 - C10 ) >> 6); B13 = ( 181 * ( C13 + C10 ) >> 6); B11 = ( 181 * ( C12 - C11 ) >> 6); B12 = ( 181 * ( C12 + C11 ) >> 6); B16 = D16 + D23; B23 = D16 - D23; B24 = D31 - D24; B31 = D31 + D24; B17 = D17 + D22; B22 = D17 - D22; B25 = D30 - D25; B30 = D30 + D25; B18 = C18 + C21; B21 = C18 - C21; B26 = C29 - C26; B29 = C29 + C26; B19 = C19 + C20; B20 = C19 - C20; B27 = C28 - C27; B28 = C28 + C27; A0 = B0 + C15; A15 = B0 - C15; A1 = B1 + C14; A14 = B1 - C14; A2 = B2 + B13; A13 = B2 - B13; A3 = B3 + B12; A12 = B3 - B12; A4 = B4 + B11; A11 = B4 - B11; A5 = B5 + B10; A10 = B5 - B10; A6 = B6 + C9; A9 = B6 - C9; A7 = B7 + C8; A8 = B7 - C8; A20 = ( 181 * ( B27 - B20 ) >> 6); A27 = ( 181 * ( B27 + B20 ) >> 6); A21 = ( 181 * ( B26 - B21 ) >> 6); A26 = ( 181 * ( B26 + B21 ) >> 6); A22 = ( 181 * ( B25 - B22 ) >> 6); A25 = ( 181 * ( B25 + B22 ) >> 6); A23 = ( 181 * ( B24 - B23 ) >> 6); A24 = ( 181 * ( B24 + B23 ) >> 6); x0 = A0 + B31; x31 = A0 - B31; x1 = A1 + B30; x30 = A1 - B30; x2 = A2 + B29; x29 = A2 - B29; x3 = A3 + B28; x28 = A3 - B28; x4 = A4 + A27; x27 = A4 - A27; x5 = A5 + A26; x26 = A5 - A26; x6 = A6 + A25; x25 = A6 - A25; x7 = A7 + A24; x24 = A7 - A24; x8 = A8 + A23; x23 = A8 - A23; x9 = A9 + A22; x22 = A9 - A22; x10 = A10 + A21; x21 = A10 - A21; x11 = A11 + A20; x20 = A11 - A20; x12 = A12 + B19; x19 = A12 - B19; x13 = A13 + B18; x18 = A13 - B18; x14 = A14 + B17; x17 = A14 - B17; x15 = A15 + B16; x16 = A15 - B16;
N이 64인 경우, 즉 64x64 입력 블록에 대하여 치환된 삼각 함수값을 이용한 1차원 이산 코사인 변환을 수행하는 단계는, X0 내지 X63은 변환되어야 할 입력값, A0 내지 O63은 중간값, Y0 내지 Y63은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
O0 = X0+X63; O63 = X0-X63; O1 = X1+X62; O62 = X1-X62; O2 = X2+X61; O61 = X2-X61; O3 = X3+X60; O60 = X3-X60; O4 = X4+X59; O59 = X4-X59; O5 = X5+X58; O58 = X5-X58; O6 = X6+X57; O57 = X6-X57; O7 = X7+X56; O56 = X7-X56; O8 = X8+X55; O55 = X8-X55; O9 = X9+X54; O54 = X9-X54; O10 = X10+X53; O53 = X10-X53; O11 = X11+X52; O52 = X11-X52; O12 = X12+X51; O51 = X12-X51; O13 = X13+X50; O50 = X13-X50; O14 = X14+X49; O49 = X14-X49; O15 = X15+X48; O48 = X15-X48; O16 = X16+X47; O47 = X16-X47; O17 = X17+X46; O46 = X17-X46; O18 = X18+X45; O45 = X18-X45; O19 = X19+X44; O44 = X19-X44; O20 = X20+X43; O43 = X20-X43; O21 = X21+X42; O42 = X21-X42; O22 = X22+X41; O41 = X22-X41; O23 = X23+X40; O40 = X23-X40; O24 = X24+X39; O39 = X24-X39; O25 = X25+X38; O38 = X25-X38; O26 = X26+X37; O37 = X26-X37; O27 = X27+X36; O36 = X27-X36; O28 = X28+X35; O35 = X28-X35; O29 = X29+X34; O34 = X29-X34; O30 = X30+X33; O33 = X30-X33; O31 = X31+X32; O32 = X31-X32;
A0 = O0+O31; A31 = O0-O31; A1 = O1+O30; A30 = O1-O30; A2 = O2+O29; A29 = O2-O29; A3 = O3+O28; A28 = O3-O28; A4 = O4+O27; A27 = O4-O27; A5 = O5+O26; A26 = O5-O26; A6 = O6+O25; A25 = O6-O25; A7 = O7+O24; A24 = O7-O24; A8 = O8+O23; A23 = O8-O23; A9 = O9+O22; A22 = O9-O22; A10 = O10+O21; A21 = O10-O21; A11 = O11+O20; A20 = O11-O20; A12 = O12+O19; A19 = O12-O19; A13 = O13+O18; A18 = O13-O18; A14 = O14+O17; A17 = O14-O17; A15 = O15+O16; A16 = O15-O16; A40 = (724*(O55-O40))>>10; A55 = (724*(O55+O40))>>10; A41 = (724*(O54-O41))>>10; A54 = (724*(O54+O41))>>10; A42 = (724*(O53-O42))>>10; A53 = (724*(O53+O42))>>10; A43 = (724*(O52-O43))>>10; A52 = (724*(O52+O43))>>10; A44 = (724*(O51-O44))>>10; A51 = (724*(O51+O44))>>10; A45 = (724*(O50-O45))>>10; A50 = (724*(O50+O45))>>10; A46 = (724*(O49-O46))>>10; A49 = (724*(O49+O46))>>10; A47 = (724*(O48-O47))>>10; A48 = (724*(O48+O47))>>10;
B0 = A0+A15; B15 = A0-A15; B1 = A1+A14; B14 = A1-A14; B2 = A2+A13; B13 = A2-A13; B3 = A3+A12; B12 = A3-A12; B4 = A4+A11; B11 = A4-A11; B5 = A5+A10; B10 = A5-A10; B6 = A6+A9; B9 = A6-A9; B7 = A7+A8; B8 = A7-A8; B20 = (724*(A27-A20))>>10; B27 = (724*(A27+A20))>>10; B21 = (724*(A26-A21))>>10; B26 = (724*(A26+A21))>>10; B22 = (724*(A25-A22))>>10; B25 = (724*(A25+A22))>>10; B23 = (724*(A24-A23))>>10; B24 = (724*(A24+A23))>>10; B32 = O32+A47; B47 = O32-A47; B48 = O63-A48; B63 = O63+A48; B33 = O33+A46; B46 = O33-A46; B49 = O62-A49; B62 = O62+A49; B34 = O34+A45; B45 = O34-A45; B50 = O61-A50; B61 = O61+A50; B35 = O35+A44; B44 = O35-A44; B51 = O60-A51; B60 = O60+A51; B36 = O36+A43; B43 = O36-A43; B52 = O59-A52; B59 = O59+A52; B37 = O37+A42; B42 = O37-A42; B53 = O58-A53; B58 = O58+A53; B38 = O38+A41; B41 = O38-A41; B54 = O57-A54; B57 = O57+A54; B39 = O39+A40; B40 = O39-A40; B55 = O56-A55 ; B56 = O56+A55;
C0 = B0+B7; C7 = B0-B7; C1 = B1+B6; C6 = B1-B6; C2 = B2+B5; C5 = B2-B5; C3 = B3+B4; C4 = B3-B4; C10 = (724*(B13-B10))>>10; C13 = (724*(B13+B10))>>10; C11 = (724*(B12-B11))>>10; C12 = (724*(B12+B11))>>10; C16 = A16+B23; C23 = A16-B23; C24 = A31-B24; C31 = A31+B24; C17 = A17+B22; C22 = A17-B22; C25 = A30-B25; C30 = A30+B25; C18 = A18+B21; C21 = A18-B21; C26 = A29-B26; C29 = A29+B26; C19 = A19+B20; C20 = A19-B20; C27 = A28-B27; C28 = A28+B27; C36 = (392*B59-946*B36)>>10; C40 = (-946*B55-392*B40)>>10; C52 = (-946*B43+392*B52)>>10; C56 = (392*B39+946*B56)>>10; C37 = (392*B58-946*B37)>>10; C41 = (-946*B54-392*B41)>>10; C53 = (-946*B42+392*B53)>>10; C57 = (392*B38+946*B57)>>10; C38 = (392*B57-946*B38)>>10; C42 = (-946*B53-392*B42)>>10; C54 = (-946*B41+392*B54)>>10; C58 = (392*B37+946*B58)>>10; C39 = (392*B56-946*B39)>>10; C43 = (-946*B52-392*B43)>>10; C55 = (-946*B40+392*B55)>>10; C59 = (392*B36+946*B59)>>10;
D0 = C0+C3; D3 = C0-C3; D8 = B8+C11; D11 = B8-C11; D12 = B15-C12; D15 = B15+C12; D1 = C1+C2; D2 = C1-C2; D9 = B9+C10; D10 = B9-C10; D13 = B14-C13; D14 = B14+C13; D5 = (724*(C6-C5))>>10; D6 = (724*(C6+C5))>>10; D18 = (392*C29-946*C18)>>10; D20 = (-946*C27-392*C20)>>10; D26 = (-946*C21+392*C26)>>10; D28 = (392*C19+946*C28)>>10; D19 = (392*C28-946*C19)>>10; D21 = (-946*C26-392*C21)>>10; D27 = (-946*C20+392*C27)>>10; D29 = (392*C18+946*C29)>>10; D32 = B32+C39; D39 = B32-C39; D40 = B47-C40; D47 = B47+C40; D48 = B48+C55; D55 = B48-C55; D56 = B63-C56; D63 = B63+C56; D33 = B33+C38; D38 = B33-C38; D41 = B46-C41; D46 = B46+C41; D49 = B49+C54; D54 = B49-C54; D57 = B62-C57; D62 = B62+C57; D34 = B34+C37; D37 = B34-C37; D42 = B45-C42; D45 = B45+C42; D50 = B50+C53; D53 = B50-C53; D58 = B61-C58; D61 = B61+C58; D35 = B35+C36; D36 = B35-C36; D43 = B44-C43; D44 = B44+C43; D51 = B51+C52; D52 = B51-C52; D59 = B60-C59; D60 = B60+C59;
E0 = (724*(D0+D1))>>10; E1 = (724*(D0-D1))>>10; E2 = (946*D3+392*D2)>>10; E3 = (392*D3-946*D2)>>10; E4 = C4+D5; E5 = C4-D5; E6 = C7-D6; E7 = C7+D6; E9 = (392*D14-946*D9)>>10; E10 = (-946*D13-392*D10)>>10; E13 = (392*D13-946*D10)>>10; E14 = (946*D14+392*D9)>>10; D15 = D15; E16 = C16+D19; E19 = C16-D19; E20 = C23-D20; E23 = C23+D20; E24 = C24+D27; E27 = C24-D27; E28 = C31-D28; E31 = C31+D28; E17 = C17+D18; E18 = C17-D18; E21 = C22-D21; E22 = C22+D21; E25 = C25+D26; E26 = C25-D26; E29 = C30-D29; E30 = C30+D29; E34 = (200*D61-1004*D34)>>10; E35 = (200*D60-1004*D35)>>10; E36 = (-1004*D59-200*D36)>>10; E37 = (-1004*D58-200*D37)>>10; E42 = (851*D53-569*D42)>>10; E43 = (851*D52-569*D43)>>10; E44 = (-569*D51-851*D44)>>10; E45 = (-569*D50-851*D45)>>10; E50 = (851*D50-569*D45)>>10; E51 = (851*D51-569*D44)>>10; E52 = (569*D52+851*D43)>>10; E53 = (569*D53+851*D42)>>10; E58 = (200*D58-1004*D37)>>10; E59 = (200*D59-1004*D36)>>10; E60 = (1004*D60+200*D35)>>10; E61 = (1004*D61+200*D34)>>10;
F4 = (200*E4+1004*E7)>>10; F5 = (851*E5+569*E6)>>10; F6 = (851*E6-569*E5)>>10; F7 = (200*E7-1004*E4)>>10; F8 = D8+E9; F9 = D8-E9; F10 = D11-E10; F11 = D11+E10; F12 = D12+E13; F13 = D12-E13; F14 = D15-E14; F15 = D15+E14; F17 = (200*E30-1004*E17)>>10; F18 = (-1004*E29-200*E18)>>10; F21 = (851*E26-569*E21)>>10; F22 = (-569*E25-851*E22)>>10; F25 = (851*E25-569*E22)>>10; F26 = (569*E26+851*E21)>>10; F29 = (200*E29-1004*E18)>>10; F30 = (1004*E30+200*E17)>>10; F32 = D32+E35; F33 = D33+E34; F34 = D33-E34; F35 = D32-E35; F36 = D39-E36; F37 = D38-E37; F38 = D38+E37; F39 = D39+E36; F40 = D40+E43; F41 = D41+E42; F42 = D41-E42; F43 = D40-E43; F44 = D47-E44; F45 = D46-E45; F46 = D46+E45; F47 = D47+E44; F48 = D48+E51; F49 = D49+E50; F50 = D49-E50; F51 = D48-E51; F52 = D55-E52; F53 = D54-E53; F54 = D54+E53; F55 = D55+E52; F56 = D56+E59; F57 = D57+E58; F58 = D57-E58; F59 = D56-E59; F60 = D63-E60; F61 = D62-E61; F62 = D62+E61; F63 = D63+E60;
G8 = (100*F8+1019*F15)>>10; G9 = (792*F9+650*F14)>>10; G10 = (483*F10+903*F13)>>10; G11 = (980*F11+297*F12)>>10; G12 = (980*F12-297*F11)>>10; G13 = (483*F13-903*F10)>>10; G14 = (792*F14-650*F9)>>10; G15 = (100*F15-1019*F8)>>10; G16 = E16+F17; G17 = E16-F17; G18 = E19-F18; G19 = E19+F18; G20 = E20+F21; G21 = E20-F21; G22 = E23-F22; G23 = E23+F22; G24 = E24+F25; G25 = E24-F25; G26 = E27-F26; G27 = E27+F26; G28 = E28+F29; G29 = E28-F29; G30 = E31-F30; G31 = E31+F30; G33 = (100*F62-1019*F33)>>10; G34 = (-1019*F61-100*F34)>>10; G37 = (792*F58-650*F37)>>10; G38 = (-650*F57-792*F38)>>10; G41 = (483*F54-903*F41)>>10 ; G42 = (-903*F53-483*F42)>>10; G45 = (980*F50-297*F45)>>10; G46 = (-297*F49-980*F46)>>10; G49 = (980*F49-297*F46)>>10; G50 = (297*F50+980*F45)>>10; G53 = (483*F53-903*F42)>>10; G54 = (903*F54+483*F41)>>10; G57 = (792*F57-650*F38)>>10; G58 = (650*F58+792*F37)>>10; G61 = (100*F61-1019*F34)>>10; G62 = (1019*F62+100*F33)>>10;
H16 = (50*G16+1023*G31)>>10; H17 = (759*G17+688*G30)>>10; H18 = (438*G18+926*G29)>>10; H19 = (964*G19+345*G28)>>10; H20 = (249*G20+993*G27)>>10; H21 = (878*G21+526*G26)>>10; H22 = (610*G22+822*G25)>>10; H23 = (1013*G23+150*G24)>>10; H24 = (1013*G24-150*G23)>>10; H25 = (610*G25-822*G22)>>10; H26 = (878*G26-526*G21)>>10; H27 = (249*G27-993*G20)>>10; H28 = (964*G28-345*G19)>>10; H29 = (438*G29-926*G18)>>10; H30 = (759*G30-688*G17)>>10; H31 = (50*G31-1023*G16)>>10; H32 = F32+G33; H33 = F32-G33; H34 = F35-G34; H35 = F35+G34; H36 = F36+G37; H37 = F36-G37; H38 = F39-G38; H39 = F39+G38; H40 = F40+G41; H41 = F40-G41; H42 = F43-G42; H43 = F43+G42; H44 = F44+G45; H45 = F44-G45; H46 = F47-G46; H47 = F47+G46; H48 = F48+G49; H49 = F48-G49; H50 = F51-G50; H51 = F51+G50; H52 = F52+G53; H53 = F52-G53; H54 = F55-G54; H55 = F55+G54; H56 = F56+G57; H57 = F56-G57; H58 = F59-G58; H59 = F59+G58; H60 = F60+G61; H61 = F60-G61; H62 = F63-G62; H63 = F63+G62;
I32 = (25*H32+1024*H63)>>10; I33 = (742*H33+706*H62)>>10; I34 = (415*H34+936*H61)>>10; I35 = (955*H35+369*H60)>>10; I36 = (224*H36+999*H59)>>10; I37 = (865*H37+548*H58)>>10; I38 = (590*H38+837*H57)>>10; I39 = (1009*H39+175*H56)>>10; I40 = (125*H40+1016*H55)>>10; I41 = (807*H41+630*H54)>>10; I42 = (505*H42+891*H53)>>10; I43 = (987*H43+273*H52)>>10; I44 = (321*H44+972*H51)>>10; I45 = (915*H45+460*H50)>>10; I46 = (669*H46+775*H49)>>10; I47 = (1021*H47+75*H48)>>10; I48 = (1021*H48-75*H47)>>10; I49 = (669*H49-775*H46)>>10; I50 = (915*H50-460*H45)>>10; I51 = (321*H51-972*H44)>>10; I52 = (987*H52-273*H43)>>10; I53 = (505*H53-891*H42)>>10; I54 = (807*H54-630*H41)>>10; I55 = (125*H55-1016*H40)>>10; I56 = (1009*H56-175*H39)>>10; I57 = (590*H57-837*H38)>>10; I58 = (865*H58-548*H37)>>10; I59 = (224*H59-999*H36)>>10; I60 = (955*H60-369*H35)>>10; I61 = (415*H61-936*H34)>>10; I62 = (742*H62-706*H33)>>10; I63 = (25*H63-1024*H32)>>10;
Y0 = E0; Y1 = I32; Y2 = H16; Y3 = I48; Y4 = G8; Y5 = I40; Y6 = H24; Y7 = I56; Y8 = F4; Y9 = I36; Y10 = H20; Y11 = I52; Y12 = G12; Y13 = I44; Y14 = H28; Y15 = I60; Y16 = E2; Y17 = I34; Y18 = H18; Y19 = I50; Y20 = G10; Y21 = I42; Y22 = H26; Y23 = I58; Y24 = F6; Y25 = I38; Y26 = H22; Y27 = I54; Y28 = G14; Y29 = I46; Y30 = H30; Y31 = I62; Y32 = E1; Y33 = I33; Y34 = H17; Y35 = I49; Y36 = G9; Y37 = I41; Y38 = H25; Y39 = I57; Y40 = F5; Y41 = I37; Y42 = H21; Y43 = I53; Y44 = G13; Y45 = I45; Y46 = H29; Y47 = I61; Y48 = E3; Y49 = I35; Y50 = H19; Y51 = I51; Y52 = G11; Y53 = I43; Y54 = H27; Y55 = I59; Y56 = F7; Y57 = I39; Y58 = H23; Y59 = I55; Y60 = G15; Y61 = I47; Y62 = H31; Y63 = I63
이에 대응되는 64 포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 X0 내지 X63은 역변환되어야 할 입력값, A0 내지 O63은 중간값, Y0 내지 Y63은 역변환된 값을 나타낸다.
H32 = (25*X1-1024*X63) >> 10; H33 = (742*X33-706*X31) >> 10; H34 = (415*X17-936*X47) >> 10; H35 = (955*X49-369*X15) >> 10; H36 = (224*X9-999*X55) >> 10; H37 = (865*X41-548*X23) >> 10; H38 = (590*X25-837*X39) >> 10; H39 = (1009*X57-175*X7) >> 10; H40 = (125*X5-1016*X59) >> 10; H41 = (807*X37-630*X27) >> 10; H42 = (505*X21-891*X43) >> 10; H43 = (987*X53-273*X11) >> 10; H44 = (321*X13-972*X51) >> 10; H45 = (915*X45-460*X19) >> 10; H46 = (669*X29-775*X35) >> 10; H47 = (1021*X61-75*X3) >> 10; H48 = (1021*X3+75*X61) >> 10; H49 = (669*X35+775*X29) >> 10; H50 = (915*X19+460*X45) >> 10; H51 = (321*X51+972*X13) >> 10; H52 = (987*X11+273*X53) >> 10; H53 = (505*X43+891*X21) >> 10; H54 = (807*X27+630*X37) >> 10; H55 = (125*X59+1016*X5) >> 10; H56 = (1009*X7+175*X57) >> 10; H57 = (590*X39+837*X25) >> 10; H58 = (865*X23+548*X41) >> 10; H59 = (224*X55+999*X9) >> 10; H60 = (955*X15+369*X49) >> 10; H61 = (415*X47+936*X17) >> 10; H62 = (742*X31+706*X33) >> 10; H63 = (25*X63+1024*X1) >> 10;
G16 = (50*X2-1023*X62) >> 10; G17 = (759*X34-688*X30) >> 10; G18 = (438*X18-926*X46) >> 10; G19 = (964*X50-345*X14) >> 10; G20 = (249*X10-993*X54) >> 10; G21 = (878*X42-526*X22) >> 10; G22 = (610*X26-822*X38) >> 10; G23 = (1013*X58-150*X6) >> 10; G24 = (1013*X6+150*X58) >> 10; G25 = (610*X38+822*X26) >> 10; G26 = (878*X22+526*X42) >> 10; G27 = (249*X54+993*X10) >> 10; G28 = (964*X14+345*X50) >> 10; G29 = (438*X46+926*X18) >> 10; G30 = (759*X30+688*X34) >> 10; G31 = (50*X62+1023*X2) >> 10; G32 = H32+H33; G33 = H32-H33; G34 = H35-H34; G35 = H35+H34; G36 = H36+H37; G37 = H36-H37; G38 = H39-H38; G39 = H39+H38; G40 = H40+H41; G41 = H40-H41; G42 = H43-H42; G43 = H43+H42; G44 = H44+H45; G45 = H44-H45; G46 = H47-H46; G47 = H47+H46; G48 = H48+H49; G49 = H48-H49; G50 = H51-H50; G51 = H51+H50; G52 = H52+H53; G53 = H52-H53; G54 = H55-H54; G55 = H55+H54; G56 = H56+H57; G57 = H56-H57; G58 = H59-H58; G59 = H59+H58; G60 = H60+H61; G61 = H60-H61; G62 = H63-H62; G63 = H63+H62;
F8 = (100*X4-1019*X60) >> 10; F9 = (792*X36-650*X28) >> 10; F10 = (483*X20-903*X44) >> 10; F11 = (980*X52-297*X12) >> 10; F12 = (980*X12+297*X52) >> 10; F13 = (483*X44+903*X20) >> 10; F14 = (792*X28+650*X36) >> 10; F15 = (100*X60+1019*X4) >> 10; F16 = G16+G17; F17 = G16-G17; F18 = G19-G18; F19 = G19+G18; F20 = G20+G21; F21 = G20-G21; F22 = G23-G22; F23 = G23+G22; F24 = G24+G25; F25 = G24-G25; F26 = G27-G26; F27 = G27+G26; F28 = G28+G29; F29 = G28-G29; F30 = G31-G30; F31 = G31+G30; F33 = (100*G62-1019*G33) >> 10; F34 = (-1019*G61-100*G34) >> 10; F37 = (792*G58-650*G37) >> 10; F38 = (-650*G57-792*G38) >> 10; F41 = (483*G54-903*G41) >> 10; F42 = (-903*G53-483*G42) >> 10; F45 = (980*G50-297*G45) >> 10; F46 = (-297*G49-980*G46) >> 10; F49 = (980*G49-297*G46) >> 10; F50 = (297*G50+980*G45) >> 10; F53 = (483*G53-903*G42) >> 10; F54 = (903*G54+483*G41) >> 10; F57 = (792*G57-650*G38) >> 10; F58 = (650*G58+792*G37) >> 10; F61 = (100*G61-1019*G34) >> 10; F62 = (1019*G62+100*G33) >> 10
E4 = (200*X8-1004*X56) >> 10; E5 = (851*X40-569*X24) >> 10; E6 = (851*X24+569*X40) >> 10; E7 = (200*X56+1004*X8) >> 10; E8 = F8+F9; E9 = F8-F9; E10 = F11-F10; E11 = F11+F10; E12 = F12+F13; E13 = F12-F13; E14 = F15-F14; E15 = F15+F14; E17 = (200*F30-1004*F17) >> 10; E18 = (-1004*F29-200*F18) >> 10; E21 = (851*F26-569*F21) >> 10; E22 = (-569*F25-851*F22) >> 10; E25 = (851*F25-569*F22) >> 10; E26 = (569*F26+851*F21) >> 10; E29 = (200*F29-1004*F18) >> 10; E30 = (1004*F30+200*F17) >> 10; E32 = G32+G35; E33 = F33+F34; E34 = F33-F34; E35 = G32-G35; E36 = G39-G36; E37 = F38-F37; E38 = F38+F37; E39 = G39+G36; E40 = G40+G43; E41 = F41+F42; E42 = F41-F42; E43 = G40-G43; E44 = G47-G44; E45 = F46-F45; E46 = F46+F45; E47 = G47+G44; E48 = G48+G51; E49 = F49+F50; E50 = F49-F50; E51 = G48-G51; E52 = G55-G52; E53 = F54-F53; E54 = F54+F53; E55 = G55+G52; E56 = G56+G59; E57 = F57+F58; E58 = F57-F58; E59 = G56-G59; E60 = G63-G60; E61 = F62-F61; E62 = F62+F61;E63 = G63+G60
D0 = (724*(X0+X32)) >> 10; D1 = (724*(X0-X32)) >> 10; D2 = (392*X16-946*X48) >> 10; D3 = (946*X16+392*X48) >> 10; D4 = E4+E5; D5 = E4-E5; D6 = E7-E6; D7 = E7+E6; D9 = (392*E14-946*E9) >> 10; D10 = (-946*E13-392*E10) >> 10; D13 = (392*E13-946*E10) >> 10; D14 = (946*E14+392*E9) >> 10; D16 = F16+F19; D19 = F16-F19; D20 = F23-F20; D23 = F23+F20; D24 = F24+F27; D27 = F24-F27; D28 = F31-F28; D31 = F31+F28; D17 = E17+E18; D18 = E17-E18; D21 = E22-E21; D22 = E22+E21; D25 = E25+E26; D26 = E25-E26; D29 = E30-E29; D30 = E30+E29; D34 = (200*E61-1004*E34) >> 10; D35 = (200*E60-1004*E35) >> 10; D36 = (-1004*E59-200*E36) >> 10; D37 = (-1004*E58-200*E37) >> 10; D42 = (851*E53-569*E42) >> 10; D43 = (851*E52-569*E43) >> 10; D44 = (-569*E51-851*E44) >> 10; D45 = (-569*E50-851*E45) >> 10; D50 = (851*E50-569*E45) >> 10; D51 = (851*E51-569*E44) >> 10; D52 = (569*E52+851*E43) >> 10; D53 = (569*E53+851*E42) >> 10; D58 = (200*E58-1004*E37) >> 10; D59 = (200*E59-1004*E36) >> 10; D60 = (1004*E60+200*E35) >> 10; D61 = (1004*E61+200*E34) >> 10;
C0 = D0+D3; C3 = D0-D3; C8 = E8+E11; C11 = E8-E11; C12 = E15-E12; C15 = E15+E12; C1 = D1+D2; C2 = D1-D2; C9 = D9+D10; C10 = D9-D10; C13 = D14-D13; C14 = D14+D13; C5 = (724*(D6-D5)) >> 10; C6 = (724*(D6+D5)) >> 10; C18 = (392*D29-946*D18) >> 10; C20 = (-946*D27-392*D20) >> 10; C26 = (-946*D21+392*D26) >> 10; C28 = (392*D19+946*D28) >> 10; C19 = (392*D28-946*D19) >> 10; C21 = (-946*D26-392*D21) >> 10; C27 = (-946*D20+392*D27) >> 10; C29 = (392*D18+946*D29) >> 10; C32 = E32+E39; C39 = E32-E39; C40 = E47-E40; C47 = E47+E40; C48 = E48+E55; C55 = E48-E55; C56 = E63-E56; C63 = E63+E56; C33 = E33+E38; C38 = E33-E38; C41 = E46-E41; C46 = E46+E41; C49 = E49+E54; C54 = E49-E54; C57 = E62-E57; C62 = E62+E57; C34 = D34+D37; C37 = D34-D37; C42 = D45-D42; C45 = D45+D42; C50 = D50+D53; C53 = D50-D53; C58 = D61-D58; C61 = D61+D58; C35 = D35+D36; C36 = D35-D36; C43 = D44-D43; C44 = D44+D43; C51 = D51+D52; C52 = D51-D52; C59 = D60-D59; C60 = D60+D59;
B0 = C0+D7; B7 = C0-D7; B1 = C1+C6; B6 = C1-C6; B2 = C2+C5; B5 = C2-C5; B3 = C3+D4; B4 = C3-D4; B10 = (724*(C13-C10)) >> 10; B13 = (724*(C13+C10)) >> 10; B11 = (724*(C12-C11)) >> 10; B12 = (724*(C12+C11)) >> 10; B16 = D16+D23; B23 = D16-D23; B24 = D31-D24; B31 = D31+D24; B17 = D17+D22; B22 = D17-D22; B25 = D30-D25; B30 = D30+D25; B18 = C18+C21; B21 = C18-C21; B26 = C29-C26; B29 = C29+C26; B19 = C19+C20; B20 = C19-C20; B27 = C28-C27; B28 = C28+C27; B36 = (392*C59-946*C36) >> 10; B40 = (-946*C55-392*C40) >> 10; B52 = (-946*C43+392*C52) >> 10; B56 = (392*C39+946*C56) >> 10; B37 = (392*C58-946*C37) >> 10; B41 = (-946*C54-392*C41) >> 10; B53 = (-946*C42+392*C53) >> 10; B57 = (392*C38+946*C57) >> 10; B38 = (392*C57-946*C38) >> 10; B42 = (-946*C53-392*C42) >> 10; B54 = (-946*C41+392*C54) >> 10; B58 = (392*C37+946*C58) >> 10; B39 = (392*C56-946*C39) >> 10; B43 = (-946*C52-392*C43) >> 10; B55 = (-946*C40+392*C55) >> 10; B59 = (392*C36+946*C59) >> 10
A0 = B0+C15; A15 = B0-C15; A1 = B1+C14; A14 = B1-C14; A2 = B2+B13; A13 = B2-B13; A3 = B3+B12; A12 = B3-B12; A4 = B4+B11; A11 = B4-B11; A5 = B5+B10; A10 = B5-B10; A6 = B6+C9; A9 = B6-C9; A7 = B7+C8; A8 = B7-C8; A20 = (724*(B27-B20)) >> 10; A27 = (724*(B27+B20)) >> 10; A21 = (724*(B26-B21)) >> 10; A26 = (724*(B26+B21)) >> 10; A22 = (724*(B25-B22)) >> 10; A25 = (724*(B25+B22)) >> 10; A23 = (724*(B24-B23)) >> 10; A24 = (724*(B24+B23)) >> 10; A32 = C32+C47; A47 = C32-C47; A48 = C63-C48; A63 = C63+C48; A33 = C33+C46; A46 = C33-C46; A49 = C62-C49; A62 = C62+C49; A34 = C34+C45; A45 = C34-C45; A50 = C61-C50; A61 = C61+C50; A35 = C35+C44; A44 = C35-C44; A51 = C60-C51; A60 = C60+C51; A36 = B36+B43; A43 = B36-B43; A52 = B59-B52; A59 = B59+B52; A37 = B37+B42; A42 = B37-B42; A53 = B58-B53; A58 = B58+B53; A38 = B38+B41; A41 = B38-B41; A54 = B57-B54; A57 = B57+B54; A39 = B39+B40; A40 = B39-B40; A55 = B56-B55; A56 = B56+B55;
O0 = A0+B31; O31 = A0-B31; O1 = A1+B30; O30 = A1-B30; O2 = A2+B29; O29 = A2-B29; O3 = A3+B28; O28 = A3-B28; O4 = A4+A27; O27 = A4-A27; O5 = A5+A26; O26 = A5-A26; O6 = A6+A25; O25 = A6-A25; O7 = A7+A24; O24 = A7-A24; O8 = A8+A23; O23 = A8-A23; O9 = A9+A22; O22 = A9-A22; O10 = A10+A21; O21 = A10-A21; O11 = A11+A20; O20 = A11-A20; O12 = A12+B19; O19 = A12-B19; O13 = A13+B18; O18 = A13-B18; O14 = A14+B17; O17 = A14-B17; O15 = A15+B16; O16 = A15-B16; O40 = (724*(A55-A40)) >> 10; O55 = (724*(A55+A40)) >> 10; O41 = (724*(A54-A41)) >> 10; O54 = (724*(A54+A41)) >> 10; O42 = (724*(A53-A42)) >> 10; O53 = (724*(A53+A42)) >> 10; O43 = (724*(A52-A43)) >> 10; O52 = (724*(A52+A43)) >> 10; O44 = (724*(A51-A44)) >> 10; O51 = (724*(A51+A44)) >> 10; O45 = (724*(A50-A45)) >> 10; O50 = (724*(A50+A45)) >> 10; O46 = (724*(A49-A46)) >> 10; O49 = (724*(A49+A46)) >> 10; O47 = (724*(A48-A47)) >> 10; O48 = (724*(A48+A47)) >> 10;
Y0 = O0+A63; Y63 = O0-A63; Y1 = O1+A62; Y62 = O1-A62; Y2 = O2+A61; Y61 = O2-A61; Y3 = O3+A60; Y60 = O3-A60; Y4 = O4+A59; Y59 = O4-A59; Y5 = O5+A58; Y58 = O5-A58; Y6 = O6+A57; Y57 = O6-A57; Y7 = O7+A56; Y56 = O7-A56; Y8 =O8+O55; Y55 = O8-O55; Y9 = O9+O54; Y54 = O9-O54; Y10 = O10+O53; Y53 = O10-O53; Y11 = O11+O52; Y52 = O11-O52; Y12 = O12+O51; Y51 = O12-O51; Y13 = O13+O50; Y50 = O13-O50; Y14 = O14+O49; Y49 = O14-O49; Y15 = O15+O48; Y48 = O15-O48; Y16 = O16+O47; Y47 = O16-O47; Y17 = O17+O46; Y46 = O17-O46; Y18 = O18+O45; Y45 = O18-O45; Y19 = O19+O44; Y44 = O19-O44; Y20 = O20+O43; Y43 = O20-O43; Y21 = O21+O42; Y42 = O21-O42; Y22 = O22+O41; Y41 = O22-O41; Y23 = O23+O40; Y40 = O23-O40; Y24 = O24+A39; Y39 = O24-A39; Y25 = O25+A38; Y38 = O25-A38; Y26 = O26+A37; Y37 = O26-A37; Y27 = O27+A36; Y36 = O27-A36; Y28 = O28+A35; Y35 = O28-A35; Y29 = O29+A34; Y34 = O29-A34; Y30 = O30+A33; Y33 = O30-A33; Y31 = O31+A32; Y32 = O31-A32
전술한 도 3의 단계 350과 유사하게, 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬(Original_A)과 치환된 삼각함수 값을 이용한 수학식 1 내지 2의 변환 행렬(F16, F32) 사이의 차이값을 보정하기 위한 스케일링 행렬 및 시프트 연산을 적용하여 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행할 수 있다.
본 발명의 또 다른 실시예에 따라서 16x16 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 전술한 도 7과 같다.
32x32 블록에 적용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)은 도 9 내지 도 14와 같다. 64x64 블록에 적용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)는 다음과 같이 정의될 수 있다.
< 64x64 입력 블록에 대한 스케일링 행렬(MF)의 예>
m = 11 일 때, Q0 = 102*ONES / Q1 = 93*ONES / Q2 = 79*ONES / Q3 = 73*ONES / Q4 = 64*ONES / Q5 = 57*ONES
m = 10 일 때, Q0 = 51*ONES / Q1 = 47*ONES / Q2 = 39*ONES /
Q3 = 37*ONES / Q4 = 32*ONES / Q5 = 28*ONES
m = 9일 때, Q0 = 26*ONES / Q1 = 23*ONES / Q2 = 20*ONES /
Q3 = 18*ONES / Q4 = 16*ONES / Q5 = 14*ONES
상기 예에서 Q#의 #값은 (QP mod 6)이며, ONES는 모든 원소가 1인 64x64 행렬을 나타낸다.
전술한 본 발명의 일 실시예와 유사하게 역양자화 단계에서는 이산 코사인 역변환에 이용되는 원래의 NxN 역변환 행렬과 치환된 NxN 변환 행렬의 역행렬인 NxN 역변환 행렬 사이의 차이값을 보정하기 위한 역스케일링 행렬 및 시프트 연산을 적용하여 역양자화를 수행한다.
16x16 블록에 적용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)은 도 8과 같다. 유사하게, 32x32 입력 블록 및 64x64 블록에 적용되는 양자화 파라메터에 따른 역스케일링 행렬(V)도 전술한 16x16 블록에 적용되는 역스케일링 행렬(V) 계산 과정과 유사한 과정을 통해 획득될 수 있다. 도 101a 내지 도 101f는 본 발명의 또 다른 실시예에 따라서 32x32 블록에 적용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예를 도시한다.
64x64 블록에 적용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)는 다음과 같이 정의될 수 있다.
< 64x64 입력 블록에 대한 역스케일링 행렬(V)의 예>
n = 11 일 때, Q0 = 40*ONES / Q1 = 44*ONES / Q2 = 52*ONES / Q3 = 56*ONES / Q4 = 64*ONES / Q5 = 72*ONES
n = 10 일 때, Q0 = 20*ONES / Q1 = 22*ONES / Q2 = 26*ONES /
Q3 = 28*ONES / Q4 = 32*ONES / Q5 = 36*ONES
n = 9일 때, Q0 = 10*ONES / Q1 = 11*ONES / Q2 = 13*ONES /
Q3 = 14*ONES / Q4 = 16*ONES / Q5 = 18*ONES
상기 예에서 Q#의 #값은 (QP mod 6)의 값이며, ONES는 모든 원소가 1인 64x64 행렬을 나타낸다.
전술한 16x16, 32x32, 64x64의 변환 및 역변환 과정은 곱셈을 포함하지 않는 형태로 변경될 수 있다. 구체적으로, 각 변환 과정은 분모가 2의 거듭 제곱꼴인 유리수(dyadic rational)와 중간값들의 곱으로 표현된다. 분모가 2의 거듭 제곱꼴인 유리수(dyadic rational) 형태의 상수를, 분자가 1인 분수들만의 덧셈 및 뺄셈의 형태로 분해하면 곱셈 연산 없이, 덧셈, 뺄셈 및 쉬프트 연산만으로 해당 연산이 수행될 수 있다. 또한, 분해시에 항의 개수가 최소가 되도록 하면 덧셈, 뺄셈 및 쉬프트 연산의 수를 줄일 수 있다. 예를 들어, 분모가 2의 거듭 제곱꼴인 유리수(dyadic rational)의 하나인 59/64는 (1-1/16-1/64)로 변경될 수 있다. 이러한 59/64를 소정의 중간값 x와 곱하는 연산, 즉 (59/64)*x=(59*x)/64이고 64는 2^6이기 때문에 (59*x)/64는 (59*x)>>6을 계산하는 것과 같다. 상기 59/64는 (1-1/16-1/64)로 분해될 수 있기 때문에, (59*x)>>6는 (x-(x>>4)-(x>>6))으로 변경될 수 있다. 이와 같은 경우 (59*x)/64를 계산하기 위해서 원래 곱셈 1번, 쉬프트 연산이 1번 필요했다면 (x-x>>4-x>>6)을 계산시에는 뺄셈 2번, 쉬프트 연산 2번이 필요하게 되므로 복잡도가 큰 곱셈 연산의 횟수를 줄일 수 있다.
따라서, 본 발명에서는 변환 및 역변환에 이용되는 각 곱셈 연산을 다음의 표들에 도시된 바와 같은 연산으로 대체하여 변환 및 연산을 수행할 수 있다. 도 102a는 16x16 변환에 이용되는 곱셈의 대체 연산 과정, 도 102b는 32x32 변환에 이용되는 곱셈의 대체 연산 과정, 도 102c는 64x64 변환에 이용되는 곱셈의 대체 연산 과정을 나타낸다. 일 예로, 도 102a에서 첫 번째 표시된 63*x와 같은 연산은 (X<<6)-x와 같이 곱셈 연산을 쉬프트 연산 및 뺄셈 연산만으로 대체된다. 이와 같이 본 발명에서는 하드웨어에 큰 연산량을 요구하는 곱셈 연산을 쉬프트 연산으로 대체함으로써 변환 및 역변환의 성능 저하없이 연산의 복잡도를 감소시킨다.
한편, 전술한 바와 같이 곱셈 연산을 쉬프트 연산으로 대체하는 과정은 변환 및 역변환에 이용되는 값의 분모(denominator)를 고려하여 추가적인 연산을 줄일 수 있다. 예를 들어, 3/4*x와 같은 값을 연산할 때, 3/4*x은 ((x<<1)+x)>>2와 같은 연산으로 대체될 수 있으므로, 2번의 쉬프트 연산과 1번의 덧셈 연산을 요구한다. 이러한 연산은 약간의 오차를 고려하여 다음의 수학식; (x-(x>>2))과 같이 대체될 수 있다. 이와 같이 대체된 경우에는 1번의 뺄셈 연산과 1번의 쉬프트 연산만을 이용하므로, 1번의 쉬프트 연산이 줄어들게 된다. 따라서, 본 발명에서는 도 102a 내지 102c에 도시된 곱셈의 대체 연산 과정을 도 103a 내지 도 103c에 도시된 바와 같이 연산에 이용되는 분모값을 고려하여 추가적으로 대체할 수 있다.
도 103a 내지 도 103c에 도시된 곱셈의 대체 연산 과정을 이용하여, 전술한 본 발명의 또 다른 실시예에 따른 변환 및 역변환 과정은 다음과 같은 연산 과정을 통해 수행될 수 있다.
N이 16인 경우, 즉 16x16 입력 블록에 대하여 치환된 삼각 함수값을 이용한 수학식 1의 1차원 이산 코사인 변환을 수행하는 단계는, X0 내지 X15은 변환되어야 할 입력값, B0 내지 B15, C0 내지 C15, D0 내지 D15, E0 내지 E15, F0 내지 F15, G0 내지 G15은 중간값, Y0 내지 Y15은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
B0 = x0 + x15; B15 = x0 - x15; B1 = x1 + x14; B14 = x1 - x14; B2 = x2 + x13; B13 = x2 - x13; B3 = x3 + x12; B12 = x3 - x12; B4 = x4 + x11; B11 = x4 - x11; B5 = x5 + x10; B10 = x5 - x10; B6 = x6 + x9; B9 = x6 - x9; B7 = x7 + x8; B8 = x7 - x8;
C0 = B0 + B7; C7 = B0 - B7; C1 = B1 + B6; C6 = B1 - B6; C2 = B2 + B5; C5 = B2 - B5; C3 = B3 + B4; C4 = B3 - B4; itmp = ( B13 - B10 ); C10 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6) ; itmp = ( B13 + B10 ); C13 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); itmp = ( B12 - B11 ); C11 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); itmp = ( B12 + B11 ); C12 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6);
D0 = C0 + C3; D3 = C0 - C3; D8 = B8 + C11; D11 = B8 - C11; D12 = B15 - C12; D15 = B15 + C12; D1 = C1 + C2; D2 = C1 - C2; D9 = B9 + C10; D10 = B9 - C10; D13 = B14 - C13; D14 = B14 + C13; itmp = ( C6 - C5 ); D5 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); itmp = ( C6 + C5 ); D6 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); itmp = ( D0 + D1 ); y0 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); itmp = ( D0 - D1 ); y8 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); y4 = D3 - (D3 >> 4) - (D3 >> 6) + (D2 >> 1) - (D2 >> 3) ; y12 = (D3 >> 1) - (D3 >> 3) - (D2 - (D2 >> 4) - (D2 >> 6));
E4 = C4 + D5; E5 = C4 - D5; E6 = C7 - D6; E7 = C7 + D6; E9 = (D14 >> 1) - (D14 >> 3) - (D9 - (D9 >> 4) - (D9 >> 6)); E10 = -(D13 - (D13 >> 4) - (D13 >> 6)) - ((D10 >> 1) - (D10 >> 3)); E13 = (D13 >> 1) - (D13 >> 3) - (D10 - (D10 >> 4) - (D10 >> 6)); E14 = D14 - (D14 >> 4) - (D14 >> 6) + (D9 >> 1) - (D9 >> 3) ;
y2 = (E4 >> 2) - (E4 >> 4) + (E7 - (E7 >> 5)); itmp = -E5 + E6; y10 = (E5 - (E5 >> 3)) + (E6 >> 1) + (itmp >> 5) + (itmp >> 6); itmp = E5 + E6; y6 = (E6 - (E6 >> 3)) - (E5 >> 1) - (itmp >> 5) - (itmp >> 6); y14 = (E7 >> 2) - (E7 >> 4) - (E4 - (E4 >> 5));
F8 = D8 + E9; F9 = D8 - E9; F10 = D11 - E10; F11 = D11 + E10; F12 = D12 + E13; F13 = D12 - E13; F14 = D15 - E14; F15 = D15 + E14;
y1 = ((F8 >> 4) + (F8 >> 5)) + (F15 - (F15 >> 6)); y9 = (F9 - (F9 >> 2) + (F9 >> 6)) + ((F14 >> 1) + (F14 >> 3)); y5 = ((F10 >> 1) - (F10 >> 5)) + (F13 - (F13 >> 3)); itmp = -F11 + F12; y13 = (F11 - (F11 >> 6)) + (F12 >> 2) + (itmp >> 5); itmp = F11 + F12; y3 = (F12 - (F12 >> 6)) - (F11 >> 2) - (itmp >> 5); y11 = ((F13 >> 1) - (F13 >> 5)) - (F10 - (F10 >> 3)); y7 = (F14 - (F14 >> 2) + (F14 >> 6)) - ((F9 >> 1) + (F9 >> 3));
이에 대응되는 16 포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y15은 역변환되어야 할 입력값, B0 내지 B15, C0 내지 C15, D0 내지 D15, E0 내지 E15, F0 내지 F15, G0 내지 G15은 중간값, X0 내지 X15는 역변환된 값을 나타낸다.
F8 = ((y1 >> 4) + (y1 >> 5)) - (y15 - (y15 >> 6)); F9 = (y9 - (y9 >> 2) + (y9 >> 6)) - ((y7 >> 1) + (y7 >> 3)); F10 = ((y5 >> 1) - (y5 >> 5)) - (y11 - (y11 >> 3)); itmp = y13 + y3; F11 = (y13 - (y13 >> 6)) - (y3 >> 2) - (itmp >> 5); itmp = y13 - y3; F12 = (y3 - (y3 >> 6)) + (y13 >> 2) + (itmp >> 5); F13 = ((y11 >> 1) - (y11 >> 5)) + (y5 - (y5 >> 3)); F14 = (y7 - (y7 >> 2) + (y7 >> 6)) + ((y9 >> 1) + (y9 >> 3)); F15 =((y15 >> 4) + (y15 >> 5)) + (y1 - (y1 >> 6));
E4 = (y2 >> 2) - (y2 >> 4) - (y14 - (y14 >> 5)); itmp = y10 + y6; E5 = (y10 - (y10 >> 3)) - (y6 >> 1) - (itmp >> 5) - (itmp >> 6); itmp = y10 - y6; E6 = (y6 - (y6 >> 3) ) + (y10 >> 1) + (itmp >> 5) + (itmp >> 6); E7 = (y14 >> 2) - (y14 >> 4) + (y2 - (y2 >> 5)); E8 = F8 + F9; E9 = F8 - F9; E10 = F11 - F10; E11 = F11 + F10; E12 = F12 + F13; E13 = F12 - F13; E14 = F15 - F14; E15 = F15 + F14;
itmp = ( y0 + y8 ); D0 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); itmp = ( y0 - y8 ); D1 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); D2 =(y4 >> 1) - (y4 >> 3) - (y12 - (y12 >> 4) - (y12 >> 6)); D3 = y4 - (y4 >> 4) - (y4 >> 6) + (y12 >> 1) - (y12 >> 3) ; D4 = E4 + E5; D5 = E4 - E5; D6 = E7 - E6; D7 = E7 + E6; D9 = (E14 >> 1) - (E14 >> 3) - (E9 - (E9 >> 4) - (E9 >> 6)); D10 = -(E13 - (E13 >> 4) - (E13 >> 6)) - ((E10 >> 1) - (E10 >> 3)); D13 = (E13 >> 1) - (E13 >> 3) - (E10 - (E10 >> 4) - (E10 >> 6)); D14 = E14 - (E14 >> 4) - (E14 >> 6) + (E9 >> 1) - (E9 >> 3) ;
C0 = D0 + D3; C3 = D0 - D3; C8 = E8 + E11; C11 = E8 - E11; C12 = E15 - E12; C15 = E15 + E12; C1 = D1 + D2; C2 = D1 - D2; C9 = D9 + D10; C10 = D9 - D10; C13 = D14 - D13; C14 = D14 + D13; itmp = ( D6 - D5 ); C5 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); itmp = ( D6 + D5 ); C6 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6);
B0 = C0 + D7; B7 = C0 - D7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + D4; B4 = C3 - D4; itmp = ( C13 - C10 ); B10 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); itmp = ( C13 + C10 ); B13 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); itmp = ( C12 - C11 ); B11 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6); itmp = ( C12 + C11 ); B12 = itmp - (itmp >> 2) - (itmp >> 5) - (itmp >> 6);
x0 = B0 + C15; x15 = B0 - C15; x1 = B1 + C14; x14 = B1 - C14; x2 = B2 + B13; x13 = B2 - B13; x3 = B3 + B12; x12 = B3 - B12; x4 = B4 + B11; x11 = B4 - B11; x5 = B5 + B10; x10 = B5 - B10; x6 = B6 + C9; x9 = B6 - C9; x7 = B7 + C8; x8 = B7 - C8;
도 103a 내지 도 103c에 도시된 곱셈의 대체 연산 과정을 이용하여, N이 32인 경우, 즉 32x32 입력 블록에 대하여 치환된 삼각 함수값을 이용한 수학식 2의 1차원 이산 코사인 변환을 수행하는 단계는, X0 내지 X31은 변환되어야 할 입력값, A0 내지 G31은 중간값, Y0 내지 Y31은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
A0 = x0 + x31; A31 = x0 - x31; A1 = x1 + x30; A30 = x1 - x30; A2 = x2 + x29; A29 = x2 - x29; A3 = x3 + x28; A28 = x3 - x28; A4 = x4 + x27; A27 = x4 - x27; A5 = x5 + x26; A26 = x5 - x26; A6 = x6 + x25; A25 = x6 - x25; A7 = x7 + x24; A24 = x7 - x24; A8 = x8 + x23; A23 = x8 - x23; A9 = x9 + x22; A22 = x9 - x22; A10 = x10 + x21; A21 = x10 - x21; A11 = x11 + x20; A20 = x11 - x20; A12 = x12 + x19; A19 = x12 - x19; A13 = x13 + x18; A18 = x13 - x18; A14 = x14 + x17; A17 = x14 - x17; A15 = x15 + x16; A16 = x15 - x16;
B0 = A0 + A15; B15 = A0 - A15; B1 = A1 + A14; B14 = A1 - A14; B2 = A2 + A13; B13 = A2 - A13; B3 = A3 + A12; B12 = A3 - A12; B4 = A4 + A11; B11 = A4 - A11; B5 = A5 + A10; B10 = A5 - A10; B6 = A6 + A9; B9 = A6 - A9; B7 = A7 + A8; B8 = A7 - A8; itmp = ( A27 - A20 ); B20 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( A27 + A20 ); B27 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( A26 - A21 ); B21 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( A26 + A21 ); B26 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( A25 - A22 ); B22 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( A25 + A22 ); B25 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( A24 - A23 ); B23 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( A24 + A23 ); B24 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8);
C0 = B0 + B7; C7 = B0 - B7; C1 = B1 + B6; C6 = B1 - B6; C2 = B2 + B5; C5 = B2 - B5; C3 = B3 + B4; C4 = B3 - B4; itmp = ( B13 - B10 ); C10 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( B13 + B10 ); C13 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( B12 - B11 ); C11 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( B12 + B11 ); C12 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); C16 = A16 + B23; C23 = A16 - B23; C24 = A31 - B24; C31 = A31 + B24; C17 = A17 + B22; C22 = A17 - B22; C25 = A30 - B25; C30 = A30 + B25; C18 = A18 + B21; C21 = A18 - B21; C26 = A29 - B26; C29 = A29 + B26; C19 = A19 + B20; C20 = A19 - B20; C27 = A28 - B27; C28 = A28 + B27;
D0 = C0 + C3; D3 = C0 - C3; D8 = B8 + C11; D11 = B8 - C11; D12 = B15 - C12; D15 = B15 + C12; D1 = C1 + C2; D2 = C1 - C2; D9 = B9 + C10; D10 = B9 - C10; D13 = B14 - C13; D14 = B14 + C13; itmp = ( C6 - C5 ); D5 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( C6 + C5 ); D6 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); D18 = (C29 >> 2) + (C29 >> 3) + (C29 >> 8) - (C18 - (C18 >> 4) - (C18 >> 6)); D20 = - (C27 - (C27 >> 4) - (C27 >> 6)) - ((C20 >> 2) + (C20 >> 3) + (C20 >> 8)); D26 = - (C21 - (C21 >> 4) - (C21 >> 6)) + ((C26 >> 2) + (C26 >> 3) + (C26 >> 8)); D28 = (C19 >> 2) + (C19 >> 3) + (C19 >> 8) + (C28 - (C28 >> 4) - (C28 >> 6)); D19 = (C28 >> 2) + (C28 >> 3) + (C28 >> 8) - (C19 - (C19 >> 4) - (C19 >> 6)); D21 = - (C26 - (C26 >> 4) - (C26 >> 6)) - ((C21 >> 2) + (C21 >> 3) + (C21 >> 8)); D27 = - (C20 - (C20 >> 4) - (C20 >> 6)) + ((C27 >> 2) + (C27 >> 3) + (C27 >> 8)); D29 = (C18 >> 2) + (C18 >> 3) + (C18 >> 8) + (C29 - (C29 >> 4) - (C29 >> 6));
itmp = ( D0 + D1 ); y0 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); itmp = ( D0 - D1 ); y16 = (itmp >> 1) + (itmp >> 3) + (itmp >> 4) + (itmp >> 6) + (itmp >> 8); y8 = (D3 - (D3 >> 4) - (D3 >> 6)) + ((D2 >> 2) + (D2 >> 3) + (D2 >> 8)); y24 = (D3 >> 2) + (D3 >> 3) + (D3 >> 8) - (D2 - (D2 >> 4) - (D2 >> 6));
E4 = C4 + D5; E5 = C4 - D5; E6 = C7 - D6; E7 = C7 + D6; E9 = (D14 >> 2) + (D14 >> 3) + (D14 >> 8) - (D9 - (D9 >> 4) - (D9 >> 6)); E10 = -(D13 - (D13 >> 4) - (D13 >> 6)) - ((D10 >> 2) + (D10 >> 3) + (D10 >> 8)); E13 = (D13 >> 2) + (D13 >> 3) + (D13 >> 8) - (D10 - (D10 >> 4) - (D10 >> 6)); E14 = (D14 - (D14 >> 4) - (D14 >> 6)) + ((D9 >> 2) + (D9 >> 3) + (D9 >> 8)); E16 = C16 + D19; E19 = C16 - D19; E20 = C23 - D20; E23 = C23 + D20; E24 = C24 + D27; E27 = C24 - D27; E28 = C31 - D28; E31 = C31 + D28; E17 = C17 + D18; E18 = C17 - D18; E21 = C22 - D21; E22 = C22 + D21; E25 = C25 + D26; E26 = C25 - D26; E29 = C30 - D29; E30 = C30 + D29; y4 = ((E4 >> 3) + (E4 >> 4) + (E4 >> 8)) + (E7 - (E7 >> 6) - (E7 >> 8)); itmp = E5 + E6; y20 = ((E5 >> 1) + (E5 >> 2) + (E5 >> 4) ) + (itmp >> 6) + ((E6 >> 1) + (E6 >> 5) + (E6 >> 7)); itmp = E6 -E5; y12 = ((E6 >> 1) + (E6 >> 2) + (E6 >> 4) ) + (itmp >> 6) - ((E5 >> 1) + (E5 >> 5) + (E5 >> 7)); y28 = ((E7 >> 3) + (E7 >> 4) + (E7 >> 8)) - (E4 - (E4 >> 6) - (E4 >> 8));
F8 = D8 + E9; F9 = D8 - E9; F10 = D11 - E10; F11 = D11 + E10; F12 = D12 + E13; F13 = D12 - E13; F14 = D15 - E14; F15 = D15 + E14; itmp = E30 + E17; F17 = (itmp >> 4) + ((E30 >> 3) + (E30 >> 8)) - (E17 - (E17 >> 6) ); itmp = E29 -E18; F18 = - (E29 - (E29 >> 6) ) - ((E18 >> 3) + (E18 >> 4)) + (itmp >> 8) ; itmp = E26 - E21; F21 = (itmp >> 1) + (itmp >> 6) + ( (E26 >> 2) + (E26 >> 4) ) - ( (E21 >> 5) + (E21 >> 7)); itmp = E25 + E22; F22 = - (itmp >> 1) - (itmp >> 6) - ((E25 >> 5) + (E25 >> 7)) - ( (E22 >> 2) + (E22 >> 4) ); itmp = E25 -E22; F25 = (itmp >> 1) + (itmp >> 6) + ((E25 >> 2) + (E25 >> 4)) - ((E22 >> 5) + (E22 >> 7)); itmp = E26 + E21; F26 = (itmp >> 1) + (itmp >> 6) + ( (E26 >> 5) + (E26 >> 7)) + ( (E21 >> 2) + (E21 >> 4) ); itmp = E29 + E18; F29 = (itmp >> 8) + ((E29 >> 3) + (E29 >> 4) ) - (E18 - (E18 >> 6)); itmp = -E30 + E17; F30 = (itmp >> 8) + (E30 - (E30 >> 6) ) + ((E17 >> 3) + (E17 >> 4) );
y2 = ((F8 >> 4) + (F8 >> 5) + (F8 >> 8)) + (F15 - (F15 >> 7)); itmp = F9 + F14; y18 = (itmp >> 1) + ( (F9 >> 2) + (F9 >> 6) + (F9 >> 8)) + ( (F14 >> 3) + (F14 >> 7)); itmp = F10 + F13; y10 = (itmp>> 1) - (F10 >> 5)) + ( (F13 >> 2) + (F13 >> 3) + (F13 >> 8)); itmp = -F11 + F12; y26 = (itmp >> 5) + (F11 - (F11 >> 6)) + ((F12 >> 2) + (F12 >> 7)); itmp = -F12 - F11; y6 = (itmp >> 5) + (F12 - (F12 >> 6)) - ((F11 >> 2) + (F11 >> 7)); itmp = F13 -F10; y22 = (itmp >> 1) -( (F13 >> 5)) - ( (F10 >> 2) + (F10 >> 3) + (F10 >> 8)); itmp = F14 -F9; y14 = (itmp >> 1) + ( (F14 >> 2) + (F14 >> 6) + (F14 >> 8)) - ( (F9 >> 3) + (F9 >> 7)); y30 = ((F15 >> 4) + (F15 >> 5) + (F15 >> 8)) - (F8 - (F8 >> 7));
G16 = E16 + F17; G17 = E16 - F17; G18 = E19 - F18; G19 = E19 + F18; G20 = E20 + F21; G21 = E20 - F21; G22 = E23 - F22; G23 = E23 + F22; G24 = E24 + F25; G25 = E24 - F25; G26 = E27 - F26; G27 = E27 + F26; G28 = E28 + F29; G29 = E28 - F29; G30 = E31 - F30; G31 = E31 + F30;
y1 = ((G16 >> 5) + (G16 >> 6)) + (G31 - (G31 >> 8)); itmp = -G17 + G30; y17 = (itmp >> 7) +(itmp >> 8) +(G17 - (G17 >> 2) ) + ((G30 >> 1) + (G30 >> 3) + (G30 >> 5) ); itmp = -G18 -G29; y9 = (itmp >> 4) + (itmp >> 8) + ((G18 >> 1) - (G18 >> 7) ) + (G29 - (G29 >> 5)); itmp = -G19 + G28; y25 = (itmp >> 6) + (itmp>> 7) +(G19 - (G19 >> 5) - (G19 >> 8)) + ((G28 >> 2) + (G28 >> 4) ); y5 = ((G20 >> 2) - (G20 >> 7)) + (G27 - (G27 >> 5)); itmp = -G21 + G26; y21 = (itmp >> 8) +(G21 - (G21 >> 3) - (G21 >> 6) ) + ((G26 >> 1) + (G26 >> 7) ); itmp = G22-G25; y13 = (itmp >> 4) + ((G22 >> 1) + (G22 >> 5)) + (G25 - (G25 >> 3) - (G25 >> 7)- (G25 >> 8)); itmp = -G23 + G24; y29 = (itmp >> 8) + (G23 - (G23 >> 7) ) + ((G24 >> 3) + (G24 >> 6)); itmp = -G23 -G24; y3 = (itmp >> 8) + (G24 - (G24 >> 7) ) - ((G23 >> 3) + (G23 >> 6) ); itmp = G25 + G22; y19 = (itmp >> 4) + ((G25 >> 1) + (G25 >> 5)) - (G22 - (G22 >> 3) - (G22 >> 7) - (G22 >> 8)); itmp = -G26- G21; y11 = (itmp >> 8) +(G26 - (G26 >> 3) - (G26 >> 6)) - ((G21 >> 1) + (G21 >> 7) ); y27 = ((G27 >> 2) - (G27 >> 7)) - (G20 - (G20 >> 5)); itmp = -G28 -G19; y7 = (itmp >> 6) + (itmp >> 7)+ (G28 - (G28 >> 5) - (G28 >> 8)) - ((G19 >> 2) + (G19 >> 4)); itmp = -G29 + G18; y23 = (itmp >> 4) +(itmp >> 8) +((G29 >> 1) - (G29 >> 7) ) - (G18 - (G18 >> 5) ); itmp = -G30 -G17; y15 = (itmp >> 7) + (itmp >> 8) + (G30 - (G30 >> 2)) - ((G17 >> 1) + (G17 >> 3) + (G17 >> 5)); y31 = ((G31 >> 5) + (G31 >> 6)) - (G16 - (G16 >> 8))
이에 대응되는 32 포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y31은 역변환되어야 할 입력값, A0 내지 G31은 중간값, X0 내지 X31은 역변환된 값을 나타낸다.
G16 = ((y1 >> 5) + (y1 >> 6)) - (y31 - (y31 >> 8)); G17 = (y17 - (y17 >> 2) - (y17 >> 7) - (y17 >> 8)) - ((y15 >> 1) + (y15 >> 3) + (y15 >> 5) + (y15 >> 7) + (y15 >> 8)); G18 = ((y9 >> 1) - (y9 >> 4) - (y9 >> 7) - (y9 >> 8)) - (y23 - (y23 >> 4) - (y23 >> 5) - (y23 >> 8)); G19 = (y25 - (y25 >> 5) - (y25 >> 6) - (y25 >> 7) - (y25 >> 8)) - ((y7 >> 2) + (y7 >> 4) + (y7 >> 6) + (y7 >> 7)); G20 = ((y5 >> 2) - (y5 >> 7)) - (y27 - (y27 >> 5)); G21 = (y21 - (y21 >> 3) - (y21 >> 6) - (y21 >> 8)) - ((y11 >> 1) + (y11 >> 7) + (y11 >> 8)); G22 = ((y13 >> 1) + (y13 >> 4) + (y13 >> 5)) - (y19 - (y19 >> 3) - (y19 >> 4) - (y19 >> 7) - (y19 >> 8)); G23 = (y29 - (y29 >> 7) - (y29 >> 8)) - ((y3 >> 3) + (y3 >> 6) + (y3 >> 8)); G24 = (y3 - (y3 >> 7) - (y3 >> 8)) + ((y29 >> 3) + (y29 >> 6) + (y29 >> 8)); G25 = ((y19 >> 1) + (y19 >> 4) + (y19 >> 5)) + (y13 - (y13 >> 3) - (y13 >> 4) - (y13 >> 7) - (y13 >> 8)); G26 = (y11 - (y11 >> 3) - (y11 >> 6) - (y11 >> 8)) + ((y21 >> 1) + (y21 >> 7) + (y21 >> 8)); G27 = ((y27 >> 2) - (y27 >> 7)) + (y5 - (y5 >> 5)); G28 = (y7 - (y7 >> 5) - (y7 >> 6) - (y7 >> 7) - (y7 >> 8)) + ((y25 >> 2) + (y25 >> 4) + (y25 >> 6) + (y25 >> 7)); G29 = ((y23 >> 1) - (y23 >> 4) - (y23 >> 7) - (y23 >> 8)) + (y9 - (y9 >> 4) - (y9 >> 5) - (y9 >> 8)); G30 = (y15 - (y15 >> 2) - (y15 >> 7) - (y15 >> 8)) + ((y17 >> 1) + (y17 >> 3) + (y17 >> 5) + (y17 >> 7) + (y17 >> 8)); G31 = ((y31 >> 5) + (y31 >> 6)) + (y1 - (y1 >> 8));
F8 = ((y2 >> 4) + (y2 >> 5) + (y2 >> 8)) - (y30 - (y30 >> 7)); F9 = ((y18 >> 1) + (y18 >> 2) + (y18 >> 6) + (y18 >> 8)) - ((y14 >> 1) + (y14 >> 3) + (y14 >> 7)); F10 = ((y10 >> 1) - (y10 >> 5)) - ((y22 >> 1) + (y22 >> 2) + (y22 >> 3) + (y22 >> 8)); F11 = (y26 - (y26 >> 5) - (y26 >> 6)) - ((y6 >> 2) + (y6 >> 5) + (y6 >> 7)); F12 = (y6 - (y6 >> 5) - (y6 >> 6)) + ((y26 >> 2) + (y26 >> 5) + (y26 >> 7)); F13 = ((y22 >> 1) - (y22 >> 5)) + ((y10 >> 1) + (y10 >> 2) + (y10 >> 3) + (y10 >> 8)); F14 = ((y14 >> 1) + (y14 >> 2) + (y14 >> 6) + (y14 >> 8)) + ((y18 >> 1) + (y18 >> 3) + (y18 >> 7)); F15 = ((y30 >> 4) + (y30 >> 5) + (y30 >> 8)) + (y2 - (y2 >> 7)); F16 = G16 + G17; F17 = G16 - G17; F18 = G19 - G18; F19 = G19 + G18; F20 = G20 + G21; F21 = G20 - G21; F22 = G23 - G22; F23 = G23 + G22; F24 = G24 + G25; F25 = G24 - G25; F26 = G27 - G26; F27 = G27 + G26; F28 = G28 + G29; F29 = G28 - G29; F30 = G31 - G30; F31 = G31 + G30;
E4 = ((y4 >> 3) + (y4 >> 4) + (y4 >> 8)) - (y28 - (y28 >> 6) - (y28 >> 8)); E5 = ((y20 >> 1) + (y20 >> 2) + (y20 >> 4) + (y20 >> 6)) - ((y12 >> 1) + (y12 >> 5) + (y12 >> 6) + (y12 >> 7)); E6 = ((y12 >> 1) + (y12 >> 2) + (y12 >> 4) + (y12 >> 6)) + ((y20 >> 1) + (y20 >> 5) + (y20 >> 6) + (y20 >> 7)); E7 = ((y28 >> 3) + (y28 >> 4) + (y28 >> 8)) + (y4 - (y4 >> 6) - (y4 >> 8)); E8 = F8 + F9; E9 = F8 - F9; E10 = F11 - F10; E11 = F11 + F10; E12 = F12 + F13; E13 = F12 - F13; E14 = F15 - F14; E15 = F15 + F14; E17 = ((F30 >> 3) + (F30 >> 4) + (F30 >> 8)) - (F17 - (F17 >> 6) - (F17 >> 8)); E18 = - (F29 - (F29 >> 6) - (F29 >> 8)) - ((F18 >> 3) + (F18 >> 4) + (F18 >> 8)); E21 = ((F26 >> 1) + (F26 >> 2) + (F26 >> 4) + (F26 >> 6)) - ((F21 >> 1) + (F21 >> 5) + (F21 >> 6) + (F21 >> 7)); E22 = - ((F25 >> 1) + (F25 >> 5) + (F25 >> 6) + (F25 >> 7)) - ((F22 >> 1) + (F22 >> 2) + (F22 >> 4) + (F22 >> 6)); E25 = ((F25 >> 1) + (F25 >> 2) + (F25 >> 4) + (F25 >> 6)) - ((F22 >> 1) + (F22 >> 5) + (F22 >> 6) + (F22 >> 7)); E26 = ((F26 >> 1) + (F26 >> 5) + (F26 >> 6) + (F26 >> 7)) + ((F21 >> 1) + (F21 >> 2) + (F21 >> 4) + (F21 >> 6)); E29 = ((F29 >> 3) + (F29 >> 4) + (F29 >> 8)) - (F18 - (F18 >> 6) - (F18 >> 8)); E30 = (F30 - (F30 >> 6) - (F30 >> 8)) + ((F17 >> 3) + (F17 >> 4) + (F17 >> 8));
iTmp = ( y0 + y16 ); D0 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( y0 - y16 ); D1 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); D2 = (y8 >> 2) + (y8 >> 3) + (y8 >> 8) - (y24 - (y24 >> 4) - (y24 >> 6)); D3 = (y8 - (y8 >> 4) - (y8 >> 6)) + ((y24 >> 2) + (y24 >> 3) + (y24 >> 8)); D4 = E4 + E5; D5 = E4 - E5; D6 = E7 - E6; D7 = E7 + E6; D9 = (E14 >> 2) + (E14 >> 3) + (E14 >> 8) - (E9 - (E9 >> 4) - (E9 >> 6)); D10 = -(E13 - (E13 >> 4) - (E13 >> 6)) - ((E10 >> 2) + (E10 >> 3) + (E10 >> 8)); D13 = (E13 >> 2) + (E13 >> 3) + (E13 >> 8) - (E10 - (E10 >> 4) - (E10 >> 6)); D14 = (E14 - (E14 >> 4) - (E14 >> 6)) + ((E9 >> 2) + (E9 >> 3) + (E9 >> 8)); D16 = F16 + F19; D19 = F16 - F19; D20 = F23 - F20; D23 = F23 + F20; D24 = F24 + F27; D27 = F24 - F27; D28 = F31 - F28; D31 = F31 + F28; D17 = E17 + E18; D18 = E17 - E18; D21 = E22 - E21; D22 = E22 + E21; D25 = E25 + E26; D26 = E25 - E26; D29 = E30 - E29; D30 = E30 + E29;
C0 = D0 + D3; C3 = D0 - D3; C8 = E8 + E11; C11 = E8 - E11; C12 = E15 - E12; C15 = E15 + E12; C1 = D1 + D2; C2 = D1 - D2; C9 = D9 + D10; C10 = D9 - D10; C13 = D14 - D13; C14 = D14 + D13; iTmp = ( D6 - D5 ); C5 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( D6 + D5 ); C6 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); C18 = (D29 >> 2) + (D29 >> 3) + (D29 >> 8) - (D18 - (D18 >> 4) - (D18 >> 6)); C20 = - (D27 - (D27 >> 4) - (D27 >> 6)) - ((D20 >> 2) + (D20 >> 3) + (D20 >> 8)); C26 = - (D21 - (D21 >> 4) - (D21 >> 6)) + ((D26 >> 2) + (D26 >> 3) + (D26 >> 8)); C28 = (D19 >> 2) + (D19 >> 3) + (D19 >> 8) + (D28 - (D28 >> 4) - (D28 >> 6)); C19 = (D28 >> 2) + (D28 >> 3) + (D28 >> 8) - (D19 - (D19 >> 4) - (D19 >> 6)); C21 = - (D26 - (D26 >> 4) - (D26 >> 6)) - ((D21 >> 2) + (D21 >> 3) + (D21 >> 8)); C27 = - (D20 - (D20 >> 4) - (D20 >> 6)) + ((D27 >> 2) + (D27 >> 3) + (D27 >> 8)); C29 = (D18 >> 2) + (D18 >> 3) + (D18 >> 8) + (D29 - (D29 >> 4) - (D29 >> 6));
B0 = C0 + D7; B7 = C0 - D7; B1 = C1 + C6; B6 = C1 - C6; B2 = C2 + C5; B5 = C2 - C5; B3 = C3 + D4; B4 = C3 - D4; iTmp = ( C13 - C10 ); B10 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( C13 + C10 ); B13 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( C12 - C11 ); B11 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( C12 + C11 ); B12 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); B16 = D16 + D23; B23 = D16 - D23; B24 = D31 - D24; B31 = D31 + D24; B17 = D17 + D22; B22 = D17 - D22; B25 = D30 - D25; B30 = D30 + D25; B18 = C18 + C21; B21 = C18 - C21; B26 = C29 - C26; B29 = C29 + C26; B19 = C19 + C20; B20 = C19 - C20; B27 = C28 - C27; B28 = C28 + C27;
A0 = B0 + C15; A15 = B0 - C15; A1 = B1 + C14; A14 = B1 - C14; A2 = B2 + B13; A13 = B2 - B13; A3 = B3 + B12; A12 = B3 - B12; A4 = B4 + B11; A11 = B4 - B11; A5 = B5 + B10; A10 = B5 - B10; A6 = B6 + C9; A9 = B6 - C9; A7 = B7 + C8; A8 = B7 - C8; iTmp = ( B27 - B20 ); A20 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( B27 + B20 ); A27 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( B26 - B21 ); A21 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( B26 + B21 ); A26 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( B25 - B22 ); A22 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( B25 + B22 ); A25 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( B24 - B23 ); A23 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8); iTmp = ( B24 + B23 ); A24 = (iTmp >> 1) + (iTmp >> 3) + (iTmp >> 4) + (iTmp >> 6) + (iTmp >> 8);
x0 = A0 + B31; x31 = A0 - B31; x1 = A1 + B30; x30 = A1 - B30; x2 = A2 + B29; x29 = A2 - B29; x3 = A3 + B28; x28 = A3 - B28; x4 = A4 + A27; x27 = A4 - A27; x5 = A5 + A26; x26 = A5 - A26; x6 = A6 + A25; x25 = A6 - A25; x7 = A7 + A24; x24 = A7 - A24; x8 = A8 + A23; x23 = A8 - A23; x9 = A9 + A22; x22 = A9 - A22; x10 = A10 + A21; x21 = A10 - A21; x11 = A11 + A20; x20 = A11 - A20; x12 = A12 + B19; x19 = A12 - B19; x13 = A13 + B18; x18 = A13 - B18; x14 = A14 + B17; x17 = A14 - B17; x15 = A15 + B16; x16 = A15 - B16;
도 103a 내지 도 103c에 도시된 곱셈의 대체 연산 과정을 이용하여, N이 64인 경우, 즉 64x64 입력 블록에 대하여 치환된 삼각 함수값을 이용한 1차원 이산 코사인 변환을 수행하는 단계는, X0 내지 X63은 변환되어야 할 입력값, A0 내지 O63은 중간값, Y0 내지 Y63은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
O0 = x0+x63; O63 = x0-x63; O1 = x1+x62; O62 = x1-x62; O2 = x2+x61; O61 = x2-x61; O3 = x3+x60; O60 = x3-x60; O4 = x4+x59; O59 = x4-x59; O5 = x5+x58; O58 = x5-x58; O6 = x6+x57; O57 = x6-x57; O7 = x7+x56; O56 = x7-x56; O8 = x8+x55; O55 = x8-x55; O9 = x9+x54; O54 = x9-x54; O10 = x10+x53; O53 = x10-x53; O11 = x11+x52; O52 = x11-x52; O12 = x12+x51; O51 = x12-x51; O13 = x13+x50; O50 = x13-x50; O14 = x14+x49; O49 = x14-x49; O15 = x15+x48; O48 = x15-x48; O16 = x16+x47; O47 = x16-x47; O17 = x17+x46; O46 = x17-x46; O18 = x18+x45; O45 = x18-x45; O19 = x19+x44; O44 = x19-x44; O20 = x20+x43; O43 = x20-x43; O21 = x21+x42; O42 = x21-x42; O22 = x22+x41; O41 = x22-x41; O23 = x23+x40; O40 = x23-x40; O24 = x24+x39; O39 = x24-x39; O25 = x25+x38; O38 = x25-x38; O26 = x26+x37; O37 = x26-x37; O27 = x27+x36; O36 = x27-x36; O28 = x28+x35; O35 = x28-x35; O29 = x29+x34; O34 = x29-x34; O30 = x30+x33; O33 = x30-x33; O31 = x31+x32; O32 = x31-x32;
A0 = O0+O31; A31 = O0-O31; A1 = O1+O30; A30 = O1-O30; A2 = O2+O29; A29 = O2-O29; A3 = O3+O28; A28 = O3-O28; A4 = O4+O27; A27 = O4-O27; A5 = O5+O26; A26 = O5-O26; A6 = O6+O25; A25 = O6-O25; A7 = O7+O24; A24 = O7-O24; A8 = O8+O23; A23 = O8-O23; A9 = O9+O22; A22 = O9-O22; A10 = O10+O21; A21 = O10-O21; A11 = O11+O20; A20 = O11-O20; A12 = O12+O19; A19 = O12-O19; A13 = O13+O18; A18 = O13-O18; A14 = O14+O17; A17 = O14-O17; A15 = O15+O16; A16 = O15-O16; iTmp = (O55-O40); A40 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O55+O40); A55 = iTmp- (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O54-O41); A41 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O54+O41); A54 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O53-O42); A42 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O53+O42); A53 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O52-O43); A43 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O52+O43); A52 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O51-O44); A44 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O51+O44); A51 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O50-O45); A45 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O50+O45); A50 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O49-O46); A46 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O49+O46); A49 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O48-O47); A47 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (O48+O47); A48 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8);
B0 = A0+A15; B15 = A0-A15; B1 = A1+A14; B14 = A1-A14; B2 = A2+A13; B13 = A2-A13; B3 = A3+A12; B12 = A3-A12; B4 = A4+A11; B11 = A4-A11; B5 = A5+A10; B10 = A5-A10; B6 = A6+A9; B9 = A6-A9; B7 = A7+A8; B8 = A7-A8; iTmp = (A27-A20); B20 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A27+A20); B27 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A26-A21); B21 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A26+A21); B26 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A25-A22); B22 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A25+A22); B25 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A24-A23); B23 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A24+A23); B24 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); B32 = O32+A47; B47 = O32-A47; B48 = O63-A48; B63 = O63+A48; B33 = O33+A46; B46 = O33-A46; B49 = O62-A49; B62 = O62+A49; B34 = O34+A45; B45 = O34-A45; B50 = O61-A50; B61 = O61+A50; B35 = O35+A44; B44 = O35-A44; B51 = O60-A51; B60 = O60+A51; B36 = O36+A43; B43 = O36-A43; B52 = O59-A52; B59 = O59+A52; B37 = O37+A42; B42 = O37-A42; B53 = O58-A53; B58 = O58+A53; B38 = O38+A41; B41 = O38-A41; B54 = O57-A54; B57 = O57+A54; B39 = O39+A40; B40 = O39-A40; B55 = O56-A55; B56 = O56+A55;
C0 = B0+B7; C7 = B0-B7; C1 = B1+B6; C6 = B1-B6; C2 = B2+B5; C5 = B2-B5; C3 = B3+B4; C4 = B3-B4; iTmp = (B13-B10); C10 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (B13+B10); C13 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (B12-B11); C11 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (B12+B11); C12 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); C16 = A16+B23; C23 = A16-B23; C24 = A31-B24; C31 = A31+B24; C17 = A17+B22; C22 = A17-B22; C25 = A30-B25; C30 = A30+B25; C18 = A18+B21; C21 = A18-B21; C26 = A29-B26; C29 = A29+B26; C19 = A19+B20; C20 = A19-B20; C27 = A28-B27; C28 = A28+B27; C36 = ((B59 >> 2) + (B59 >> 3) + (B59 >> 7)) - (B36 - (B36 >> 4) - (B36 >> 7) - (B36 >> 8) - (B36 >> 9)); C40 = - (B55 - (B55 >> 4) - (B55 >> 7) - (B55 >> 8) - (B55 >> 9)) - ((B40 >> 2) + (B40 >> 3) + (B40 >> 7)); C52 = - (B43 - (B43 >> 4) - (B43 >> 7) - (B43 >> 8) - (B43 >> 9)) + ((B52 >> 2) + (B52 >> 3) + (B52 >> 7)); C56 = ((B39 >> 2) + (B39 >> 3) + (B39 >> 7)) + (B56 - (B56 >> 4) - (B56 >> 7) - (B56 >> 8) - (B56 >> 9)); C37 = ((B58 >> 2) + (B58 >> 3) + (B58 >> 7)) - (B37 - (B37 >> 4) - (B37 >> 7) - (B37 >> 8) - (B37 >> 9)); C41 = - (B54 - (B54 >> 4) - (B54 >> 7) - (B54 >> 8) - (B54 >> 9)) - ((B41 >> 2) + (B41 >> 3) + (B41 >> 7)); C53 = - (B42 - (B42 >> 4) - (B42 >> 7) - (B42 >> 8) - (B42 >> 9)) + ((B53 >> 2) + (B53 >> 3) + (B53 >> 7)); C57 = ((B38 >> 2) + (B38 >> 3) + (B38 >> 7)) + (B57 - (B57 >> 4) - (B57 >> 7) - (B57 >> 8) - (B57 >> 9)); C38 = ((B57 >> 2) + (B57 >> 3) + (B57 >> 7)) - (B38 - (B38 >> 4) - (B38 >> 7) - (B38 >> 8) - (B38 >> 9)); C42 = - (B53 - (B53 >> 4) - (B53 >> 7) - (B53 >> 8) - (B53 >> 9)) - ((B42 >> 2) + (B42 >> 3) + (B42 >> 7)); C54 = - (B41 - (B41 >> 4) - (B41 >> 7) - (B41 >> 8) - (B41 >> 9)) + ((B54 >> 2) + (B54 >> 3) + (B54 >> 7)); C58 = ((B37 >> 2) + (B37 >> 3) + (B37 >> 7)) + (B58 - (B58 >> 4) - (B58 >> 7) - (B58 >> 8) - (B58 >> 9)); C39 = ((B56 >> 2) + (B56 >> 3) + (B56 >> 7)) - (B39 - (B39 >> 4) - (B39 >> 7) - (B39 >> 8) - (B39 >> 9)); C43 = - (B52 - (B52 >> 4) - (B52 >> 7) - (B52 >> 8) - (B52 >> 9)) - ((B43 >> 2) + (B43 >> 3) + (B43 >> 7)); C55 = - (B40 - (B40 >> 4) - (B40 >> 7) - (B40 >> 8) - (B40 >> 9)) + ((B55 >> 2) + (B55 >> 3) + (B55 >> 7)); C59 = ((B36 >> 2) + (B36 >> 3) + (B36 >> 7)) + (B59 - (B59 >> 4) - (B59 >> 7) - (B59 >> 8) - (B59 >> 9));
D0 = C0+C3; D3 = C0-C3; D8 = B8+C11; D11 = B8-C11; D12 = B15-C12; D15 = B15+C12; D1 = C1+C2; D2 = C1-C2; D9 = B9+C10; D10 = B9-C10; D13 = B14-C13; D14 = B14+C13; iTmp = (C6-C5); D5 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (C6+C5); D6 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); D18 = ((C29 >> 2) + (C29 >> 3) + (C29 >> 7)) - (C18 - (C18 >> 4) - (C18 >> 7) - (C18 >> 8) - (C18 >> 9)); D20 = - (C27 - (C27 >> 4) - (C27 >> 7) - (C27 >> 8) - (C27 >> 9)) - ((C20 >> 2) + (C20 >> 3) + (C20 >> 7)); D26 = - (C21 - (C21 >> 4) - (C21 >> 7) - (C21 >> 8) - (C21 >> 9)) + ((C26 >> 2) + (C26 >> 3) + (C26 >> 7)); D28 = ((C19 >> 2) + (C19 >> 3) + (C19 >> 7)) + (C28 - (C28 >> 4) - (C28 >> 7) - (C28 >> 8) - (C28 >> 9)); D19 = ((C28 >> 2) + (C28 >> 3) + (C28 >> 7)) - (C19 - (C19 >> 4) - (C19 >> 7) - (C19 >> 8) - (C19 >> 9)); D21 = -(C26 - (C26 >> 4) - (C26 >> 7) - (C26 >> 8) - (C26 >> 9)) - ((C21 >> 2) + (C21 >> 3) + (C21 >> 7)); D27 = - (C20 - (C20 >> 4) - (C20 >> 7) - (C20 >> 8) - (C20 >> 9)) + ((C27 >> 2) + (C27 >> 3) + (C27 >> 7)); D29 = ((C18 >> 2) + (C18 >> 3) + (C18 >> 7)) + (C29 - (C29 >> 4) - (C29 >> 7) - (C29 >> 8) - (C29 >> 9)); D32 = B32+C39; D39 = B32-C39; D40 = B47-C40; D47 = B47+C40; D48 = B48+C55; D55 = B48-C55; D56 = B63-C56; D63 = B63+C56; D33 = B33+C38; D38 = B33-C38; D41 = B46-C41; D46 = B46+C41; D49 = B49+C54; D54 = B49-C54; D57 = B62-C57; D62 = B62+C57; D34 = B34+C37; D37 = B34-C37; D42 = B45-C42; D45 = B45+C42; D50 = B50+C53; D53 = B50-C53; D58 = B61-C58; D61 = B61+C58; D35 = B35+C36; D36 = B35-C36; D43 = B44-C43; D44 = B44+C43; D51 = B51+C52; D52 = B51-C52; D59 = B60-C59; D60 = B60+C59; iTmp = (D0+D1);
y0 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (D0-D1); y32 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); y16 = (D3 - (D3 >> 4) - (D3 >> 7) - (D3 >> 8) - (D3 >> 9)) + ((D2 >> 2) + (D2 >> 3) + (D2 >> 7)); y48 = ((D3 >> 2) + (D3 >> 3) + (D3 >> 7)) - (D2 - (D2 >> 4) - (D2 >> 7) - (D2 >> 8) - (D2 >> 9));
E4 = C4+D5; E5 = C4-D5; E6 = C7-D6; E7 = C7+D6; E9 = ((D14 >> 2) + (D14 >> 3) + (D14 >> 7)) - (D9 - (D9 >> 4) - (D9 >> 7) - (D9 >> 8) - (D9 >> 9)); E10 = - (D13 - (D13 >> 4) - (D13 >> 7) - (D13 >> 8) - (D13 >> 9)) - ((D10 >> 2) + (D10 >> 3) + (D10 >> 7)); E13 = ((D13 >> 2) + (D13 >> 3) + (D13 >> 7)) - (D10 - (D10 >> 4) - (D10 >> 7) - (D10 >> 8) - (D10 >> 9)); E14 = (D14 - (D14 >> 4) - (D14 >> 7) - (D14 >> 8) - (D14 >> 9)) + ((D9 >> 2) + (D9 >> 3) + (D9 >> 7)); E16 = C16+D19; E19 = C16-D19; E20 = C23-D20; E23 = C23+D20; E24 = C24+D27; E27 = C24-D27; E28 = C31-D28; E31 = C31+D28; E17 = C17+D18; E18 = C17-D18; E21 = C22-D21; E22 = C22+D21; E25 = C25+D26; E26 = C25-D26; E29 = C30-D29; E30 = C30+D29; E34 = ((D61 >> 3) + (D61 >> 4) + (D61 >> 7)) - (D34 - (D34 >> 6) - (D34 >> 8)); E35 = ((D60 >> 3) + (D60 >> 4) + (D60 >> 7)) - (D35 - (D35 >> 6) - (D35 >> 8)); E36 = - (D59 - (D59 >> 6) - (D59 >> 8)) - ((D36 >> 3) + (D36 >> 4) + (D36 >> 7)); E37 = - (D58 - (D58 >> 6) - (D58 >> 8)) - ((D37 >> 3) + (D37 >> 4) + (D37 >> 7)); E42 = (D53 - (D53 >> 3) - (D53 >> 5) - (D53 >> 7) - (D53 >> 8) - (D53 >> 10)) - ((D42 >> 1) + (D42 >> 5) + (D42 >> 6) + (D42 >> 7) + (D42 >> 10)); E43 = (D52 - (D52 >> 3) - (D52 >> 5) - (D52 >> 7) - (D52 >> 8) - (D52 >> 10)) - ((D43 >> 1) + (D43 >> 5) + (D43 >> 6) + (D43 >> 7) + (D43 >> 10)); E44 = - ((D51 >> 1) + (D51 >> 5) + (D51 >> 6) + (D51 >> 7) + (D51 >> 10)) - (D44 - (D44 >> 3) - (D44 >> 5) - (D44 >> 7) - (D44 >> 8) - (D44 >> 10)); E45 = - ((D50 >> 1) + (D50 >> 5) + (D50 >> 6) + (D50 >> 7) + (D50 >> 10)) - (D45 - (D45 >> 3) - (D45 >> 5) - (D45 >> 7) - (D45 >> 8) - (D45 >> 10)); E50 = (D50 - (D50 >> 3) - (D50 >> 5) - (D50 >> 7) - (D50 >> 8) - (D50 >> 10)) - ((D45 >> 1) + (D45 >> 5) + (D45 >> 6) + (D45 >> 7) + (D45 >> 10)); E51 = (D51 - (D51 >> 3) - (D51 >> 5) - (D51 >> 7) - (D51 >> 8) - (D51 >> 10)) - ((D44 >> 1) + (D44 >> 5) + (D44 >> 6) + (D44 >> 7) + (D44 >> 10)); E52 = ((D52 >> 1) + (D52 >> 5) + (D52 >> 6) + (D52 >> 7) + (D52 >> 10)) + (D43 - (D43 >> 3) - (D43 >> 5) - (D43 >> 7) - (D43 >> 8) - (D43 >> 10)); E53 = ((D53 >> 1) + (D53 >> 5) + (D53 >> 6) + (D53 >> 7) + (D53 >> 10)) + (D42 - (D42 >> 3) - (D42 >> 5) - (D42 >> 7) - (D42 >> 8) - (D42 >> 10)); E58 = ((D58 >> 3) + (D58 >> 4) + (D58 >> 7)) - (D37 - (D37 >> 6) - (D37 >> 8)); E59 = ((D59 >> 3) + (D59 >> 4) + (D59 >> 7)) - (D36 - (D36 >> 6) - (D36 >> 8)); E60 = (D60 - (D60 >> 6) - (D60 >> 8)) + ((D35 >> 3) + (D35 >> 4) + (D35 >> 7)); E61 = (D61 - (D61 >> 6) - (D61 >> 8)) + ((D34 >> 3) + (D34 >> 4) + (D34 >> 7));
y8 = ((E4 >> 3) + (E4 >> 4) + (E4 >> 7)) + (E7 - (E7 >> 6) - (E7 >> 8)); y40 = (E5 - (E5 >> 3) - (E5 >> 5) - (E5 >> 7) - (E5 >> 8) - (E5 >> 10)) + ((E6 >> 1) + (E6 >> 5) + (E6 >> 6) + (E6 >> 7) + (E6 >> 10)); y24 = (E6 - (E6 >> 3) - (E6 >> 5) - (E6 >> 7) - (E6 >> 8) - (E6 >> 10)) - ((E5 >> 1) + (E5 >> 5) + (E5 >> 6) + (E5 >> 7) + (E5 >> 10)); y56 = ((E7 >> 3) + (E7 >> 4) + (E7 >> 7)) - (E4 - (E4 >> 6) - (E4 >> 8));
F8 = D8+E9; F9 = D8-E9; F10 = D11-E10; F11 = D11+E10; F12 = D12+E13; F13 = D12-E13; F14 = D15-E14; F15 = D15+E14; F17 = ((E30 >> 3) + (E30 >> 4) + (E30 >> 7)) - (E17 - (E17 >> 6) - (E17 >> 8)); F18 = - (E29 - (E29 >> 6) - (E29 >> 8)) - ((E18 >> 3) + (E18 >> 4) + (E18 >> 7)); F21 = (E26 - (E26 >> 3) - (E26 >> 5) - (E26 >> 7) - (E26 >> 8) - (E26 >> 10)) - ((E21 >> 1) + (E21 >> 5) + (E21 >> 6) + (E21 >> 7) + (E21 >> 10)); F22 = - ((E25 >> 1) + (E25 >> 5) + (E25 >> 6) + (E25 >> 7) + (E25 >> 10)) - (E22 - (E22 >> 3) - (E22 >> 5) - (E22 >> 7) - (E22 >> 8) - (E22 >> 10)); F25 = (E25 - (E25 >> 3) - (E25 >> 5) - (E25 >> 7) - (E25 >> 8) - (E25 >> 10)) - ((E22 >> 1) + (E22 >> 5) + (E22 >> 6) + (E22 >> 7) + (E22 >> 10)); F26 = ((E26 >> 1) + (E26 >> 5) + (E26 >> 6) + (E26 >> 7) + (E26 >> 10)) + (E21 - (E21 >> 3) - (E21 >> 5) - (E21 >> 7) - (E21 >> 8) - (E21 >> 10)); F29 = ((E29 >> 3) + (E29 >> 4) + (E29 >> 7)) - (E18 - (E18 >> 6) - (E18 >> 8)); F30 = (E30 - (E30 >> 6) - (E30 >> 8)) + ((E17 >> 3) + (E17 >> 4) + (E17 >> 7)); F32 = D32+E35; F33 = D33+E34; F34 = D33-E34; F35 = D32-E35; F36 = D39-E36; F37 = D38-E37; F38 = D38+E37; F39 = D39+E36; F40 = D40+E43; F41 = D41+E42; F42 = D41-E42; F43 = D40-E43; F44 = D47-E44; F45 = D46-E45; F46 = D46+E45; F47 = D47+E44; F48 = D48+E51; F49 = D49+E50; F50 = D49-E50; F51 = D48-E51; F52 = D55-E52; F53 = D54-E53; F54 = D54+E53; F55 = D55+E52; F56 = D56+E59; F57 = D57+E58; F58 = D57-E58; F59 = D56-E59; F60 = D63-E60; F61 = D62-E61; F62 = D62+E61; F63 = D63+E60;
y4 = ((F8 >> 4) + (F8 >> 5) + (F8 >> 8)) + (F15 - (F15 >> 8) - (F15 >> 10)); y36 = ((F9 >> 1) + (F9 >> 2) + (F9 >> 6) + (F9 >> 7)) + ((F14 >> 1) + (F14 >> 3) + (F14 >> 7) + (F14 >> 9)); y20 = ((F10 >> 2) + (F10 >> 3) + (F10 >> 4) + (F10 >> 5) + (F10 >> 9) + (F10 >> 10)) + (F13 - (F13 >> 4) - (F13 >> 5) - (F13 >> 6) - (F13 >> 7) - (F13 >> 10)); y52 = (F11 - (F11 >> 5) - (F11 >> 7) - (F11 >> 8)) + ((F12 >> 2) + (F12 >> 5) + (F12 >> 7) + (F12 >> 10)); y12 = (F12 - (F12 >> 5) - (F12 >> 7) - (F12 >> 8)) - ((F11 >> 2) + (F11 >> 5) + (F11 >> 7) + (F11 >> 10)); y44 = ((F13 >> 2) + (F13 >> 3) + (F13 >> 4) + (F13 >> 5) + (F13 >> 9) + (F13 >> 10)) - (F10 - (F10 >> 4) - (F10 >> 5) - (F10 >> 6) - (F10 >> 7) - (F10 >> 10)); y28 = ((F14 >> 1) + (F14 >> 2) + (F14 >> 6) + (F14 >> 7)) - ((F9 >> 1) + (F9 >> 3) + (F9 >> 7) + (F9 >> 9)); y60 = ((F15 >> 4) + (F15 >> 5) + (F15 >> 8)) - (F8 - (F8 >> 8) - (F8 >> 10));
G16 = E16+F17; G17 = E16-F17; G18 = E19-F18; G19 = E19+F18; G20 = E20+F21; G21 = E20-F21; G22 = E23-F22; G23 = E23+F22; G24 = E24+F25; G25 = E24-F25; G26 = E27-F26; G27 = E27+F26; G28 = E28+F29; G29 = E28-F29; G30 = E31-F30; G31 = E31+F30; G33 = ((F62 >> 4) + (F62 >> 5) + (F62 >> 8)) - (F33 - (F33 >> 8) - (F33 >> 10)); G34 = - (F61 - (F61 >> 8) - (F61 >> 10)) - ((F34 >> 4) + (F34 >> 5) + (F34 >> 8)); G37 = ((F58 >> 1) + (F58 >> 2) + (F58 >> 6) + (F58 >> 7)) - ((F37 >> 1) + (F37 >> 3) + (F37 >> 7) + (F37 >> 9)); G38 = - ((F57 >> 1) + (F57 >> 3) + (F57 >> 7) + (F57 >> 9)) - ((F38 >> 1) + (F38 >> 2) + (F38 >> 6) + (F38 >> 7)); G41 = ((F54 >> 2) + (F54 >> 3) + (F54 >> 4) + (F54 >> 5) + (F54 >> 9) + (F54 >> 10)) - (F41 - (F41 >> 4) - (F41 >> 5) - (F41 >> 6) - (F41 >> 7) - (F41 >> 10)); G42 = - (F53 - (F53 >> 4) - (F53 >> 5) - (F53 >> 6) - (F53 >> 7) - (F53 >> 10)) - ((F42 >> 2) + (F42 >> 3) + (F42 >> 4) + (F42 >> 5) + (F42 >> 9) + (F42 >> 10)); G45 = (F50 - (F50 >> 5) - (F50 >> 7) - (F50 >> 8)) - ((F45 >> 2) + (F45 >> 5) + (F45 >> 7) + (F45 >> 10)); G46 = - ((F49 >> 2) + (F49 >> 5) + (F49 >> 7) + (F49 >> 10)) - (F46 - (F46 >> 5) - (F46 >> 7) - (F46 >> 8)); G49 = (F49 - (F49 >> 5) - (F49 >> 7) - (F49 >> 8)) - ((F46 >> 2) + (F46 >> 5) + (F46 >> 7) + (F46 >> 10)); G50 = ((F50 >> 2) + (F50 >> 5) + (F50 >> 7) + (F50 >> 10)) + (F45 - (F45 >> 5) - (F45 >> 7) - (F45 >> 8)); G53 = ((F53 >> 2) + (F53 >> 3) + (F53 >> 4) + (F53 >> 5) + (F53 >> 9) + (F53 >> 10)) - (F42 - (F42 >> 4) - (F42 >> 5) - (F42 >> 6) - (F42 >> 7) - (F42 >> 10)); G54 = (F54 - (F54 >> 4) - (F54 >> 5) - (F54 >> 6) - (F54 >> 7) - (F54 >> 10)) + ((F41 >> 2) + (F41 >> 3) + (F41 >> 4) + (F41 >> 5) + (F41 >> 9) + (F41 >> 10)); G57 = ((F57 >> 1) + (F57 >> 2) + (F57 >> 6) + (F57 >> 7)) - ((F38 >> 1) + (F38 >> 3) + (F38 >> 7) + (F38 >> 9)); G58 = ((F58 >> 1) + (F58 >> 3) + (F58 >> 7) + (F58 >> 9)) + ((F37 >> 1) + (F37 >> 2) + (F37 >> 6) + (F37 >> 7)); G61 = ((F61 >> 4) + (F61 >> 5) + (F61 >> 8)) - (F34 - (F34 >> 8) - (F34 >> 10)); G62 = (F62 - (F62 >> 8) - (F62 >> 10)) + ((F33 >> 4) + (F33 >> 5) + (F33 >> 8));
y2 = ((G16 >> 5) + (G16 >> 6) + (G16 >> 9)) + (G31 - (G31 >> 10)); y34 = (G17 - (G17 >> 2) - (G17 >> 7) - (G17 >> 10)) + ((G30 >> 1) + (G30 >> 3) + (G30 >> 5) + (G30 >> 6)); y18 = (G18 - (G18 >> 1) - (G18 >> 4) - (G18 >> 7) - (G18 >> 9)) + (G29 - (G29 >> 4) - (G29 >> 5) - (G29 >> 9)); y50 = (G19 - (G19 >> 5) - (G19 >> 6) - (G19 >> 7) - (G19 >> 8)) + ((G28 >> 2) + (G28 >> 4) + (G28 >> 6) + (G28 >> 7) + (G28 >> 10)); y10 = (G20 - (G20 >> 1) - (G20 >> 2) - (G20 >> 8) - (G20 >> 9) - (G20 >> 10)) + (G27 - (G27 >> 6) - (G27 >> 7) - (G27 >> 8) - (G27 >> 9) - (G27 >> 10)); y42 = (G21 - (G21 >> 3) - (G21 >> 6) - (G21 >> 9)) + ((G26 >> 1) + (G26 >> 7) + (G26 >> 8) + (G26 >> 9)); y26 = ((G22 >> 1) + (G22 >> 4) + (G22 >> 5) + (G22 >> 9)) + (G25 - (G25 >> 3) - (G25 >> 4) - (G25 >> 7) - (G25 >> 9)); y58 = (G23 - (G23 >> 7) - (G23 >> 9) - (G23 >> 10)) + ((G24 >> 3) + (G24 >> 6) + (G24 >> 8) + (G24 >> 9)); y6 = (G24 - (G24 >> 7) - (G24 >> 9) - (G24 >> 10)) - ((G23 >> 3) + (G23 >> 6) + (G23 >> 8) + (G23 >> 9)); y38 = ((G25 >> 1) + (G25 >> 4) + (G25 >> 5) + (G25 >> 9)) - (G22 - (G22 >> 3) - (G22 >> 4) - (G22 >> 7) - (G22 >> 9)); y22 = (G26 - (G26 >> 3) - (G26 >> 6) - (G26 >> 9)) - ((G21 >> 1) + (G21 >> 7) + (G21 >> 8) + (G21 >> 9)); y54 = (G27 - (G27 >> 1) - (G27 >> 2) - (G27 >> 8) - (G27 >> 9) - (G27 >> 10)) - (G20 - (G20 >> 6) - (G20 >> 7) - (G20 >> 8) - (G20 >> 9) - (G20 >> 10)); y14 = (G28 - (G28 >> 5) - (G28 >> 6) - (G28 >> 7) - (G28 >> 8)) - ((G19 >> 2) + (G19 >> 4) + (G19 >> 6) + (G19 >> 7) + (G19 >> 10)); y46 = (G29 - (G29 >> 1) - (G29 >> 4) - (G29 >> 7) - (G29 >> 9)) - (G18 - (G18 >> 4) - (G18 >> 5) - (G18 >> 9)); y30 = (G30 - (G30 >> 2) - (G30 >> 7) - (G30 >> 10)) - ((G17 >> 1) + (G17 >> 3) + (G17 >> 5) + (G17 >> 6)); y62 = ((G31 >> 5) + (G31 >> 6) + (G31 >> 9)) - (G16 - (G16 >> 10));
H32 = F32+G33; H33 = F32-G33; H34 = F35-G34; H35 = F35+G34; H36 = F36+G37; H37 = F36-G37; H38 = F39-G38; H39 = F39+G38; H40 = F40+G41; H41 = F40-G41; H42 = F43-G42; H43 = F43+G42; H44 = F44+G45; H45 = F44-G45; H46 = F47-G46; H47 = F47+G46; H48 = F48+G49; H49 = F48-G49; H50 = F51-G50; H51 = F51+G50; H52 = F52+G53; H53 = F52-G53; H54 = F55-G54; H55 = F55+G54; H56 = F56+G57; H57 = F56-G57; H58 = F59-G58; H59 = F59+G58; H60 = F60+G61; H61 = F60-G61; H62 = F63-G62; H63 = F63+G62;
y1 = ((H32 >> 6) + (H32 >> 7) + (H32 >> 10)) + (H63); y33 = (H33 - (H33 >> 2) - (H33 >> 6) - (H33 >> 7) - (H33 >> 9)) + ((H62 >> 1) + (H62 >> 3) + (H62 >> 4) + (H62 >> 9)); y17 = (H34 - (H34 >> 1) - (H34 >> 4) - (H34 >> 5) - (H34 >> 10)) + (H61 - (H61 >> 4) - (H61 >> 6) - (H61 >> 7)); y49 = (H35 - (H35 >> 4) - (H35 >> 8) - (H35 >> 10)) + ((H60 >> 2) + (H60 >> 4) + (H60 >> 5) + (H60 >> 6) + (H60 >> 10)); y9 = ((H36 >> 3) + (H36 >> 4) + (H36 >> 5)) + (H59 - (H59 >> 6) - (H59 >> 7) - (H59 >> 10)); y41 = ((H37 >> 1) + (H37 >> 2) + (H37 >> 4) + (H37 >> 5) + (H37 >> 10)) + ((H58 >> 1) +(H58 >> 5) + (H58 >> 8)); y25 = ((H38 >> 1) + (H38 >> 4) + (H38 >> 7) + (H38 >> 8) + (H38 >> 9)) + ((H57 >> 1) + (H57 >> 2) + (H57 >> 4) + (H57 >> 8) + (H57 >> 10)); y57 = (H39 - (H39 >> 7) - (H39 >> 8) - (H39 >> 9) - (H39 >> 10)) + (H56 - (H56 >> 1) - (H56 >> 2) - (H56 >> 4) - (H56 >> 6) - (H56 >> 10)); y5 = (H40 - (H40 >> 1) - (H40 >> 2) - (H40 >> 3) - (H40 >> 9) - (H40 >> 10)) + (H55 - (H55 >> 7)); y37 = (H41 - (H41 >> 3) - (H41 >> 4) - (H41 >> 6) - (H41 >> 7) - (H41 >> 10)) + (H54 - (H54 >> 2) - (H54 >> 3) - (H54 >> 7) - (H54 >> 9)); y21 = (H42 - (H42 >> 1) - (H42 >> 8) - (H42 >> 9) - (H42 >> 10)) + (H53 - (H53 >> 3) - (H53 >> 8) - (H53 >> 10)); y53 = (H43 - (H43 >> 5) - (H43 >> 8) - (H43 >> 10)) + ((H52 >> 2) + (H52 >> 6) + (H52 >> 10)); y13 = ((H44 >> 2) + (H44 >> 4) + (H44 >> 10)) + (H51 - (H51 >> 5) - (H51 >> 6) - (H51 >> 8)); y45 = (H45 - (H45 >> 4) - (H45 >> 5) - (H45 >> 7) - (H45 >> 8) - (H45 >> 10)) + (H50 - (H50 >> 1) - (H50 >> 5) - (H50 >> 6) - (H50 >> 8)); y29 = (H46 - (H46 >> 2) - (H46 >> 4) - (H46 >> 5) - (H46 >> 9) - (H46 >> 10)) + ((H49 >> 1) + (H49 >> 2) + (H49 >> 8) + (H49 >> 9) + (H49 >> 10)); y61 = (H47 - (H47 >> 9) - (H47 >> 10)) + ((H48 >> 4) + (H48 >> 7) + (H48 >> 9) + (H48 >> 10)); y3 = (H48 - (H48 >> 9) - (H48 >> 10)) - ((H47 >> 4) + (H47 >> 7) + (H47 >> 9) + (H47 >> 10)); y35 = (H49 - (H49 >> 2) - (H49 >> 4) - (H49 >> 5) - (H49 >> 9) - (H49 >> 10)) - ((H46 >> 1) + (H46 >> 2) + (H46 >> 8) + (H46 >> 9) + (H46 >> 10)); y19 = (H50 - (H50 >> 4) - (H50 >> 5) - (H50 >> 7) - (H50 >> 8) - (H50 >> 10)) - (H45 - (H45 >> 1) - (H45 >> 5) - (H45 >> 6) - (H45 >> 8)); y51 = ((H51 >> 2) + (H51 >> 4) + (H51 >> 10)) - (H44 - (H44 >> 5) - (H44 >> 6) - (H44 >> 8)); y11 = (H52 - (H52 >> 5) - (H52 >> 8) - (H52 >> 10)) - ((H43 >> 2) + (H43 >> 6) + (H43 >> 10)); y43 = (H53 - (H53 >> 1) - (H53 >> 8) - (H53 >> 9) - (H53 >> 10)) - (H42 - (H42 >> 3) - (H42 >> 8) - (H42 >> 10)); y27 = (H54 - (H54 >> 3) - (H54 >> 4) - (H54 >> 6) - (H54 >> 7) - (H54 >> 10)) - (H41 - (H41 >> 2) - (H41 >> 3) - (H41 >> 7) - (H41 >> 9)); y59 = (H55 - (H55 >> 1) - (H55 >> 2) - (H55 >> 3) - (H55 >> 9) - (H55 >> 10)) - (H40 - (H40 >> 7)); y7 = (H56 - (H56 >> 7) - (H56 >> 8) - (H56 >> 9) - (H56 >> 10)) - (H39 - (H39 >> 1) - (H39 >> 2) - (H39 >> 4) - (H39 >> 6) - (H39 >> 10)); y39 = ((H57 >> 1) + (H57 >> 4) + (H57 >> 7) + (H57 >> 8) + (H57 >> 9)) - ((H38 >> 1) + (H38 >> 2) + (H38 >> 4) + (H38 >> 8) + (H38 >> 10)); y23 = ((H58 >> 1) + (H58 >> 2) + (H58 >> 4) + (H58 >> 5) + (H58 >> 10)) - ((H37 >> 1) +(H37 >> 5) + (H37 >> 8)); y55 = ((H59 >> 3) + (H59 >> 4) + (H59 >> 5)) - (H36 - (H36 >> 6) - (H36 >> 7) - (H36 >> 10)); y15 = (H60 - (H60 >> 4) - (H60 >> 8) - (H60 >> 10)) - ((H35 >> 2) + (H35 >> 4) + (H35 >> 5) + (H35 >> 6) + (H35 >> 10)); y47 = (H61 - (H61 >> 1) - (H61 >> 4) - (H61 >> 5) - (H61 >> 10)) - (H34 - (H34 >> 4) - (H34 >> 6) - (H34 >> 7)); y31 = (H62 - (H62 >> 2) - (H62 >> 6) - (H62 >> 7) - (H62 >> 9)) - ((H33 >> 1) + (H33 >> 3) + (H33 >> 4) + (H33 >> 9)); y63 = ((H63 >> 6) + (H63 >> 7) + (H63 >> 10)) - (H32);
이에 대응되는 64 포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y63은 역변환되어야 할 입력값, A0 내지 O63은 중간값, X0 내지 X63은 역변환된 값을 나타낸다.
H32 = ((y1 >> 6) + (y1 >> 7) + (y1 >> 10)) - (y63); H33 = (y33 - (y33 >> 2) - (y33 >> 6) - (y33 >> 7) - (y33 >> 9)) - ((y31 >> 1) + (y31 >> 3) + (y31 >> 4) + (y31 >> 9)); H34 = (y17 - (y17 >> 1) - (y17 >> 4) - (y17 >> 5) - (y17 >> 10)) - (y47 - (y47 >> 4) - (y47 >> 6) - (y47 >> 7)); H35 = (y49 - (y49 >> 4) - (y49 >> 8) - (y49 >> 10)) - ((y15 >> 2) + (y15 >> 4) + (y15 >> 5) + (y15 >> 6) + (y15 >> 10)); H36 = ((y9 >> 3) + (y9 >> 4) + (y9 >> 5)) - (y55 - (y55 >> 6) - (y55 >> 7) - (y55 >> 10)); H37 = ((y41 >> 1) + (y41 >> 2) + (y41 >> 4) + (y41 >> 5) + (y41 >> 10)) - ((y23 >> 1) +(y23 >> 5) + (y23 >> 8)); H38 = ((y25 >> 1) + (y25 >> 4) + (y25 >> 7) + (y25 >> 8) + (y25 >> 9)) - ((y39 >> 1) + (y39 >> 2) + (y39 >> 4) + (y39 >> 8) + (y39 >> 10)); H39 = (y57 - (y57 >> 7) - (y57 >> 8) - (y57 >> 9) - (y57 >> 10)) - (y7 - (y7 >> 1) - (y7 >> 2) - (y7 >> 4) - (y7 >> 6) - (y7 >> 10)); H40 = (y5 - (y5 >> 1) - (y5 >> 2) - (y5 >> 3) - (y5 >> 9) - (y5 >> 10)) - (y59 - (y59 >> 7)); H41 = (y37 - (y37 >> 3) - (y37 >> 4) - (y37 >> 6) - (y37 >> 7) - (y37 >> 10)) - (y27 - (y27 >> 2) - (y27 >> 3) - (y27 >> 7) - (y27 >> 9)); H42 = (y21 - (y21 >> 1) - (y21 >> 8) - (y21 >> 9) - (y21 >> 10)) - (y43 - (y43 >> 3) - (y43 >> 8) - (y43 >> 10)); H43 = (y53 - (y53 >> 5) - (y53 >> 8) - (y53 >> 10)) - ((y11 >> 2) + (y11 >> 6) + (y11 >> 10)); H44 = ((y13 >> 2) + (y13 >> 4) + (y13 >> 10)) - (y51 - (y51 >> 5) - (y51 >> 6) - (y51 >> 8)); H45 = (y45 - (y45 >> 4) - (y45 >> 5) - (y45 >> 7) - (y45 >> 8) - (y45 >> 10)) - (y19 - (y19 >> 1) - (y19 >> 5) - (y19 >> 6) - (y19 >> 8)); H46 = (y29 - (y29 >> 2) - (y29 >> 4) - (y29 >> 5) - (y29 >> 9) - (y29 >> 10)) - ((y35 >> 1) + (y35 >> 2) + (y35 >> 8) + (y35 >> 9) + (y35 >> 10)); H47 = (y61 - (y61 >> 9) - (y61 >> 10)) - ((y3 >> 4) + (y3 >> 7) + (y3 >> 9) + (y3 >> 10)); H48 = (y3 - (y3 >> 9) - (y3 >> 10)) + ((y61 >> 4) + (y61 >> 7) + (y61 >> 9) + (y61 >> 10)); H49 = (y35 - (y35 >> 2) - (y35 >> 4) - (y35 >> 5) - (y35 >> 9) - (y35 >> 10)) + ((y29 >> 1) + (y29 >> 2) + (y29 >> 8) + (y29 >> 9) + (y29 >> 10)); H50 = (y19 - (y19 >> 4) - (y19 >> 5) - (y19 >> 7) - (y19 >> 8) - (y19 >> 10)) + (y45 - (y45 >> 1) - (y45 >> 5) - (y45 >> 6) - (y45 >> 8)); H51 = ((y51 >> 2) + (y51 >> 4) + (y51 >> 10)) + (y13 - (y13 >> 5) - (y13 >> 6) - (y13 >> 8)); H52 = (y11 - (y11 >> 5) - (y11 >> 8) - (y11 >> 10)) + ((y53 >> 2) + (y53 >> 6) + (y53 >> 10)); H53 = (y43 - (y43 >> 1) - (y43 >> 8) - (y43 >> 9) - (y43 >> 10)) + (y21 - (y21 >> 3) - (y21 >> 8) - (y21 >> 10)); H54 = (y27 - (y27 >> 3) - (y27 >> 4) - (y27 >> 6) - (y27 >> 7) - (y27 >> 10)) + (y37 - (y37 >> 2) - (y37 >> 3) - (y37 >> 7) - (y37 >> 9)); H55 = (y59 - (y59 >> 1) - (y59 >> 2) - (y59 >> 3) - (y59 >> 9) - (y59 >> 10)) + (y5 - (y5 >> 7)); H56 = (y7 - (y7 >> 7) - (y7 >> 8) - (y7 >> 9) - (y7 >> 10)) + (y57 - (y57 >> 1) - (y57 >> 2) - (y57 >> 4) - (y57 >> 6) - (y57 >> 10)); H57 = ((y39 >> 1) + (y39 >> 4) + (y39 >> 7) + (y39 >> 8) + (y39 >> 9)) + ((y25 >> 1) + (y25 >> 2) + (y25 >> 4) + (y25 >> 8) + (y25 >> 10)); H58 = ((y23 >> 1) + (y23 >> 2) + (y23 >> 4) + (y23 >> 5) + (y23 >> 10)) + ((y41 >> 1) +(y41 >> 5) + (y41 >> 8)); H59 = ((y55 >> 3) + (y55 >> 4) + (y55 >> 5)) + (y9 - (y9 >> 6) - (y9 >> 7) - (y9 >> 10)); H60 = (y15 - (y15 >> 4) - (y15 >> 8) - (y15 >> 10)) + ((y49 >> 2) + (y49 >> 4) + (y49 >> 5) + (y49 >> 6) + (y49 >> 10)); H61 = (y47 - (y47 >> 1) - (y47 >> 4) - (y47 >> 5) - (y47 >> 10)) + (y17 - (y17 >> 4) - (y17 >> 6) - (y17 >> 7)); H62 = (y31 - (y31 >> 2) - (y31 >> 6) - (y31 >> 7) - (y31 >> 9)) + ((y33 >> 1) + (y33 >> 3) + (y33 >> 4) + (y33 >> 9)); H63 = ((y63 >> 6) + (y63 >> 7) + (y63 >> 10)) + (y1);
G16 = ((y2 >> 5) + (y2 >> 6) + (y2 >> 9)) - (y62 - (y62 >> 10)); G17 = (y34 - (y34 >> 2) - (y34 >> 7) - (y34 >> 10)) - ((y30 >> 1) + (y30 >> 3) + (y30 >> 5) + (y30 >> 6)); G18 = (y18 - (y18 >> 1) - (y18 >> 4) - (y18 >> 7) - (y18 >> 9)) - (y46 - (y46 >> 4) - (y46 >> 5) - (y46 >> 9)); G19 = (y50 - (y50 >> 5) - (y50 >> 6) - (y50 >> 7) - (y50 >> 8)) - ((y14 >> 2) + (y14 >> 4) + (y14 >> 6) + (y14 >> 7) + (y14 >> 10)); G20 = (y10 - (y10 >> 1) - (y10 >> 2) - (y10 >> 8) - (y10 >> 9) - (y10 >> 10)) - (y54 - (y54 >> 6) - (y54 >> 7) - (y54 >> 8) - (y54 >> 9) - (y54 >> 10)); G21 = (y42 - (y42 >> 3) - (y42 >> 6) - (y42 >> 9)) - ((y22 >> 1) + (y22 >> 7) + (y22 >> 8) + (y22 >> 9)); G22 = ((y26 >> 1) + (y26 >> 4) + (y26 >> 5) + (y26 >> 9)) - (y38 - (y38 >> 3) - (y38 >> 4) - (y38 >> 7) - (y38 >> 9)); G23 = (y58 - (y58 >> 7) - (y58 >> 9) - (y58 >> 10)) - ((y6 >> 3) + (y6 >> 6) + (y6 >> 8) + (y6 >> 9)); G24 = (y6 - (y6 >> 7) - (y6 >> 9) - (y6 >> 10)) + ((y58 >> 3) + (y58 >> 6) + (y58 >> 8) + (y58 >> 9)); G25 = ((y38 >> 1) + (y38 >> 4) + (y38 >> 5) + (y38 >> 9)) + (y26 - (y26 >> 3) - (y26 >> 4) - (y26 >> 7) - (y26 >> 9)); G26 = (y22 - (y22 >> 3) - (y22 >> 6) - (y22 >> 9)) + ((y42 >> 1) + (y42 >> 7) + (y42 >> 8) + (y42 >> 9)); G27 = (y54 - (y54 >> 1) - (y54 >> 2) - (y54 >> 8) - (y54 >> 9) - (y54 >> 10)) + (y10 - (y10 >> 6) - (y10 >> 7) - (y10 >> 8) - (y10 >> 9) - (y10 >> 10)); G28 = (y14 - (y14 >> 5) - (y14 >> 6) - (y14 >> 7) - (y14 >> 8)) + ((y50 >> 2) + (y50 >> 4) + (y50 >> 6) + (y50 >> 7) + (y50 >> 10)); G29 = (y46 - (y46 >> 1) - (y46 >> 4) - (y46 >> 7) - (y46 >> 9)) + (y18 - (y18 >> 4) - (y18 >> 5) - (y18 >> 9)); G30 = (y30 - (y30 >> 2) - (y30 >> 7) - (y30 >> 10)) + ((y34 >> 1) + (y34 >> 3) + (y34 >> 5) + (y34 >> 6)); G31 = ((y62 >> 5) + (y62 >> 6) + (y62 >> 9)) + (y2 - (y2 >> 10)); G32 = H32+H33; G33 = H32-H33; G34 = H35-H34; G35 = H35+H34; G36 = H36+H37; G37 = H36-H37; G38 = H39-H38; G39 = H39+H38; G40 = H40+H41; G41 = H40-H41; G42 = H43-H42; G43 = H43+H42; G44 = H44+H45; G45 = H44-H45; G46 = H47-H46; G47 = H47+H46; G48 = H48+H49; G49 = H48-H49; G50 = H51-H50; G51 = H51+H50; G52 = H52+H53; G53 = H52-H53; G54 = H55-H54; G55 = H55+H54; G56 = H56+H57; G57 = H56-H57; G58 = H59-H58; G59 = H59+H58; G60 = H60+H61; G61 = H60-H61; G62 = H63-H62; G63 = H63+H62;
F8 = ((y4 >> 4) + (y4 >> 5) + (y4 >> 8)) - (y60 - (y60 >> 8) - (y60 >> 10)); F9 = ((y36 >> 1) + (y36 >> 2) + (y36 >> 6) + (y36 >> 7)) - ((y28 >> 1) + (y28 >> 3) + (y28 >> 7) + (y28 >> 9)); F10 = ((y20 >> 2) + (y20 >> 3) + (y20 >> 4) + (y20 >> 5) + (y20 >> 9) + (y20 >> 10)) - (y44 - (y44 >> 4) - (y44 >> 5) - (y44 >> 6) - (y44 >> 7) - (y44 >> 10)); F11 = (y52 - (y52 >> 5) - (y52 >> 7) - (y52 >> 8)) - ((y12 >> 2) + (y12 >> 5) + (y12 >> 7) + (y12 >> 10)); F12 = (y12 - (y12 >> 5) - (y12 >> 7) - (y12 >> 8)) + ((y52 >> 2) + (y52 >> 5) + (y52 >> 7) + (y52 >> 10)); F13 = ((y44 >> 2) + (y44 >> 3) + (y44 >> 4) + (y44 >> 5) + (y44 >> 9) + (y44 >> 10)) + (y20 - (y20 >> 4) - (y20 >> 5) - (y20 >> 6) - (y20 >> 7) - (y20 >> 10)); F14 = ((y28 >> 1) + (y28 >> 2) + (y28 >> 6) + (y28 >> 7)) + ((y36 >> 1) + (y36 >> 3) + (y36 >> 7) + (y36 >> 9)); F15 = ((y60 >> 4) + (y60 >> 5) + (y60 >> 8)) + (y4 - (y4 >> 8) - (y4 >> 10)); F16 = G16+G17; F17 = G16-G17; F18 = G19-G18; F19 = G19+G18; F20 = G20+G21; F21 = G20-G21; F22 = G23-G22; F23 = G23+G22; F24 = G24+G25; F25 = G24-G25; F26 = G27-G26; F27 = G27+G26; F28 = G28+G29; F29 = G28-G29; F30 = G31-G30; F31 = G31+G30; F33 = ((G62 >> 4) + (G62 >> 5) + (G62 >> 8)) - (G33 - (G33 >> 8) - (G33 >> 10)); F34 = - (G61 - (G61 >> 8) - (G61 >> 10)) - ((G34 >> 4) + (G34 >> 5) + (G34 >> 8)); F37 = ((G58 >> 1) + (G58 >> 2) + (G58 >> 6) + (G58 >> 7)) - ((G37 >> 1) + (G37 >> 3) + (G37 >> 7) + (G37 >> 9)); F38 = - ((G57 >> 1) + (G57 >> 3) + (G57 >> 7) + (G57 >> 9)) - ((G38 >> 1) + (G38 >> 2) + (G38 >> 6) + (G38 >> 7)); F41 = ((G54 >> 2) + (G54 >> 3) + (G54 >> 4) + (G54 >> 5) + (G54 >> 9) + (G54 >> 10)) - (G41 - (G41 >> 4) - (G41 >> 5) - (G41 >> 6) - (G41 >> 7) - (G41 >> 10)); F42 = - (G53 - (G53 >> 4) - (G53 >> 5) - (G53 >> 6) - (G53 >> 7) - (G53 >> 10)) - ((G42 >> 2) + (G42 >> 3) + (G42 >> 4) + (G42 >> 5) + (G42 >> 9) + (G42 >> 10)); F45 = (G50 - (G50 >> 5) - (G50 >> 7) - (G50 >> 8)) - ((G45 >> 2) + (G45 >> 5) + (G45 >> 7) + (G45 >> 10)); F46 = - ((G49 >> 2) + (G49 >> 5) + (G49 >> 7) + (G49 >> 10)) - (G46 - (G46 >> 5) - (G46 >> 7) - (G46 >> 8)); F49 = (G49 - (G49 >> 5) - (G49 >> 7) - (G49 >> 8)) - ((G46 >> 2) + (G46 >> 5) + (G46 >> 7) + (G46 >> 10)); F50 = ((G50 >> 2) + (G50 >> 5) + (G50 >> 7) + (G50 >> 10)) + (G45 - (G45 >> 5) - (G45 >> 7) - (G45 >> 8)); F53 = ((G53 >> 2) + (G53 >> 3) + (G53 >> 4) + (G53 >> 5) + (G53 >> 9) + (G53 >> 10)) - (G42 - (G42 >> 4) - (G42 >> 5) - (G42 >> 6) - (G42 >> 7) - (G42 >> 10)); F54 = (G54 - (G54 >> 4) - (G54 >> 5) - (G54 >> 6) - (G54 >> 7) - (G54 >> 10)) + ((G41 >> 2) + (G41 >> 3) + (G41 >> 4) + (G41 >> 5) + (G41 >> 9) + (G41 >> 10)); F57 = ((G57 >> 1) + (G57 >> 2) + (G57 >> 6) + (G57 >> 7)) - ((G38 >> 1) + (G38 >> 3) + (G38 >> 7) + (G38 >> 9)); F58 = ((G58 >> 1) + (G58 >> 3) + (G58 >> 7) + (G58 >> 9)) + ((G37 >> 1) + (G37 >> 2) + (G37 >> 6) + (G37 >> 7)); F61 = ((G61 >> 4) + (G61 >> 5) + (G61 >> 8)) - (G34 - (G34 >> 8) - (G34 >> 10)); F62 = (G62 - (G62 >> 8) - (G62 >> 10)) + ((G33 >> 4) + (G33 >> 5) + (G33 >> 8));
E4 = ((y8 >> 3) + (y8 >> 4) + (y8 >> 7)) - (y56 - (y56 >> 6) - (y56 >> 8)); E5 = (y40 - (y40 >> 3) - (y40 >> 5) - (y40 >> 7) - (y40 >> 8) - (y40 >> 10)) - ((y24 >> 1) + (y24 >> 5) + (y24 >> 6) + (y24 >> 7) + (y24 >> 10)); E6 = (y24 - (y24 >> 3) - (y24 >> 5) - (y24 >> 7) - (y24 >> 8) - (y24 >> 10)) + ((y40 >> 1) + (y40 >> 5) + (y40 >> 6) + (y40 >> 7) + (y40 >> 10)); E7 = ((y56 >> 3) + (y56 >> 4) + (y56 >> 7)) + (y8 - (y8 >> 6) - (y8 >> 8)); E8 = F8+F9; E9 = F8-F9; E10 = F11-F10; E11 = F11+F10; E12 = F12+F13; E13 = F12-F13; E14 = F15-F14; E15 = F15+F14; E17 = ((F30 >> 3) + (F30 >> 4) + (F30 >> 7)) - (F17 - (F17 >> 6) - (F17 >> 8)); E18 = - (F29 - (F29 >> 6) - (F29 >> 8)) - ((F18 >> 3) + (F18 >> 4) + (F18 >> 7)); E21 = (F26 - (F26 >> 3) - (F26 >> 5) - (F26 >> 7) - (F26 >> 8) - (F26 >> 10)) - ((F21 >> 1) + (F21 >> 5) + (F21 >> 6) + (F21 >> 7) + (F21 >> 10)); E22 = - ((F25 >> 1) + (F25 >> 5) + (F25 >> 6) + (F25 >> 7) + (F25 >> 10)) - (F22 - (F22 >> 3) - (F22 >> 5) - (F22 >> 7) - (F22 >> 8) - (F22 >> 10)); E25 = (F25 - (F25 >> 3) - (F25 >> 5) - (F25 >> 7) - (F25 >> 8) - (F25 >> 10)) - ((F22 >> 1) + (F22 >> 5) + (F22 >> 6) + (F22 >> 7) + (F22 >> 10)); E26 = ((F26 >> 1) + (F26 >> 5) + (F26 >> 6) + (F26 >> 7) + (F26 >> 10)) + (F21 - (F21 >> 3) - (F21 >> 5) - (F21 >> 7) - (F21 >> 8) - (F21 >> 10)); E29 = ((F29 >> 3) + (F29 >> 4) + (F29 >> 7)) - (F18 - (F18 >> 6) - (F18 >> 8)); E30 = (F30 - (F30 >> 6) - (F30 >> 8)) + ((F17 >> 3) + (F17 >> 4) + (F17 >> 7)); E32 = G32+G35; E33 = F33+F34; E34 = F33-F34; E35 = G32-G35; E36 = G39-G36; E37 = F38-F37; E38 = F38+F37; E39 = G39+G36; E40 = G40+G43; E41 = F41+F42; E42 = F41-F42; E43 = G40-G43; E44 = G47-G44; E45 = F46-F45; E46 = F46+F45; E47 = G47+G44; E48 = G48+G51; E49 = F49+F50; E50 = F49-F50; E51 = G48-G51; E52 = G55-G52; E53 = F54-F53; E54 = F54+F53; E55 = G55+G52; E56 = G56+G59; E57 = F57+F58; E58 = F57-F58; E59 = G56-G59; E60 = G63-G60; E61 = F62-F61; E62 = F62+F61; E63 = G63+G60;
iTmp = (y0+y32); D0 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (y0-y32); D1 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); D2 = ((y16 >> 2) + (y16 >> 3) + (y16 >> 7)) - (y48 - (y48 >> 4) - (y48 >> 7) - (y48 >> 8) - (y48 >> 9)); D3 = (y16 - (y16 >> 4) - (y16 >> 7) - (y16 >> 8) - (y16 >> 9)) + ((y48 >> 2) + (y48 >> 3) + (y48 >> 7)); D4 = E4+E5; D5 = E4-E5; D6 = E7-E6; D7 = E7+E6; D9 = ((E14 >> 2) + (E14 >> 3) + (E14 >> 7)) - (E9 - (E9 >> 4) - (E9 >> 7) - (E9 >> 8) - (E9 >> 9)); D10 = - (E13 - (E13 >> 4) - (E13 >> 7) - (E13 >> 8) - (E13 >> 9)) - ((E10 >> 2) + (E10 >> 3) + (E10 >> 7)); D13 = ((E13 >> 2) + (E13 >> 3) + (E13 >> 7)) - (E10 - (E10 >> 4) - (E10 >> 7) - (E10 >> 8) - (E10 >> 9)); D14 = (E14 - (E14 >> 4) - (E14 >> 7) - (E14 >> 8) - (E14 >> 9)) + ((E9 >> 2) + (E9 >> 3) + (E9 >> 7)); D16 = F16+F19; D19 = F16-F19; D20 = F23-F20; D23 = F23+F20; D24 = F24+F27; D27 = F24-F27; D28 = F31-F28; D31 = F31+F28; D17 = E17+E18; D18 = E17-E18; D21 = E22-E21; D22 = E22+E21; D25 = E25+E26; D26 = E25-E26; D29 = E30-E29; D30 = E30+E29; D34 = ((E61 >> 3) + (E61 >> 4) + (E61 >> 7)) - (E34 - (E34 >> 6) - (E34 >> 8)); D35 = ((E60 >> 3) + (E60 >> 4) + (E60 >> 7)) - (E35 - (E35 >> 6) - (E35 >> 8)); D36 = - (E59 - (E59 >> 6) - (E59 >> 8)) - ((E36 >> 3) + (E36 >> 4) + (E36 >> 7)); D37 = - (E58 - (E58 >> 6) - (E58 >> 8)) - ((E37 >> 3) + (E37 >> 4) + (E37 >> 7)); D42 = (E53 - (E53 >> 3) - (E53 >> 5) - (E53 >> 7) - (E53 >> 8) - (E53 >> 10)) - ((E42 >> 1) + (E42 >> 5) + (E42 >> 6) + (E42 >> 7) + (E42 >> 10)); D43 = (E52 - (E52 >> 3) - (E52 >> 5) - (E52 >> 7) - (E52 >> 8) - (E52 >> 10)) - ((E43 >> 1) + (E43 >> 5) + (E43 >> 6) + (E43 >> 7) + (E43 >> 10)); D44 = - ((E51 >> 1) + (E51 >> 5) + (E51 >> 6) + (E51 >> 7) + (E51 >> 10)) - (E44 - (E44 >> 3) - (E44 >> 5) - (E44 >> 7) - (E44 >> 8) - (E44 >> 10)); D45 = - ((E50 >> 1) + (E50 >> 5) + (E50 >> 6) + (E50 >> 7) + (E50 >> 10)) - (E45 - (E45 >> 3) - (E45 >> 5) - (E45 >> 7) - (E45 >> 8) - (E45 >> 10)); D50 = (E50 - (E50 >> 3) - (E50 >> 5) - (E50 >> 7) - (E50 >> 8) - (E50 >> 10)) - ((E45 >> 1) + (E45 >> 5) + (E45 >> 6) + (E45 >> 7) + (E45 >> 10)); D51 = (E51 - (E51 >> 3) - (E51 >> 5) - (E51 >> 7) - (E51 >> 8) - (E51 >> 10)) - ((E44 >> 1) + (E44 >> 5) + (E44 >> 6) + (E44 >> 7) + (E44 >> 10)); D52 = ((E52 >> 1) + (E52 >> 5) + (E52 >> 6) + (E52 >> 7) + (E52 >> 10)) + (E43 - (E43 >> 3) - (E43 >> 5) - (E43 >> 7) - (E43 >> 8) - (E43 >> 10)); D53 = ((E53 >> 1) + (E53 >> 5) + (E53 >> 6) + (E53 >> 7) + (E53 >> 10)) + (E42 - (E42 >> 3) - (E42 >> 5) - (E42 >> 7) - (E42 >> 8) - (E42 >> 10)); D58 = ((E58 >> 3) + (E58 >> 4) + (E58 >> 7)) - (E37 - (E37 >> 6) - (E37 >> 8)); D59 = ((E59 >> 3) + (E59 >> 4) + (E59 >> 7)) - (E36 - (E36 >> 6) - (E36 >> 8)); D60 = (E60 - (E60 >> 6) - (E60 >> 8)) + ((E35 >> 3) + (E35 >> 4) + (E35 >> 7)); D61 = (E61 - (E61 >> 6) - (E61 >> 8)) + ((E34 >> 3) + (E34 >> 4) + (E34 >> 7));
C0 = D0+D3; C3 = D0-D3; C8 = E8+E11; C11 = E8-E11; C12 = E15-E12; C15 = E15+E12; C1 = D1+D2; C2 = D1-D2; C9 = D9+D10; C10 = D9-D10; C13 = D14-D13; C14 = D14+D13; iTmp = (D6-D5); C5 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (D6+D5); C6 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); C18 = ((D29 >> 2) + (D29 >> 3) + (D29 >> 7)) - (D18 - (D18 >> 4) - (D18 >> 7) - (D18 >> 8) - (D18 >> 9)); C20 = - (D27 - (D27 >> 4) - (D27 >> 7) - (D27 >> 8) - (D27 >> 9)) - ((D20 >> 2) + (D20 >> 3) + (D20 >> 7)); C26 = - (D21 - (D21 >> 4) - (D21 >> 7) - (D21 >> 8) - (D21 >> 9)) + ((D26 >> 2) + (D26 >> 3) + (D26 >> 7)); C28 = ((D19 >> 2) + (D19 >> 3) + (D19 >> 7)) + (D28 - (D28 >> 4) - (D28 >> 7) - (D28 >> 8) - (D28 >> 9)); C19 = ((D28 >> 2) + (D28 >> 3) + (D28 >> 7)) - (D19 - (D19 >> 4) - (D19 >> 7) - (D19 >> 8) - (D19 >> 9)); C21 = -(D26 - (D26 >> 4) - (D26 >> 7) - (D26 >> 8) - (D26 >> 9)) - ((D21 >> 2) + (D21 >> 3) + (D21 >> 7)); C27 = - (D20 - (D20 >> 4) - (D20 >> 7) - (D20 >> 8) - (D20 >> 9)) + ((D27 >> 2) + (D27 >> 3) + (D27 >> 7)); C29 = ((D18 >> 2) + (D18 >> 3) + (D18 >> 7)) + (D29 - (D29 >> 4) - (D29 >> 7) - (D29 >> 8) - (D29 >> 9)); C32 = E32+E39; C39 = E32-E39; C40 = E47-E40; C47 = E47+E40; C48 = E48+E55; C55 = E48-E55; C56 = E63-E56; C63 = E63+E56; C33 = E33+E38; C38 = E33-E38; C41 = E46-E41; C46 = E46+E41; C49 = E49+E54; C54 = E49-E54; C57 = E62-E57; C62 = E62+E57; C34 = D34+D37; C37 = D34-D37; C42 = D45-D42; C45 = D45+D42; C50 = D50+D53; C53 = D50-D53; C58 = D61-D58; C61 = D61+D58; C35 = D35+D36; C36 = D35-D36; C43 = D44-D43; C44 = D44+D43; C51 = D51+D52; C52 = D51-D52; C59 = D60-D59; C60 = D60+D59;
B0 = C0+D7; B7 = C0-D7; B1 = C1+C6; B6 = C1-C6; B2 = C2+C5; B5 = C2-C5; B3 = C3+D4; B4 = C3-D4; iTmp = (C13-C10); B10 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (C13+C10); B13 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (C12-C11); B11 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (C12+C11); B12 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); B16 = D16+D23; B23 = D16-D23; B24 = D31-D24; B31 = D31+D24; B17 = D17+D22; B22 = D17-D22; B25 = D30-D25; B30 = D30+D25; B18 = C18+C21; B21 = C18-C21; B26 = C29-C26; B29 = C29+C26; B19 = C19+C20; B20 = C19-C20; B27 = C28-C27; B28 = C28+C27; B36 = ((C59 >> 2) + (C59 >> 3) + (C59 >> 7)) - (C36 - (C36 >> 4) - (C36 >> 7) - (C36 >> 8) - (C36 >> 9)); B40 = - (C55 - (C55 >> 4) - (C55 >> 7) - (C55 >> 8) - (C55 >> 9)) - ((C40 >> 2) + (C40 >> 3) + (C40 >> 7)); B52 = - (C43 - (C43 >> 4) - (C43 >> 7) - (C43 >> 8) - (C43 >> 9)) + ((C52 >> 2) + (C52 >> 3) + (C52 >> 7)); B56 = ((C39 >> 2) + (C39 >> 3) + (C39 >> 7)) + (C56 - (C56 >> 4) - (C56 >> 7) - (C56 >> 8) - (C56 >> 9)); B37 = ((C58 >> 2) + (C58 >> 3) + (C58 >> 7)) - (C37 - (C37 >> 4) - (C37 >> 7) - (C37 >> 8) - (C37 >> 9)); B41 = - (C54 - (C54 >> 4) - (C54 >> 7) - (C54 >> 8) - (C54 >> 9)) - ((C41 >> 2) + (C41 >> 3) + (C41 >> 7)); B53 = - (C42 - (C42 >> 4) - (C42 >> 7) - (C42 >> 8) - (C42 >> 9)) + ((C53 >> 2) + (C53 >> 3) + (C53 >> 7)); B57 = ((C38 >> 2) + (C38 >> 3) + (C38 >> 7)) + (C57 - (C57 >> 4) - (C57 >> 7) - (C57 >> 8) - (C57 >> 9)); B38 = ((C57 >> 2) + (C57 >> 3) + (C57 >> 7)) - (C38 - (C38 >> 4) - (C38 >> 7) - (C38 >> 8) - (C38 >> 9)); B42 = - (C53 - (C53 >> 4) - (C53 >> 7) - (C53 >> 8) - (C53 >> 9)) - ((C42 >> 2) + (C42 >> 3) + (C42 >> 7)); B54 = - (C41 - (C41 >> 4) - (C41 >> 7) - (C41 >> 8) - (C41 >> 9)) + ((C54 >> 2) + (C54 >> 3) + (C54 >> 7)); B58 = ((C37 >> 2) + (C37 >> 3) + (C37 >> 7)) + (C58 - (C58 >> 4) - (C58 >> 7) - (C58 >> 8) - (C58 >> 9)); B39 = ((C56 >> 2) + (C56 >> 3) + (C56 >> 7)) - (C39 - (C39 >> 4) - (C39 >> 7) - (C39 >> 8) - (C39 >> 9)); B43 = - (C52 - (C52 >> 4) - (C52 >> 7) - (C52 >> 8) - (C52 >> 9)) - ((C43 >> 2) + (C43 >> 3) + (C43 >> 7)); B55 = - (C40 - (C40 >> 4) - (C40 >> 7) - (C40 >> 8) - (C40 >> 9)) + ((C55 >> 2) + (C55 >> 3) + (C55 >> 7)); B59 = ((C36 >> 2) + (C36 >> 3) + (C36 >> 7)) + (C59 - (C59 >> 4) - (C59 >> 7) - (C59 >> 8) - (C59 >> 9));
A0 = B0+C15; A15 = B0-C15; A1 = B1+C14; A14 = B1-C14; A2 = B2+B13; A13 = B2-B13; A3 = B3+B12; A12 = B3-B12; A4 = B4+B11; A11 = B4-B11; A5 = B5+B10; A10 = B5-B10; A6 = B6+C9; A9 = B6-C9; A7 = B7+C8; A8 = B7-C8; iTmp = (B27-B20); A20 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (B27+B20); A27 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (B26-B21); A21 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (B26+B21); A26 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (B25-B22); A22 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (B25+B22); A25 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (B24-B23); A23 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (B24+B23); A24 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); A32 = C32+C47; A47 = C32-C47; A48 = C63-C48; A63 = C63+C48; A33 = C33+C46; A46 = C33-C46; A49 = C62-C49; A62 = C62+C49; A34 = C34+C45; A45 = C34-C45; A50 = C61-C50; A61 = C61+C50; A35 = C35+C44; A44 = C35-C44; A51 = C60-C51; A60 = C60+C51; A36 = B36+B43; A43 = B36-B43; A52 = B59-B52; A59 = B59+B52; A37 = B37+B42; A42 = B37 -B42; A53 = B58-B53; A58 = B58+B53; A38 = B38+B41; A41 = B38-B41; A54 = B57-B54; A57 = B57+B54; A39 = B39+B40; A40 = B39-B40; A55 = B56-B55; A56 = B56+B55;
O0 = A0+B31; O31 = A0-B31; O1 = A1+B30; O30 = A1-B30; O2 = A2+B29; O29 = A2-B29; O3 = A3+B28; O28 = A3-B28; O4 = A4+A27; O27 = A4-A27; O5 = A5+A26; O26 = A5-A26; O6 = A6+A25; O25 = A6-A25; O7 = A7+A24; O24 = A7-A24; O8 = A8+A23; O23 = A8-A23; O9 = A9+A22; O22 = A9-A22; O10 = A10+A21; O21 = A10-A21; O11 = A11+A20; O20 = A11-A20; O12 = A12+B19; O19 = A12-B19; O13 = A13+B18; O18 = A13-B18; O14 = A14+B17; O17 = A14-B17; O15 = A15+B16; O16 = A15-B16; iTmp = (A55-A40); O40 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A55+A40); O55 = iTmp- (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A54-A41); O41 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A54+A41); O54 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A53-A42); O42 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A53+A42); O53 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A52-A43); O43 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A52+A43); O52 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A51-A44); O44 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A51+A44); O51 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A50-A45); O45 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A50+A45); O50 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A49-A46); O46 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A49+A46); O49 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A48-A47); O47 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8); iTmp = (A48+A47); O48 = iTmp - (iTmp >> 2) - (iTmp >> 5) - (iTmp >> 7) - (iTmp >> 8);
x0 = O0+A63; x63 = O0-A63; x1 = O1+A62; x62 = O1-A62; x2 = O2+A61; x61 = O2-A61; x3 = O3+A60; x60 = O3-A60; x4 = O4+A59; x59 = O4-A59; x5 = O5+A58; x58 = O5-A58; x6 = O6+A57; x57 = O6-A57; x7 = O7+A56; x56 = O7-A56; x8 = O8+O55; x55 = O8-O55; x9 = O9+O54; x54 = O9-O54; x10 = O10+O53; x53 = O10-O53; x11 = O11+O52; x52 = O11-O52; x12 = O12+O51; x51 = O12-O51; x13 = O13+O50; x50 = O13-O50; x14 = O14+O49; x49 = O14-O49; x15 = O15+O48; x48 = O15-O48; x16 = O16+O47; x47 = O16-O47; x17 = O17+O46; x46 = O17-O46; x18 = O18+O45; x45 = O18-O45; x19 = O19+O44; x44 = O19-O44; x20 = O20+O43; x43 = O20-O43; x21 = O21+O42; x42 = O21-O42; x22 = O22+O41; x41 = O22-O41; x23 = O23+O40; x40 = O23-O40; x24 = O24+A39; x39 = O24-A39; x25 = O25+A38; x38 = O25-A38; x26 = O26+A37; x37 = O26-A37; x27 = O27+A36; x36 = O27-A36; x28 = O28+A35; x35 = O28-A35; x29 = O29+A34; x34 = O29-A34; x30 = O30+A33; x33 = O30-A33; x31 = O31+A32; x32 = O31-A32;
도 104은 본 발명의 또 다른 실시예에 따른 이산 코사인 변환의 흐름도(flow graph)를 도시한다.
도 104를 참조하면, x0 내지 x31은 입력값들을 나타낸다. y0 내지 y31은 이산 코사인 변환의 출력값들을 나타낸다. 변환시에 데이터 처리 방향은 좌측에서 우측이며, 역변환시에 데이터 처리 방향은 우측에서 좌측이다. 점에서 교차하는 2개의 라인은 2개의 수의 덧셈을 나타낸다. '-'는 부정(negation)을 나타낸다. 각 라인 위의 값 R(θ)는 도 16에 도시된 바와 같은 버터플라이 구조에 기초한 연산 과정을 나타낸다. 또한 도 104에서, 도면 부호 10410은 4x4 포인트 이산 코사인 변환, 도면 부호 10420은 8x8 포인트 이산 코사인 변환, 도면 부호 10430은 16x16 포인트 이산 코사인 변환을 수행하는 부분을 나타낸다.
전술한 본 발명의 또 다른 실시예와 유사하게, 도 104에 도시된 각 포인트 연산을 위한 원소들 중 삼각함수 sin 및 cos에 기초한 값들을 분모가 2의 거듭 제곱 형태인 소정의 유리수 값들로 치환된 값을 이용할 수 있다.
16 포인트 이산 코사인 변환에 이용되는 cos 및 sin 값들은 다음의 값들로 대체될 수 있다.
cos(pi*7/32) ~= 49/64; sin(pi*7/32) ~= 40/64; cos(pi*11/32) ~= 30/64; sin(pi*11/32) ~= 56/64; cos(pi*3/32) ~= 61/64; sin(pi*3/32) ~= 18/64; cos(pi*15/32) ~= 6/64; sin(pi*15/32) ~= 63/64; cos(pi*14/32) ~= 12/64; sin(pi*14/32) ~= 62/64; cos(pi*10/32) ~= 35/64; sin(pi*10/32) ~= 53/64; cos(pi*8/32) ~= 45/64; sin(pi*8/32) ~= 45/64; cos(pi*12/32) ~= 24/64; sin(pi*12/32) ~= 59/64
이와 같이 대체된 cos 및 sin 값을 이용하여 도 104의 16 포인트 이산 코사인 변환을 수행하는 단계는, X0 내지 X15은 변환되어야 할 입력값, B0 내지 B15, C0 내지 C15, D0 내지 D15, E0 내지 E15, F0 내지 F15, G0 내지 G15은 중간값, Y0 내지 Y15은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
// stage 1
A0 = x0 + x15; A1 = x1 + x14; A2 = x2 + x13; A3 = x3 + x12; A4 = x4 + x11; A5 = x5 + x10; A6 = x6 + x9; A7 = x7 + x8; A8 = x7 - x8; A9 = x6 - x9; A10 = x5 - x10; A11 = x4 - x11; A12 = x3 - x12; A13 = x2 - x13; A14 = x1 - x14; A15 = x0 - x15;
//stage 2
B0 = A0 + A7; B7 = A0 - A7; B1 = A1 + A6; B6 = A1 - A6; B2 = A2 + A5; B5 = A2 - A5; B3 = A3 + A4; B4 = A3 - A4; B8 = (49*A8 + 40*A15) >> 6; B15 = (-40*A8 + 49*A15) >> 6; B9 = (30*A9 - 56*A14) >> 6; B14 = (56*A9 + 30*A14) >> 6; B10 = (61*A10 + 18*A13) >> 6; B13 = (-18*A10 + 61*A13) >> 6; B11 = (6*A11 - 63*A12) >> 6; B12 = (63*A11 + 6*A12) >> 6;
//stage 3
C0 = B0 + B3; C3 = B0 - B3; C1 = B1 + B2; C2 = B1 - B2; C4 = (6*B4 + 31*B7) >> 5; C7 = (-31*B4 + 6*B7) >> 5; C5 = (35*B5 + 53*B6) >> 6; C6 = (-53*B5 + 35*B6) >> 6; C8 = B8 + B11; C11 = B8 - B11; C9 = B9 + B10; C10 = B9 - B10; C12 = B12 + B15; C15 = B12 - B15; C13 = B13 + B14; C14 = B13 - B14;
//stage 4
D0 = (45*(C0 + C1)) >> 6; D1 = (45*(-C0 + C1)) >> 6; D2 = (24*C2 + 59*C3) >> 6; D3 = (-59*C2 + 24*C3) >> 6; D4 = C4 + C5; D5 = C4 - C5; D6 = -C6 + C7; D7 = C6 + C7; D8 = C8 + C14; D14 = C8 - C14; D9 = C9 + C15; D15 = C9 - C15; D10 = C10 + C11; D11 = C10 - C11; D12 = C12 + C13; D13 = C12 - C13;
//stage 5
E5 = (45*(D5 + D7)) >> 6; E7 = (45*(-D5 + D7)) >> 6; E8 = (24*D8 - 59*D9) >> 6; E9 = (59*D8 + 24*D9) >> 6; E11 = (45*(D11 + D12)) >> 6; E12 = (45*(-D11 + D12)) >> 6; E14 = (24*D14 - 59*D15) >> 6; E15 = (59*D14 + 24*D15) >> 6;
//
y0 = D0; y8 = -D1; y4 = D2; y12 = D3; y2 = D4; y6 = E5; y14 = D6; y10 = -E7; y3 = E8; y13 = E9; y9 = D10; y15 = E11; y1 = E12; y7 = D13; y11 = -E14; y5
이에 대응되는 16 포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y15은 역변환되어야 할 입력값, B0 내지 B15, C0 내지 C15, D0 내지 D15, E0 내지 E15, F0 내지 F15, G0 내지 G15은 중간값, X0 내지 X15는 역변환된 값을 나타낸다.
D0 = y0; D1 = -y8; D2 = y4; D3 = y12; D4 = y2; E5 = y6 ; D6 = y14; E7 = -y10; E8 = y3; E9 = y13; D10 = y9; E11 = y15; E12 = y1; D13 = y7; E14 = -y11; E15 = y5;
//stage 5
D5 = (45*(E5 - E7) >> 6); D7 = (45*(E5 + E7) >> 6); D8 = (24*E8 + 59*E9) >> 6; D9 = (-59*E8 + 24*E9) >> 6; D11 = (45*(E11 - E12) >> 6); D12 = (45*(E11 + E12) >> 6); D14 = (24*E14 + 59*E15) >> 6; D15 = (-59*E14 + 24*E15) >> 6;
//stage 4
C0 = (45*(D0 - D1) >> 6); C1 = (45*(D0 + D1) >> 6); C2 = (24*D2 - 59*D3) >> 6; C3 = (59*D2 + 24*D3) >> 6; C4 = D4 + D5; C5 = D4 - D5; C6 = -D6 + D7; C7 = D6 + D7; C8 = D8 + D14; C14 = D8 - D14; C9 = D9 + D15; C15 = D9 - D15; C10 = D10 + D11; C11 = D10 - D11; C12 = D12 + D13; C13 = D12 - D13;
//stage 3
B0 = C0 + C3; B3 = C0 - C3; B1 = C1 + C2; B2 = C1 - C2; B4 = (6*C4 - 31*C7) >> 5; B7 = (31*C4 + 6*C7) >> 5; B5 = (35*C5 - 53*C6) >> 6; B6 = (53*C5 + 35*C6) >> 6; B8 = C8 + C11; B11 = C8 - C11; B9 = C9 + C10; B10 = C9 - C10; B12 = C12 + C15; B15 = C12 - C15; B13 = C13 + C14; B14 = C13 - C14;
//stage 2
A0 = B0 + B7; A7 = B0 - B7; A1 = B1 + B6; A6 = B1 - B6; A2 = B2 + B5; A5 = B2 - B5; A3 = B3 + B4; A4 = B3 - B4; A8 = (49*B8 - 40*B15) >> 6; A15 = (40*B8 + 49*B15) >> 6; A9 = (30*B9 + 56*B14) >> 6; A14 = (-56*B9 + 30*B14) >> 6; A10 = (61*B10 - 18*B13) >> 6; A13 = (18*B10 + 61*B13) >> 6; A11 = (6*B11 + 63*B12) >> 6; A12 = (-63*B11 + 6*B12) >> 6;
//stage 1
x0 = A0 + A15; x1 = A1 + A14; x2 = A2 + A13; x3 = A3 + A12; x4 = A4 + A11; x5 = A5 + A10; x6 = A6 + A9; x7 = A7 + A8; x8 = A7 - A8; x9 = A6 - A9; x10 = A5 - A10; x11 = A4 - A11; x12 = A3 - A12; x13 = A2 - A13; x14 = A1 - A14; x15 = A0
전술한 도 104에 도시된 이산 코사인 변환에 기초하여, cos 및 sin 값을 분모가 2의 거듭제곱꼴인 형태로 치환하여 이산 코사인 변환을 수행하는 경우 전술한 도 3의 단계 350과 유사하게, 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬(Original_A)과 치환된 삼각함수 값을 이용한 변환 사이의 차이값을 보정하기 위한 스케일링 행렬 및 시프트 연산을 적용하여 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행할 수 있다.
본 발명의 또 다른 실시예에 따라서 16x16 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 105a 내지 도 105f와 같다. 16x16 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예는 도 106a 내지 도 106f와 같다.
한편, 본 발명의 또 다른 실시예에 따르면 스케일링 행렬(MF) 및 역스케일링 행렬(V)는 직접적인 디비젼을 통해 계산될 수 있다. 본 발명의 또 다른 실시예에 따른 16 포인트 이산 코사인 변환을 수행하는 행렬을 A라고 하면, 중간 행렬(S)의 i번째 행의 각 원소를 다음의 수학식;S(i)=1/sqrt(AAT(i,i)) 과 같이 정의한다. sqrt는 제곱근(square root) 함수를 의미한다. 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 곱한 행렬(SⓧST)을 PF라고 하면, 스케일링 행렬(MF)는 다음의 수학식; MF=PF*2^m/Qstep 과 같이 계산될 수 있다. 여기서, Qstep은 양자화 스텝, m은 양의 정수이다.
역스케일링 행렬(V)는 전술한 스케일링 행렬(MF)의 생성시에도 이용되는 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 각각 곱한 행렬(SⓧST)인 PF에 기초하여 생성될 수 있다. 구체적으로, 양자화 스텝을 Qstep, 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)동일 위치의 원소들을 각각 곱한 행렬을 PF, n은 양의 정수라고 할 때, 역스케일링 행렬(V)은 다음의 수학식; V=Qstep*PF*2^n 을 통해 획득된다.
도 107a 내지 도 107f는 본 발명의 또 다른 실시예에 따라서 16 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다. 도 107a 내지 도 107f에서 스케일링 행렬 계산시 m=10인 경우이다. 도 108a 내지 도 108f는 본 발명의 또 다른 실시예에 따라서 16 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다. 도 108a 내지 도 108f에서는 역스케일링 행렬 계산시 n=10인 경우를 나타낸다
또한, 도 104에 도시된 32 포인트 연산을 위한 원소들 중 삼각함수 sin 및 cos에 기초한 값들을 분모가 2의 거듭 제곱 형태인 다음의 유리수 값들로 대체하여 이용할 수 있다.
cos(pi*17/64) ~= 171/256; sin(pi*17/64) ~= 189/256; cos(pi*13/64) ~= 205/256; sin(pi*13/64) ~= 152/256; cos(pi*21/64) ~= 131/256; sin(pi*21/64) ~= 219/256; cos(pi*9/64) ~= 231/256; sin(pi*9/64) ~= 109/256; cos(pi*25/64) ~= 86/256; sin(pi*25/64) ~= 241/256; cos(pi*5/64) ~= 248/256; sin(pi*5/64) ~= 62/256; cos(pi*29/64) ~= 37/256; sin(pi*29/64) ~= 253/256; cos(pi*1/64) ~= 255/256; sin(pi*1/64) ~= 12/256; cos(pi*14/64) ~= 197/256; sin(pi*14/64) ~= 162/256; cos(pi*22/64) ~= 120/256; sin(pi*22/64) ~= 225/256; cos(pi*6/64) ~= 244/256; sin(pi*6/64) ~= 74/256; cos(pi*30/64) ~= 25/256; sin(pi*30/64) ~= 254/256; cos(pi*28/64) ~= 49/256; sin(pi*28/64) ~= 251/256; cos(pi*20/64) ~= 142/256; sin(pi*20/64) ~= 212/256; cos(pi*16/64) ~= 181/256; sin(pi*16/64) ~= 181/256; cos(pi*24/64) ~= 97/256; sin(pi*24/64) ~= 236/256; cos(pi*8/64) ~= 236/256; sin(pi*8/64) ~= 97/256; cos(pi*4/64) ~= 251/256; sin(pi*4/64) ~= 49/256; cos(pi*12/64) ~= 212/256; sin(pi*12/64) ~= 142/256;
이와 같이 대체된 cos 및 sin 값을 이용하여 도 104의 32포인트 이산 코사인 변환을 수행하는 단계는, X0 내지 X31은 변환되어야 할 입력값, A0 내지 Z31은 중간값, Y0 내지 Y31은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
//stage 0
Z0 = x0 + x31; Z31 = x0 - x31; Z1 = x1 + x30; Z30 = x1 - x30; Z2 = x2 + x29; Z29 = x2 - x29; Z3 = x3 + x28; Z28 = x3 - x28; Z4 = x4 + x27; Z27 = x4 - x27; Z5 = x5 + x26; Z26 = x5 - x26; Z6 = x6 + x25; Z25 = x6 - x25; Z7 = x7 + x24; Z24 = x7 - x24; Z8 = x8 + x23; Z23 = x8 - x23; Z9 = x9 + x22; Z22 = x9 - x22; Z10 = x10 + x21; Z21 = x10 - x21; Z11 = x11 + x20; Z20 = x11 - x20; Z12 = x12 + x19; Z19 = x12 - x19; Z13 = x13 + x18; Z18 = x13 - x18; Z14 = x14 + x17; Z17 = x14 - x17; Z15 = x15 + x16; Z16 = x15 - x16;
//stage 1
A0 = Z0 + Z15; A1 = Z1 + Z14; A2 = Z2 + Z13; A3 = Z3 + Z12; A4 = Z4 + Z11; A5 = Z5 + Z10; A6 = Z6 + Z9; A7 = Z7 + Z8; A8 = Z7 - Z8; A9 = Z6 - Z9; A10 = Z5 - Z10; A11 = Z4 - Z11; A12 = Z3 - Z12; A13 = Z2 - Z13; A14 = Z1 - Z14; A15 = Z0 - Z15; A16 = (171*Z16 - 189*Z31) >> 8; A31 = (189*Z16 + 171*Z31) >> 8; A17 = (205*Z17 + 152*Z30) >> 8; A30 = (-152*Z17 + 205*Z30) >> 8; A18 = (131*Z18 - 219*Z29) >> 8; A29 = (219*Z18 + 131*Z29) >> 8; A19 = (231*Z19 + 109*Z28) >> 8; A28 = (-109*Z19 + 231*Z28) >> 8; A20 = (86*Z20 - 241*Z27) >> 8; A27 = (241*Z20 + 86*Z27) >> 8; A21 = (248*Z21 + 62*Z26) >> 8; A26 = (-62*Z21 + 248*Z26) >> 8; A22 = (37*Z22 - 253*Z25) >> 8; A25 = (253*Z22 + 37*Z25) >> 8; A23 = (255*Z23 + 12*Z24) >> 8; A24 = (-12*Z23 + 255*Z24) >> 8;
//stage 2
B0 = A0 + A7; B7 = A0 - A7; B1 = A1 + A6; B6 = A1 - A6; B2 = A2 + A5; B5 = A2 - A5; B3 = A3 + A4; B4 = A3 - A4; B8 = (197*A8 + 162*A15) >> 8; B15 = (-162*A8 + 197*A15) >> 8; B9 = (120*A9 - 225*A14) >> 8; B14 = (225*A9 + 120*A14) >> 8; B10 = (244*A10 + 74*A13) >> 8; B13 = (-74*A10 + 244*A13) >> 8; B11 = (25*A11 - 254*A12) >> 8; B12 = (254*A11 + 25*A12) >> 8; B16 = A16 + A23; B23 = A16 - A23; B17 = A17 + A22; B22 = A17 - A22; B18 = A18 + A21; B21 = A18 - A21; B19 = A19 + A20; B20 = A19 - A20; B24 = A24 + A31; B31 = A24 - A31; B25 = A25 + A30; B30 = A25 - A30; B26 = A26 + A29; B29 = A26 - A29; B27 = A27 + A28; B28 = A27 - A28;
//stage 3
C0 = B0 + B3; C3 = B0 - B3; C1 = B1 + B2; C2 = B1 - B2; C4 = (49*B4 + 251*B7) >> 8; C7 = (-251*B4 + 49*B7) >> 8; C5 = (142*B5 + 212*B6) >> 8; C6 = (-212*B5 + 142*B6) >> 8; C8 = B8 + B11; C11 = B8 - B11; C9 = B9 + B10; C10 = B9 - B10; C12 = B12 + B15; C15 = B12 - B15; C13 = B13 + B14; C14 = B13 - B14; C16 = B16 + B28; C28 = B16 - B28; C17 = B17 + B29; C29 = B17 - B29; C18 = B18 + B30; C30 = B18 - B30; C19 = B19 + B31; C31 = B19 - B31; C20 = B20 + B23; C23 = B20 - B23; C21 = B21 + B22; C22 = B21 - B22; C24 = B24 + B27; C27 = B24 - B27; C25 = B25 + B26; C26 = B25 - B26;
//stage 4
D0 = (181*(C0 + C1)) >> 8; D1 = (181*(-C0 +C1)) >> 8; D2 = (97*C2 + 236*C3) >> 8; D3 = (-236*C2 + 97*C3) >> 8; D4 = C4 + C5; D5 = C4 - C5; D6 = -C6 + C7; D7 = C6 + C7; D8 = C8 + C14; D14 = C8 - C14; D9 = C9 + C15; D15 = C9 - C15; D10 = C10 + C11; D11 = C10 - C11; D12 = C12 + C13; D13 = C12 - C13; D16 = (181*(C16 + C19)) >> 8; D19 = (181*(-C16 + C19)) >> 8; D20 = C20 + C26; D26 = C20 - C26; D21 = C21 + C27; D27 = C21 - C27; D22 = C22 + C23; D23 = C22 - C23; D24 = C24 + C25; D25 = C24 - C25; D28 = (181*(C28 + C31)) >> 8; D31 = (181*(-C28 + C31)) >> 8;
//stage 5
E5 = (181*(D5 + D7)) >> 8; E7 = (181*(-D5 + D7)) >> 8; E8 = (97*D8 - 236*D9) >> 8; E9 = (236*D8 + 97*D9) >> 8; E11 = (181*(D11 + D12)) >> 8; E12 = (181*(-D11 + D12)) >> 8; E14 = (97*D14 - 236*D15) >> 8; E15 = (236*D14 + 97*D15) >> 8; E16 = D16 + C18; E18 = D16 - C18; E17 = C17 + D19; E19 = C17 - D19; E20 = (236*D20 + 97*D21) >> 8; E21 = (-97*D20 + 236*D21) >> 8; E23 = (181*(D23 + D24)) >> 8; E24 = (181*(-D23 + D24)) >> 8; E26 = (236*D26 + 97*D27) >> 8; E27 = (-97*D26 + 236*D27) >> 8; E28 = - D28 + C30; E30 = D28 + C30; E29 = - C29 + D31; E31 = C29 + D31;
//stage 6
F16 = (251*E16 - 49*E17) >> 8; F17 = (49*E16 + 251*E17) >> 8; F18 = (212*E18 - 142*E19) >> 8; F19 = (142*E18 + 212*E19) >> 8; F28 = (212*E28 - 142*E29) >> 8; F29 = (142*E28 + 212*E29) >> 8; F30 = (251*E30 - 49*E31) >> 8; F31 = (49*E30 + 251*E31) >> 8;
y0 = D0; y1 = E24; y2 = E12; y3 = -F16; y4 = D4; y5 = F31; y6 = E8; y7 = -E26; y8 = D2; y9 = E21; y10 = E15; y11 = F29; y12 = E5; y13 = -F18; y14 = D13; y15 = D22; y16 = -D1; y17 = D25; y18 = D10; y19 = -F19; y20 = -E7; y21 = -F28; y22 = -E14; y23 = -E20; y24 = D3; y25 = -E27; y26 = E9; y27 = -F30; y28 = D6; y29 = -F17; y30 = E11; y31 = -E23;
이에 대응되는 32 포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y31은 역변환되어야 할 입력값, A0 내지 G31은 중간값, X0 내지 X31은 역변환된 값을 나타낸다.
D0= y0; E24 = y1; E12 = y2; F16 = -y3; D4 = y4; F31 = y5; E8 = y6; E26 = -y7; D2 = y8; E21 = y9; E15 = y10; F29 = y11; E5 = y12; F18 = -y13; D13 = y14; D22 = y15; D1 = -y16; D25 = y17; D10 = y18; F19 = -y19; E7 = -y20; F28 = -y21 ; E14 = -y22; E20 = -y23; D3 = y24; E27 = -y25; E9 = y26; F30 = -y27; D6 = y28; F17 = -y29 ; E11 = y30; E23 = -y31;
//stage 6
E16 = (251*F16 + 49*F17) >> 8; E17 = (-49*F16 + 251*F17) >> 8; E18 = (212*F18 + 142*F19) >> 8; E19 = (-142*F18 + 212*F19) >> 8; E28 = (212*F28 + 142*F29) >> 8; E29 = (-142*F28 + 212*F29) >> 8; E30 = (251*F30 + 49*F31) >> 8; E31 = (-49*F30 + 251*F31) >> 8;
//stage 5
D5 = (181*(E5 - E7)) >> 8; D7 = (181*(E5 + E7)) >> 8; D8 = (97*E8 + 236*E9) >> 8; D9 = (-236*E8 + 97*E9) >> 8; D11 = (181*(E11 - E12)) >> 8; D12 = (181*(E11 + E12)) >> 8; D14 = (97*E14 + 236*E15) >> 8; D15 = (-236*E14 + 97*E15) >> 8; D16 = E16 + E18; C18 = E16 - E18; C17 = E17 + E19; D19 = E17 - E19; D20 = (236*E20 - 97*E21) >> 8; D21 = (97*E20 + 236*E21) >> 8; D23 = (181*(E23 - E24)) >> 8; D24 = (181*(E23 + E24)) >> 8; D26 = (236*E26 - 97*E27) >> 8; D27 = (97*E26 + 236*E27) >> 8; D28 = - E28 + E30; C30 = E28 + E30; C29 = - E29 + E31; D31 = E29 + E31;
//stage 4
C0 = (181*(D0 - D1)) >> 8; C1 = (181*(D0 + D1)) >> 8; C2 = (97*D2 - 236*D3) >> 8; C3 = (236*D2 + 97*D3) >> 8; C4 = D4 + D5; C5 = D4 - D5; C6 = -D6 + D7; C7 = D6 + D7; C8 = D8 + D14; C14 = D8 - D14; C9 = D9 + D15; C15 = D9 - D15; C10 = D10 + D11; C11 = D10 - D11; C12 = D12 + D13; C13 = D12 - D13; C16 = (181*(D16 - D19)) >> 8; C19 = (181*(D16 + D19)) >> 8; C20 = D20 + D26; C26 = D20 - D26; C21 = D21 + D27; C27 = D21 - D27; C22 = D22 + D23; C23 = D22 - D23; C24 = D24 + D25; C25 = D24 - D25; C28 = (181*(D28 - D31)) >> 8; C31 = (181*(D28 + D31)) >> 8;
//stage 3
B0 = C0 + C3; B3 = C0 - C3; B1 = C1 + C2; B2 = C1 - C2; B4 = (49*C4 - 251*C7) >> 8; B7 = (251*C4 + 49*C7) >> 8; B5 = (142*C5 - 212*C6) >> 8; B6 = (212*C5 + 142*C6) >> 8; B8 = C8 + C11; B11 = C8 - C11; B9 = C9 + C10; B10 = C9 - C10; B12 = C12 + C15; B15 = C12 - C15; B13 = C13 + C14; B14 = C13 - C14; B16 = C16 + C28; B28 = C16 - C28; B17 = C17 + C29; B29 = C17 - C29; B18 = C18 + C30; B30 = C18 - C30; B19 = C19 + C31; B31 = C19 - C31; B20 = C20 + C23; B23 = C20 - C23; B21 = C21 + C22; B22 = C21 - C22; B24 = C24 + C27; B27 = C24 - C27; B25 = C25 + C26; B26 = C25 - C26;
//stage 2
A0 = B0 + B7; A7 = B0 - B7; A1 = B1 + B6; A6 = B1 - B6; A2 = B2 + B5; A5 = B2 - B5; A3 = B3 + B4; A4 = B3 - B4; A8 = (197*B8 - 162*B15) >> 8; A15 = (162*B8 + 197*B15) >> 8; A9 = (120*B9 + 225*B14) >> 8; A14 = (-225*B9 + 120*B14) >> 8; A10 = (244*B10 - 74*B13) >> 8; A13 = (74*B10 + 244*B13) >> 8; A11 = (25*B11 + 254*B12) >> 8; A12 = (-254*B11 + 25*B12) >> 8; A16 = B16 + B23; A23 = B16 - B23; A17 = B17 + B22; A22 = B17 - B22; A18 = B18 + B21; A21 = B18 - B21; A19 = B19 + B20; A20 = B19 - B20; A24 = B24 + B31; A31 = B24 - B31; A25 = B25 + B30; A30 = B25 - B30; A26 = B26 + B29; A29 = B26 - B29; A27 = B27 + B28; A28 = B27 - B28;
//stage 1
Z0 = A0 + A15; Z1 = A1 + A14; Z2 = A2 + A13; Z3 = A3 + A12; Z4 = A4 + A11; Z5 = A5 + A10; Z6 = A6 + A9; Z7 = A7 + A8; Z8 = A7 - A8; Z9 = A6 - A9; Z10 = A5 - A10; Z11 = A4 - A11; Z12 = A3 - A12; Z13 = A2 - A13; Z14 = A1 - A14; Z15 = A0 - A15; Z16 = (171*A16 + 189*A31) >> 8; Z31 = (-189*A16 + 171*A31) >> 8; Z17 = (205*A17 - 152*A30) >> 8; Z30 = (152*A17 + 205*A30) >> 8; Z18 = (131*A18 + 219*A29) >> 8; Z29 = (-219*A18 + 131*A29) >> 8; Z19 = (231*A19 - 109*A28) >> 8; Z28 = (109*A19 + 231*A28) >> 8; Z20 = (86*A20 + 241*A27) >> 8; Z27 = (-241*A20 + 86*A27) >> 8; Z21 = (248*A21 - 62*A26) >> 8; Z26 = (62*A21 + 248*A26) >> 8; Z22 = (37*A22 + 253*A25) >> 8; Z25 = (-253*A22 + 37*A25) >> 8; Z23 = (255*A23 - 12*A24) >> 8; Z24 = (12*A23 + 255*A24) >> 8;
x0 = Z0 + Z31; x31 = Z0 - Z31; x1 = Z1 + Z30; x30 = Z1 - Z30; x2 = Z2 + Z29; x29 = Z2 - Z29; x3 = Z3 + Z28; x28 = Z3 - Z28; x4 = Z4 + Z27; x27 = Z4 - Z27; x5 = Z5 + Z26; x26 = Z5 - Z26; x6 = Z6 + Z25; x25 = Z6 - Z25; x7 = Z7 + Z24; x24 = Z7 - Z24; x8 = Z8 + Z23; x23 = Z8 - Z23; x9 = Z9 + Z22; x22 = Z9 - Z22; x10 = Z10 + Z21; x21 = Z10 - Z21; x11 = Z11 + Z20; x20 = Z11 - Z20; x12 = Z12 + Z19; x19 = Z12 - Z19; x13 = Z13 + Z18; x18 = Z13 - Z18; x14 = Z14 + Z17; x17 = Z14 - Z17; x15 = Z15 + Z16; x16 = Z15 - Z16;
전술한 도 104에 도시된 32 포인트 이산 코사인 변환에 기초하여, cos 및 sin 값을 분모가 2의 거듭제곱꼴인 형태로 치환하여 이산 코사인 변환을 수행하는 경우 전술한 도 3의 단계 350과 유사하게, 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬(Original_A)과 치환된 삼각함수 값을 이용한 변환 사이의 차이값을 보정하기 위한 스케일링 행렬 및 시프트 연산을 적용하여 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행할 수 있다.
본 발명의 또 다른 실시예에 따라서 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 109a 내지 도 109f와 같다. 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예는 도 110a 내지 도 110f와 같다.
32 포인트 변환에 대해서 스케일링 행렬(MF) 및 역스케일링 행렬(V)를 직접적인 디비젼을 통해 계산하는 경우에는 전술한 도 109 및 도 110과 거의 유사한 스케일링 행렬 및 역스케일링 행렬이 획득된다. 구체적으로, 본 발명의 또 다른 실시예에 따른 32 포인트 이산 코사인 변환을 수행하는 행렬을 A라고 하면, 중간 행렬(S)의 i번째 행의 각 원소를 다음의 수학식;S(i)=1/sqrt(AAT(i,i)) 과 같이 정의한다. sqrt는 제곱근(square root) 함수를 의미한다. 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 곱한 행렬(SⓧST)을 PF라고 하면, 스케일링 행렬(MF)는 다음의 수학식; MF=PF*2^m/Qstep 과 같이 계산될 수 있다. 여기서, Qstep은 양자화 스텝, m은 양의 정수이다. 역스케일링 행렬(V)는 전술한 스케일링 행렬(MF)의 생성시에도 이용되는 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 각각 곱한 행렬(SⓧST)인 PF에 기초하여 생성될 수 있다. 구체적으로, 양자화 스텝을 Qstep, 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)동일 위치의 원소들을 각각 곱한 행렬을 PF, n은 양의 정수라고 할 때, 역스케일링 행렬(V)은 다음의 수학식; V=Qstep*PF*2^n 을 통해 획득된다.
도 111a 내지 도 111f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다. 도 111a 내지 도 111f에서 스케일링 행렬 계산시 m=10인 경우이다. 도 112a 내지 도 112f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다. 도 108a 내지 도 108f에서는 역스케일링 행렬 계산시 n=10인 경우를 나타낸다
전술한 도 104에 기초한 16 포인트 또는 32 포인트 변환 및 역변환 과정은 곱셈을 포함하지 않는 형태로 변경될 수 있다. 구체적으로, 각 변환 과정은 분모가 2의 거듭 제곱꼴인 유리수(dyadic rational)와 중간값들의 곱으로 표현될 수 있다. 도 113a는 16x16 변환에 이용되는 곱셈의 대체 연산 과정, 도 113b는 32x32 변환에 이용되는 곱셈의 대체 연산 과정을 나타낸다. 일 예로, 도 104에 기초한 16 포인트 이산 코사인 변환시에 첫 번째 표시된 49*x와 같은 연산은 (X<<5)+(x<<4)+x와 같이 쉬프트 연산 및 덧셈 연산만으로 대체될 수 있다.
한편, 전술한 바와 같이 곱셈 연산을 쉬프트 연산으로 대체하는 과정은 변환 및 역변환에 이용되는 값의 분모(denominator)를 고려하여 추가적인 연산을 줄일 수 있다. 도 104에 기초한 16 포인트 이산 코사인 변환에 이용되는 곱셈 연산은 도 114a에 도시된 테이블에 따라서 곱셈이 생략된 연산 형태로 대체될 수 있다. 또한, 도 104에 기초한 32 포인트 이산 코사인 변환에 이용되는 곱셈 연산은 도 114b에 도시된 테이블에 따라서 곱셈이 생략된 연산 형태로 대체될 수 있다.
한편, 전술한 도 104에 기초한 이산 코사인 변환에 포함된 버터 플라이 구조의 연산 과정은 도 20에 도시된 바와 같은 변경된 버터 플라이 구조의 연산으로 대체될 수 있다. 즉,버터 플라이 구조의 연산은 입력값 [X1,X2]에 대해서 다음의 수학식;
Figure pat00010
과 같은 연산을 통해 출력값 [Y1, Y2]를 출력하는 것인데, 이러한 버터 플라이 구조의 연산은 실질적으로 회전(rotation) 변환에 해당된다. 이러한 버터 플라이 구조의 연산은 다음의 수학식 4와 같이 대체될 수 있다.
Figure pat00011
수학식 4에서 p=(cosθ-1)/sinθ. u=sinθ이다. 따라서, 도 104에 구비된 버터 플라이 구조의 연산 과정은 수학식 4와 같은 도 20의 변경된 버터 플라이 구조로 대체될 수 있다. 변경된 버터 플라이 구조를 포함하는 도 104의 이산 코사인 변환에 이용되는 cos 및 sin 함수에 기초한 값들을 분모가 2의 거듭제곱 형태인 유리수(dyadic rational)로 치환한다. 구체적으로, 16 포인트 이산 코사인 변환에 이용되는 cos 및 sin 값들은 다음과 같이 우측의 분모가 2의 거듭제곱 형태인 유리수로 치환되어 치환된 값을 대신 이용될 수 있다.
(cos(pi*7/32) - 1)/sin(pi*7/32) ~= -22/64; sin(pi*7/32) ~= 40/64; (cos(pi*11/32) - 1)/sin(pi*11/32) ~= -38/64; sin(pi*11/32) ~= 56/64; (cos(pi*3/32) - 1)/sin(pi*3/32) ~= -9/64; sin(pi*3/32) ~= 18/64; (cos(pi*15/32) - 1)/sin(pi*15/32) ~= -58/64; sin(pi*15/32) ~= 63/64; (cos(pi*7/16) - 1)/sin(pi*7/16) ~= -52/64; sin(pi*7/16) ~= 62/64; (cos(pi*5/16) - 1)/sin(pi*5/16) ~= -34/64; sin(pi*5/16) ~= 53/64; cot(pi*3/8) ~= 26/64; sin(pi*3/8)*cos(pi*3/8) ~= 22/64;
32 포인트 이산 코사인 변환에 이용되는 cos 및 sin 값들은 다음처럼 분모가 2의 거듭제곱 형태인 유리수로 치환될 수 있다.
(cos(pi*17/64) - 1)/sin(pi*17/64) = -113/256; sin(pi*17/64) = 189/256; (cos(pi*13/64) - 1)/sin(pi*13/64) = -84/256; sin(pi*13/64) = 152/256; (cos(pi*21/64) - 1)/sin(pi*21/64) = -145/256; sin(pi*21/64) = 219/256; (cos(pi*9/64) - 1)/sin(pi*9/64) = -57/256; sin(pi*9/64) = 109/256; (cos(pi*25/64) - 1)/sin(pi*25/64) = -180/256; sin(pi*25/64) = 241/256; (cos(pi*5/64) - 1)/sin(pi*5/64) = -31/256; sin(pi*5/64) = 62/256; (cos(pi*29/64) - 1)/sin(pi*29/64) = -220/256; sin(pi*29/64) = 253/256; (cos(pi/64) - 1)/sin(pi/64) = -6/256; sin(pi*1/64) = 12/256; (cos(pi*14/64) - 1)/sin(pi*14/64) = -91/256; sin(pi*14/64) = 162/256; (cos(pi*22/64) - 1)/sin(pi*22/64) = -153/256; sin(pi*22/64) = 225/256; (cos(pi*6/64) - 1)/sin(pi*6/64) = -37/256; sin(pi*6/64) = 74/256; (cos(pi*30/64) - 1)/sin(pi*30/64) = -232/256; sin(pi*30/64) = 254/256; (cos(pi*28/64) - 1)/sin(pi*28/64) = -210/256; sin(pi*28/64) = 251/256; (cos(pi*20/64) - 1)/sin(pi*20/64) = -136/256; sin(pi*20/64) = 212/256; (cos(pi*16/64) - 1)/sin(pi*16/64) = -106/256; sin(pi*16/64) = 181/256; cot(pi*24/64) = 106/256; sin(pi*24/64)*cos(pi*24/64) = 90/256; tan(pi*8/64) = 106/256; sin(pi*8/64)*cos(pi*8/64) = 90/256; tan(pi*4/64) = 50/256; sin(pi*4/64)*cos(pi*4/64) = 48/256; tan(pi*12/64) = 171/256; sin(pi*12/64)*cos(pi*12/64) = 118/256;
도 104의 16 포인트 이산 코사인 변환의 버터 플라이 구조를 수학식 4를 이용하여 대체하는 한편, 각 삼각함수 값을 전술한 바와 같이 분모가 2의 거듭제곱꼴인 유리수로 치환하는 경우, 16 포인트 이산 코사인 변환 과정은 다음의 연산 과정을 통해 수행될 수 있다. X0 내지 X15은 변환되어야 할 입력값, B0 내지 B15, C0 내지 C15, D0 내지 D15, E0 내지 E15, F0 내지 F15, G0 내지 G15은 중간값, Y0 내지 Y15은 변환된 값을 나타낸다.
// stage 1
A0 = x0 + x15; A1 = x1 + x14; A2 = x2 + x13; A3 = x3 + x12; A4 = x4 + x11; A5 = x5 + x10; A6 = x6 + x9; A7 = x7 + x8; A8 = x7 - x8; A9 = x6 - x9; A10 = x5 - x10; A11 = x4 - x11; A12 = x3 - x12; A13 = x2 - x13; A14 = x1 - x14; A15 = x0 - x15;
//stage 2
B0 = A0 + A7; B7 = A0 - A7; B1 = A1 + A6; B6 = A1 - A6; B2 = A2 + A5; B5 = A2 - A5; B3 = A3 + A4; B4 = A3 - A4; B8 = A8 + (22*A15 >> 6); B15 = A15 - (40*B8 >> 6); B8 = B8 + (22*B15 >> 6); B9 = A9 - (38*A14 >> 6); B14 = A14 + (56*B9 >> 6); B9 = B9 - (38*B14 >> 6); B10 = A10 + (9*A13 >> 6); B13 = A13 - (18*B10 >> 6); B10 = B10 + (9*B13 >> 6); B11 = A11 - (58*A12 >> 6); B12 = A12 + (63*B11 >> 6); B11 = B11 - (58*B12 >> 6);
//stage 3
C0 = B0 + B3; C3 = B0 - B3; C1 = B1 + B2; C2 = B1 - B2; C4 = B4 + (52*B7 >> 6); C7 = B7 - (62*C4 >> 6); C4 = C4 + (52*C7 >> 6); C5 = B5 + (34*B6 >> 6); C6 = B6 - (53*C5 >> 6); C5 = C5 + (34*C6 >> 6); C8 = B8 + B11; C11 = B8 - B11; C9 = B9 + B10; C10 = B9 - B10; C12 = B12 + B15; C15 = B12 - B15; C13 = B13 + B14; C14 = B13 - B14;
//stage 4
D0 = C0 + C1; D1 = C1 - 1/2*D0; D3 = C2 - (26*C3 >> 6); D2 = (C3 + (22*D3 >> 6)); D3 = -D3; D4 = C4 + C5; D5 = C4 - C5; D6 = -C6 + C7; D7 = C6 + C7; D8 = C8 + C14; D14 = C8 - C14; D9 = C9 + C15; D15 = C9 - C15; D10 = C10 + C11; D11 = C10 - C11; D12 = C12 + C13; D13 = C12 - C13;
//stage 5
E5 = D5 + D7; E7 = D7 - 1/2*E5; E9 = D8 + (26*D9 >> 6); E8 = -(D9 - (22*E9 >> 6)); E11 = D11 + D12; E12 = D12 - 1/2*E11; E15 = D14 + (26*D15 >> 6); E14 = -(D15 - (22*E15 >> 6));
y0 = D0; y1 = E12; y2 = D4; y3 = E8; y4 = D2; y5 = E15; y6 = E5; y7 = D13; y8 = -D1; y9 = D10; y10 = -E7; y11 = -E14; y12 = D3; y13 = E9; y14 = D6; y15 = E11;
대응되는 16포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y15은 역변환되어야 할 입력값, A0 내지 G15은 중간값, X0 내지 X15은 역변환된 값을 나타낸다.
D0 = y0; E12 = y1; D4 = y2; E8 = y3; D2 = y4; E15 = y5; E5 = y6; D13 = y7; D1 = -y8; D10 = y9; E7 = -y10; E14 = -y11; D3 = y12; E9 = y13; D6 = y14; E11 = y15;
//stage 5
D7 = E7 + 1/2*E5; D5 = E5 - D7; D9 = -E8 + (22*E9 >> 6); D8 = E9 - (26*D9 >> 6); D12 = E12 + 1/2*E11; D11 = E11 - D12; D15 = -E14 + (22*E15 >> 6); D14 = E15 - (26*D15 >> 6);
//stage 4
C1 = D1 + 1/2*D0; C0 = D0 - C1; D3 = -D3; C3 = D2 - (22*D3 >> 6); C2 = D3 + (26*C3 >> 6); C4 = D4 + D5; C5 = D4 - D5; C6 = -D6 + D7; C7 = D6 + D7;C8 = D8 + D14; C14 = D8 - D14; C9 = D9 + D15; C15 = D9 - D15; C10 = D10 + D11; C11 = D10 - D11; C12 = D12 + D13; C13 = D12 - D13;
//stage 3
B0 = C0 + C3; B3 = C0 - C3; B1 = C1 + C2; B2 = C1 - C2; C4 = C4 - (52*C7 >> 6); B7 = C7 + (62*C4 >> 6); B4 = C4 - (52*B7 >> 6); C5 = C5 - (34*C6 >> 6); B6 = C6 + (53*C5 >> 6); B5 = C5 - (34*B6 >> 6); B8 = C8 + C11; B11 = C8 - C11; B9 = C9 + C10; B10 = C9 - C10; B12 = C12 + C15; B15 = C12 - C15; B13 = C13 + C14; B14 = C13 - C14;
//stage 2
A0 = B0 + B7; A7 = B0 - B7; A1 = B1 + B6; A6 = B1 - B6; A2 = B2 + B5; A5 = B2 - B5; A3 = B3 + B4; A4 = B3 - B4; B8 = B8 - (22*B15 >> 6); A15 = B15 + (40*B8 >> 6); A8 = B8 - (22*A15 >> 6); B9 = B9 + (38*B14 >> 6); A14 = B14 - (56*B9 >> 6); A9 = B9 + (38*A14 >> 6); B10 = B10 - (9*B13 >> 6); A13 = B13 + (18*B10 >> 6); A10 = B10 - (9*A13 >> 6); B11 = B11 + (58*B12 >> 6); A12 = B12 - (63*B11 >> 6); A11 = B11 + (58*A12 >> 6);
//stage 1
x0 = A0 + A15; x1 = A1 + A14; x2 = A2 + A13; x3 = A3 + A12; x4 = A4 + A11; x5 = A5 + A10; x6 = A6 + A9; x7 = A7 + A8; x8 = A7 - A8; x9 = A6 - A9; x10 = A5 - A10; x11 = A4 - A11; x12 = A3 - A12; x13 = A2 - A13; x14 = A1 - A14; x15 = A0 - A15;
전술한 도 104에 도시된 16 포인트 이산 코사인 변환에 기초하여, 버터플라이 구조를 수학식 4와 같이 변경하고 삼각함수값을 분모가 2의 거듭제곱꼴인 형태로 치환하여 이산 코사인 변환을 수행하는 경우 전술한 도 3의 단계 350과 유사하게, 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬(Original_A)과 치환된 삼각함수 값을 이용한 변환 사이의 차이값을 보정하기 위한 스케일링 행렬 및 시프트 연산을 적용하여 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행할 수 있다.
본 발명의 또 다른 실시예에 따라서 16 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 115a 내지 도 115f와 같다. 16 포인트 역 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예는 도 116a 내지 도 116f와 같다. 여기서, 전술한 역스케일링 행렬(V)를 구하는 방식과 다르게 다음의 수학식; V=Qstep./*PF*2^n/64 에 따라서 역스케일링 행렬이 계산된다.
16 포인트 이산 코사인 변환에 대해서 스케일링 행렬(MF) 및 역스케일링 행렬(V)를 직접적인 디비젼을 통해 계산하는 경우에는 전술한 도 115 및 도 116과 거의 유사한 스케일링 행렬 및 역스케일링 행렬이 획득된다. 구체적으로, 본 발명의 또 다른 실시예에 따른 16 포인트 이산 코사인 변환을 수행하는 행렬을 A라고 하면, 중간 행렬(S)의 i번째 행의 각 원소를 다음의 수학식;S(i)=1/sqrt(AAT(i,i)) 과 같이 정의한다. sqrt는 제곱근(square root) 함수를 의미한다. 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 곱한 행렬(SⓧST)을 PF라고 하면, 스케일링 행렬(MF)는 다음의 수학식; MF=PF*2^m/Qstep 과 같이 계산될 수 있다. 여기서, Qstep은 양자화 스텝, m은 양의 정수이다. 역스케일링 행렬(V)는 전술한 스케일링 행렬(MF)의 생성시에도 이용되는 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 각각 곱한 행렬(SⓧST)인 PF에 기초하여 생성될 수 있다. 구체적으로, 양자화 스텝을 Qstep, 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)동일 위치의 원소들을 각각 곱한 행렬을 PF, n은 양의 정수라고 할 때, 역스케일링 행렬(V)은 다음의 수학식; V=Qstep./*PF*2^n/64 을 통해 획득된다.
도 117a 내지 도 117f는 본 발명의 또 다른 실시예에 따라서 16 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다. 도 117a 내지 도 117f에서 스케일링 행렬 계산시 m=10인 경우이다. 도 118a 내지 도 118f는 본 발명의 또 다른 실시예에 따라서 16 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다. 도 118a 내지 도 118f에서는 역스케일링 행렬 계산시 n=10인 경우를 나타낸다
도 104의 32 포인트 이산 코사인 변환의 버터 플라이 구조를 수학식 4를 이용하여 대체하는 한편, 각 삼각함수 값을 전술한 바와 같이 분모가 2의 거듭제곱꼴인 유리수로 치환하는 경우, 32 포인트 이산 코사인 변환 과정은 다음의 연산 과정을 통해 수행될 수 있다. X0 내지 X31은 변환되어야 할 입력값, A0 내지 Z31은 중간값, Y0 내지 Y31은 변환된 값을 나타낸다.
//stage 0
Z0 = x0 + x31; Z31 = x0 - x31; Z1 = x1 + x30; Z30 = x1 - x30; Z2 = x2 + x29; Z29 = x2 - x29; Z3 = x3 + x28; Z28 = x3 - x28; Z4 = x4 + x27; Z27 = x4 - x27; Z5 = x5 + x26; Z26 = x5 - x26; Z6 = x6 + x25; Z25 = x6 - x25; Z7 = x7 + x24; Z24 = x7 - x24; Z8 = x8 + x23; Z23 = x8 - x23; Z9 = x9 + x22; Z22 = x9 - x22; Z10 = x10 + x21; Z21 = x10 - x21; Z11 = x11 + x20; Z20 = x11 - x20; Z12 = x12 + x19; Z19 = x12 - x19; Z13 = x13 + x18; Z18 = x13 - x18; Z14 = x14 + x17; Z17 = x14 - x17; Z15 = x15 + x16; Z16 = x15 - x16;
//stage 1
A0 = Z0 + Z15; A1 = Z1 + Z14; A2 = Z2 + Z13; A3 = Z3 + Z12; A4 = Z4 + Z11; A5 = Z5 + Z10; A6 = Z6 + Z9; A7 = Z7 + Z8; A8 = Z7 - Z8; A9 = Z6 - Z9; A10 = Z5 - Z10; A11 = Z4 - Z11; A12 = Z3 - Z12; A13 = Z2 - Z13; A14 = Z1 - Z14; A15 = Z0 - Z15; A16 = Z16 - ZTrRound(113*Z31 >> 8); A31 = Z31 + ZTrRound(189*A16 >> 8); A16 = A16 - ZTrRound(113*A31 >> 8); A17 = Z17 + ZTrRound(84*Z30 >> 8); A30 = Z30 - ZTrRound(152*A17 >> 8); A17 = A17 + ZTrRound(84*A30 >> 8); A18 = Z18 - ZTrRound(145*Z29 >> 8); A29 = Z29 + ZTrRound(219*A18 >> 8); A18 = A18 - ZTrRound(145*A29 >> 8); A19 = Z19 + ZTrRound(57*Z28 >> 8); A28 = Z28 - ZTrRound(109*A19 >> 8); A19 = A19 + ZTrRound(57*A28 >> 8); A20 = Z20 - ZTrRound(180*Z27 >> 8); A27 = Z27 + ZTrRound(241*A20 >> 8); A20 = A20 - ZTrRound(180*A27 >> 8); A21 = Z21 + ZTrRound(31*Z26 >> 8); A26 = Z26 - ZTrRound(62*A21 >> 8); A21 = A21 + ZTrRound(31*A26 >> 8); A22 = Z22 - ZTrRound(220*Z25 >> 8); A25 = Z25 + ZTrRound(253*A22 >> 8); A22 = A22 - ZTrRound(220*A25 >> 8); A23 = Z23 + ZTrRound(6*Z24 >> 8); A24 = Z24 - ZTrRound(12*A23 >> 8); A23 = A23 + ZTrRound(6*A24 >> 8);
//stage 2
B0 = A0 + A7; B7 = A0 - A7; B1 = A1 + A6; B6 = A1 - A6; B2 = A2 + A5; B5 = A2 - A5; B3 = A3 + A4; B4 = A3 - A4; B8 = A8 + (91*A15 >> 8); B15 = A15 - (162*B8 >> 8); B8 = B8 + (91*B15 >> 8); B9 = A9 - (153*A14 >> 8); B14 = A14 + (225*B9 >> 8); B9 = B9 - (153*B14 >> 8); B10 = A10 + (37*A13 >> 8); B13 = A13 - (74*B10 >> 8); B10 = B10 + (37*B13 >> 8); B11 = A11 - (232*A12 >> 8); B12 = A12 + (254*B11 >> 8); B11 = B11 - (232*B12 >> 8); B16 = A16 + A23; B23 = A16 - A23; B17 = A17 + A22; B22 = A17 - A22; B18 = A18 + A21; B21 = A18 - A21; B19 = A19 + A20; B20 = A19 - A20; B24 = A24 + A31; B31 = A24 - A31; B25 = A25 + A30; B30 = A25 - A30; B26 = A26 + A29; B29 = A26 - A29; B27 = A27 + A28; B28 = A27 - A28;
//stage 3
C0 = B0 + B3; C3 = B0 - B3; C1 = B1 + B2; C2 = B1 - B2; C4 = B4 + (210*B7 >> 8); C7 = B7 - (251*C4 >> 8); C4 = C4 + (210*C7 >> 8); C5 = B5 + (136*B6 >> 8); C6 = B6 - (212*C5 >> 8); C5 = C5 + (136*C6 >> 8); C8 = B8 + B11; C11 = B8 - B11; C9 = B9 + B10; C10 = B9 - B10; C12 = B12 + B15; C15 = B12 - B15; C13 = B13 + B14; C14 = B13 - B14; C16 = B16 + B28; C28 = B16 - B28; C17 = B17 + B29; C29 = B17 - B29; C18 = B18 + B30; C30 = B18 - B30; C19 = B19 + B31; C31 = B19 - B31; C20 = B20 + B23; C23 = B20 - B23; C21 = B21 + B22; C22 = B21 - B22; C24 = B24 + B27; C27 = B24 - B27; C25 = B25 + B26; C26 = B25 - B26;
//stage 4
D0 = C0 + C1; D1 = C1 - (D0 >> 1); D3 = C2 - (106*C3 >> 8); D2 = C3 + (90*D3 >> 8); D3 = -D3; D4 = C4 + C5; D5 = C4 - C5; D6 = -C6 + C7; D7 = C6 + C7; D8 = C8 + C14; D14 = C8 - C14; D9 = C9 + C15; D15 = C9 - C15; D10 = C10 + C11; D11 = C10 - C11; D12 = C12 + C13; D13 = C12 - C13; D16 = C16 + (106*C19 >> 8); D19 = C19 - (181*D16 >> 8); D16 = D16 + (106*D19 >> 8); D20 = C20 + C26; D26 = C20 - C26; D21 = C21 + C27; D27 = C21 - C27; D22 = C22 + C23; D23 = C22 - C23; D24 = C24 + C25; D25 = C24 - C25; D28 = C28 + (106*C31 >> 8); D31 = C31 - (181*D28 >> 8); D28 = D28 + (106*D31 >> 8);
//stage 5
E5 = D5 + D7; E7 = D7 - (E5 >> 1); E9 = D8 + (106*D9 >> 8); E8 = -(D9 - (90*E9 >> 8)); E11 = D11 + D12; E12 = D12 - (E11 >> 1); E15 = D14 + (106*D15 >> 8); E14 = -(D15 - (90*E15 >> 8)); E16 = D16 + C18; E18 = D16 - C18; E17 = C17 + D19; E19 = C17 - D19; E20 = D20 + (106*D21 >> 8); E21 = D21 - (90*E20 >> 8); E23 = D23 + D24; E24 = D24 - (E23 >> 1); E26 = D26 + (106*D27 >> 8); E27 = D27 - (90*E26 >> 8); E28 = - D28 + C30; E30 = D28 + C30; E29 = - C29 + D31; E31 = C29 + D31;
//stage 6
F16 = E16 - (50*E17 >> 8); F17 = E17 + (48*F16 >> 8); F18 = E18 - (171*E19 >> 8); F19 = E19 + (118*F18 >> 8); F28 = E28 - (171*E29 >> 8); F29 = E29 + (118*F28 >> 8); F30 = E30 - (50*E31 >> 8); F31 = E31 + (48*F30 >> 8); y0 = D0; y1 = E24; y2 = E12; y3 = -F16; y4 = D4; y5 = F31; y6 = E8; y7 = -E26; y8 = D2; y9 = E21; y10 = E15; y11 = F29; y12 = E5; y13 = -F18; y14 = D13; y15 = D22; y16 = -D1; y17 = D25; y18 = D10; y19 = -F19; y20 = -E7; y21 = -F28; y22 = -E14; y23 = -E20; y24 = D3; y25 = -E27; y26 = E9; y27 = -F30; y28 = D6; y29 = -F17; y30 = E11; y31 = -E23;
대응되는 32포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y31은 역변환되어야 할 입력값, A0 내지 z31은 중간값, X0 내지 X31은 역변환된 값을 나타낸다.
D0= y0;E24 = y1; E12 = y2; F16 = -y3; D4 = y4; F31 = y5; E8 = y6; E26 = -y7; D2 = y8; E21 = y9; E15 = y10; F29 = y11; E5 = y12; F18 = -y13; D13 = y14; D22 = y15; D1 = -y16; D25 = y17; D10 = y18; F19 = -y19; E7 = -y20; F28 = -y21; E14 = -y22; E20 = -y23; D3 = y24; E27 = -y25; E9 = y26; F30 = -y27; D6 = y28; F17 = -y29; E11 = y30; E23 = -y31;
//stage 6
E17 = F17 - (48*F16 >> 8); E16 = F16 + (50*E17 >> 8); E19 = F19 - (118*F18 >> 8); E18 = F18 + (171*E19 >> 8); E29 = F29 - (118*F28 >> 8); E28 = F28 + (171*E29 >> 8); E31 = F31 - (48*F30 >> 8); E30 = F30 + (50*E31 >> 8);
//stage 5
D7 = E7 + (E5 >> 1); D5= E5 - D7; D9 = -E8 + (90*E9 >> 8); D8 = E9 - (106*D9 >> 8); D12 = E12 + (E11 >> 1); D11 = E11 - D12; D15 = -E14 + (90*E15 >> 8); D14 = E15 - (106*D15 >> 8); D16 = E16 + E18; C18 = E16 - E18; C17 = E17 + E19; D19 = E17 - E19; D21 = E21 + (90*E20 >> 8); D20 = E20 - (106*D21 >> 8); D24 = E24 + (E23 >> 1); D23 = E23 - D24; D27 = E27 + (90*E26 >> 8); D26 = E26 - (106*D27 >> 8); D28 = - E28 + E30; C30 = E28 + E30; C29 = - E29 + E31; D31 = E29 + E31;
//stage 4
C1 = D1 + (D0 >> 1); C0 = D0 - C1; D3 = -D3; C3 = D2 - (90*D3 >> 8); C2 = D3 + (106*C3 >> 8); C4 = D4 + D5; C5 = D4 - D5; C6 = -D6 + D7; C7 = D6 + D7; C8 = D8 + D14; C14 = D8 - D14; C9 = D9 + D15; C15 = D9 - D15; C10 = D10 + D11; C11 = D10 - D11; C12 = D12 + D13; C13 = D12 - D13; D16 = D16 - (106*D19 >> 8); C19 = D19 + (181*D16 >> 8); C16 = D16 - (106*C19 >> 8); C20 = D20 + D26; C26 = D20 - D26; C21 = D21 + D27; C27 = D21 - D27; C22 = D22 + D23; C23 = D22 - D23; C24 = D24 + D25; C25 = D24 - D25; D28 = D28 -(106*D31 >> 8); C31 = D31 + (181*D28 >> 8); C28 = D28 - (106*C31 >> 8);
//stage 3
B0 = C0 + C3; B3 = C0 - C3; B1 = C1 + C2; B2 = C1 - C2; C4 = C4 - (210*C7 >> 8); B7 = C7 + (251*C4 >> 8); B4 = C4 - (210*B7 >> 8); C5 = C5 - (136*C6 >> 8); B6 = C6 + (212*C5 >> 8); B5 = C5 - (136*B6 >> 8); B8 = C8 + C11; B11 = C8 - C11; B9 = C9 + C10; B10 = C9 - C10; B12 = C12 + C15; B15 = C12 - C15; B13 = C13 + C14; B14 = C13 - C14; B16 = C16 + C28; B28 = C16 - C28; B17 = C17 + C29; B29 = C17 - C29; B18 = C18 + C30; B30 = C18 - C30; B19 = C19 + C31; B31 = C19 - C31; B20 = C20 + C23; B23 = C20 - C23; B21 = C21 + C22; B22 = C21 - C22; B24 = C24 + C27; B27 = C24 - C27; B25 = C25 + C26; B26 = C25 - C26;
//stage 2
A0 = B0 + B7; A7 = B0 - B7; A1 = B1 + B6; A6 = B1 - B6; A2 = B2 + B5; A5 = B2 - B5; A3 = B3 + B4; A4 = B3 - B4; B8 = B8 - (91*B15 >> 8); A15 = B15 + (162*B8 >> 8); A8 = B8 - (91*A15 >> 8); B9 = B9 + (153*B14 >> 8); A14 = B14 - (225*B9 >> 8); A9 = B9 + (153*A14 >> 8); B10 = B10 - (37*B13 >> 8); A13 = B13 + (74*B10 >> 8); A10 = B10 - (37*A13 >> 8); B11 = B11 + (232*B12 >> 8); A12 = B12 - (254*B11 >> 8); A11 = B11 + (232*A12 >> 8); A16 = B16 + B23; A23 = B16 - B23; A17 = B17 + B22; A22 = B17 - B22; A18 = B18 + B21; A21 = B18 - B21; A19 = B19 + B20; A20 = B19 - B20; A24 = B24 + B31; A31 = B24 - B31; A25 = B25 + B30; A30 = B25 - B30; A26 = B26 + B29; A29 = B26 - B29; A27 = B27 + B28; A28 = B27 - B28;
//stage 1
Z0 = A0 + A15; Z1 = A1 + A14; Z2 = A2 + A13; Z3 = A3 + A12; Z4 = A4 + A11; Z5 = A5 + A10; Z6 = A6 + A9; Z7 = A7 + A8; Z8 = A7 - A8; Z9 = A6 - A9; Z10 = A5 - A10; Z11 = A4 - A11; Z12 = A3 - A12; Z13 = A2 - A13; Z14 = A1 - A14; Z15 = A0 - A15; A16 = A16 + (113*A31 >> 8); Z31 = A31 - (189*A16 >> 8); Z16 = A16 + (113*Z31 >> 8); A17 = A17 - (84*A30 >> 8); Z30 = A30 + (152*A17 >> 8); Z17 = A17 - (84*Z30 >> 8); A18 = A18 + (145*A29 >> 8); Z29 = A29 - (219*A18 >> 8); Z18 = A18 + (145*Z29 >> 8); A19 = A19 - (57*A28 >> 8); Z28 = A28 + (109*A19 >> 8); Z19 = A19 - (57*Z28 >> 8); A20 = A20 + (180*A27 >> 8); Z27 = A27 - (241*A20 >> 8); Z20 = A20 + (180*Z27 >> 8); A21 = A21 - (31*A26 >> 8); Z26 = A26 + (62*A21 >> 8); Z21 = A21 - (31*Z26 >> 8); A22 = A22 + (220*A25 >> 8); Z25 = A25 - (253*A22 >> 8); Z22 = A22 + (220*Z25 >> 8); A23 = A23 - (6*A24 >> 8); Z24 = A24 + (12*A23 >> 8); Z23 = A23 - (6*Z24 >> 8);
x0 = Z0 + Z31; x31 = Z0 - Z31; x1 = Z1 + Z30; x30 = Z1 - Z30; x2 = Z2 + Z29; x29 = Z2 - Z29; x3 = Z3 + Z28; x28 = Z3 - Z28; x4 = Z4 + Z27; x27 = Z4 - Z27; x5 = Z5 + Z26; x26 = Z5 - Z26; x6 = Z6 + Z25; x25 = Z6 - Z25; x7 = Z7 + Z24; x24 = Z7 - Z24; x8 = Z8 + Z23; x23 = Z8 - Z23; x9 = Z9 + Z22; x22 = Z9 - Z22; x10 = Z10 + Z21; x21 = Z10 - Z21; x11 = Z11 + Z20; x20 = Z11 - Z20; x12 = Z12 + Z19; x19 = Z12 - Z19; x13 = Z13 + Z18; x18 = Z13 - Z18; x14 = Z14 +Z17; x17 = Z14 - Z17; x15 = Z15 + Z16; x16 = Z15 - Z16;
본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 119a 내지 도 119f와 같다. 32 포인트 역 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예는 도 120a 내지 도 120f와 같다. 여기서, 전술한 역스케일링 행렬(V)를 구하는 방식과 다르게 다음의 수학식; V=Qstep./*PF*2^n/256 에 따라서 역스케일링 행렬이 계산된다.
32 포인트 이산 코사인 변환에 대해서 스케일링 행렬(MF) 및 역스케일링 행렬(V)를 직접적인 디비젼을 통해 계산하는 경우에는 전술한 도 119 및 도 120과 거의 유사한 스케일링 행렬 및 역스케일링 행렬이 획득된다. 구체적으로, 본 발명의 또 다른 실시예에 따른 32 포인트 이산 코사인 변환을 수행하는 행렬을 A라고 하면, 중간 행렬(S)의 i번째 행의 각 원소를 다음의 수학식;S(i)=1/sqrt(AAT(i,i)) 과 같이 정의한다. sqrt는 제곱근(square root) 함수를 의미한다. 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 곱한 행렬(SⓧST)을 PF라고 하면, 스케일링 행렬(MF)는 다음의 수학식; MF=PF*2^m/Qstep 과 같이 계산될 수 있다. 여기서, Qstep은 양자화 스텝, m은 양의 정수이다. 역스케일링 행렬(V)는 전술한 스케일링 행렬(MF)의 생성시에도 이용되는 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 각각 곱한 행렬(SⓧST)인 PF에 기초하여 생성될 수 있다. 구체적으로, 양자화 스텝을 Qstep, 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)동일 위치의 원소들을 각각 곱한 행렬을 PF, n은 양의 정수라고 할 때, 역스케일링 행렬(V)은 다음의 수학식; V=Qstep./*PF*2^n/256 을 통해 획득된다.
도 121a 내지 도 121f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다. 도 121a 내지 도 121f에서 스케일링 행렬 계산시 m=10인 경우이다. 도 122a 내지 도 122f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다. 도 122a 내지 도 122f에서는 역스케일링 행렬 계산시 n=10인 경우를 나타낸다
전술한 도 104 및 수학식 4에 기초한 16 포인트 또는 32 포인트 변환 및 역변환 과정은 곱셈을 포함하지 않는 형태로 변경될 수 있다. 구체적으로, 각 변환 과정은 분모가 2의 거듭 제곱꼴인 유리수(dyadic rational)와 중간값들의 곱으로 표현될 수 있다. 도 123a는 16x16 변환에 이용되는 곱셈의 대체 연산 과정, 도 123b는 32x32 변환에 이용되는 곱셈의 대체 연산 과정을 나타낸다. 또한, 전술한 바와 같이 곱셈 연산을 쉬프트 연산으로 대체하는 과정은 변환 및 역변환에 이용되는 값의 분모(denominator)를 고려하여 추가적인 연산을 줄일 수 있다. 도 104 및 수학식 4에 기초한 16 포인트 이산 코사인 변환에 이용되는 곱셈 연산은 도 124a에 도시된 테이블에 따라서 곱셈이 생략된 연산 형태로 대체될 수 있다. 또한, 도 104 및 수학식 4에 기초한 32 포인트 이산 코사인 변환에 이용되는 곱셈 연산은 도 124b에 도시된 테이블에 따라서 곱셈이 생략된 연산 형태로 대체될 수 있다.
도 125는 본 발명의 또 다른 실시예에 따른 이산 코사인 변환의 흐름도를 도시한다.
도 125를 참조하면, x0 내지 x31은 입력값들을 나타낸다. y0 내지 y31은 이산 코사인 변환의 출력값들을 나타낸다. 변환시에 데이터 처리 방향은 좌측에서 우측이며, 역변환시에 데이터 처리 방향은 우측에서 좌측이다. 점에서 교차하는 2개의 라인은 2개의 수의 덧셈을 나타낸다. '-'는 부정(negation)을 나타낸다. 각 라인 위의 값 R(θ)는 도 16에 도시된 바와 같은 버터플라이 구조에 기초한 연산 과정을 나타낸다. 도 125에 도시된 바와 같이, 짝수 번째(0번째, 2번째, 4번째...) 이산 코사인 변환은 대칭적이며, 홀수 번째(1번째, 3번째, 5번째...) 이산 코사인 변환은 마이너스 대칭적이다. 즉 짝수 번째 행에 대해서 dctmtx(2k,i)=dctmtx(2k, N-i)이며, 홀수 번째 행에 대해서 dctmtx(2k+1, i)=-dctmtx(2k+1, i)인 것을 알 수 있다. 여기서, dctmtx는 이산 코사인 변환 행렬을 나타낸다. 전술한 본 발명의 또 다른 실시예와 유사하게, 도 125에 도시된 각 포인트 연산을 위한 원소들 중 삼각함수에 기초한 값들을 분모가 2의 거듭 제곱 형태인 소정의 유리수 값들로 치환된 값을 이용할 수 있다. 구체적으로, 도 125의 이산코사인 변환을 위한 R(θ)는 도 126에 도시된 바와 같이 분모가 2의 거듭 제곱 형태인 소정의 유리수값들로 치환될 수 있다. 도 128은 도 126에 따라서 도 125의 R(θ)를 분모가 2의 거듭제곱인 유리수 형태로 치환하였을 때의 이산 코사인 변환을 위한 흐름도를 나타낸다.
전술한 도 125 또는 도 128에 기초한 이산 코사인 변환에 포함된 버터 플라이 구조의 연산 과정은 도 20에 도시된 바와 같은 변경된 버터 플라이 구조의 연산으로 대체될 수 있다. 즉, 버터 플라이 구조의 연산은 전술한 수학식 4와 같이 대체될 수 있다. 만약, θ가 pi/4보다 큰 경우, 버터 플라이 구조의 연산은 도 129에 도시된 바와 같이 변경될 수 있다. 따라서, 도 125 또는 도 128에 구비된 버터 플라이 구조의 연산 과정은 수학식 4와 같은 도 20의 변경된 버터 플라이 구조로 대체되거나, θ가 pi/4보다 큰 경우 도 129와 같은 변경된 버터 플라이 구조로 대체될 수 있다. 이러한 θ값에 따라서 변경된 버터 플라이 구조를 포함하는 도 125의 이산 코사인 변환에 이용되는 삼각함수에 기초한 값들을 분모가 2의 거듭제곱 형태인 유리수(dyadic rational)로 치환한다. 구체적으로, 변경된 버터플라이 구조를 포함하는 도 125의 이산 코사인 변환에 이용되는 삼각함수값들은 도 130과 같이 분모가 2의 거듭제곱 형태인 유리수로 치환되어 치환된 값이 대신 이용될 수 있다.
도 128과 같이 삼각함수를 유리수값으로 대체한 32포인트 이산 코사인 변환을 수행하는 단계는, X0 내지 X31은 변환되어야 할 입력값, A0 내지 Z31은 중간값, Y0 내지 Y31은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
//stage 0
Z0 = x0 + x31; Z31 = x0 - x31; Z1 = x1 + x30; Z30 = x1 - x30; Z2 = x2 + x29; Z29 = x2 - x29; Z3 = x3 + x28; Z28 = x3 - x28; Z4 = x4 + x27; Z27 = x4 - x27; Z5 = x5 + x26; Z26 = x5 - x26; Z6 = x6 + x25; Z25 = x6 - x25; Z7 = x7 + x24; Z24 = x7 - x24; Z8 = x8 + x23; Z23 = x8 - x23; Z9 = x9 + x22; Z22 = x9 - x22; Z10 = x10 + x21; Z21 = x10 - x21; Z11 = x11 + x20; Z20 = x11 - x20; Z12 = x12 + x19; Z19 = x12 - x19; Z13 = x13 + x18; Z18 = x13 - x18; Z14 = x14 + x17; Z17 = x14 - x17; Z15 = x15 + x16; Z16 = x15 - x16;
//stage 1
A0 = Z0 + Z15; A1 = Z1 + Z14; A2 = Z2 + Z13; A3 = Z3 + Z12; A4 = Z4 + Z11; A5 = Z5 + Z10; A6 = Z6 + Z9; A7 = Z7 + Z8; A8 = Z7 - Z8; A9 = Z6 - Z9; A10 = Z5 - Z10; A11 = Z4 - Z11; A12 = Z3 - Z12; A13 = Z2 - Z13; A14 = Z1 - Z14; A15 = Z0 - Z15; A16 = (171*Z16 - 189*Z31) >> 8; A31 = (189*Z16 + 171*Z31) >> 8; A17 = (205*Z17 + 152*Z30) >> 8; A30 = (-152*Z17 + 205*Z30) >> 8; A18 = (131*Z18 - 219*Z29) >> 8; A29 = (219*Z18 + 131*Z29) >> 8; A19 = (231*Z19 + 109*Z28) >> 8; A28 = (-109*Z19 + 231*Z28) >> 8; A20 = (86*Z20 - 241*Z27) >> 8; A27 = (241*Z20 + 86*Z27) >> 8; A21 = (248*Z21 + 62*Z26) >> 8; A26 = (-62*Z21 + 248*Z26) >> 8; A22 = (37*Z22 - 253*Z25) >> 8; A25 = (253*Z22 + 37*Z25) >> 8; A23 = (255*Z23 + 12*Z24) >> 8; A24 = (-12*Z23 + 255*Z24) >> 8;
//stage 2
B0 = A0 + A7; B7 = A0 - A7; B1 = A1 + A6; B6 = A1 - A6; B2 = A2 + A5; B5 = A2 - A5; B3 = A3 + A4; B4 = A3 - A4; B8 = (197*A8 + 162*A15) >> 8; B15 = (-162*A8 + 197*A15) >> 8; B9 = (120*A9 - 225*A14) >> 8; B14 = (225*A9 + 120*A14) >> 8; B10 = (244*A10 + 74*A13) >> 8; B13 = (-74*A10 + 244*A13) >> 8; B11 = (25*A11 - 254*A12) >> 8; B12 = (254*A11 + 25*A12) >> 8; B16 = A16 + A23; B23 = A16 - A23; B17 = A17 + A22; B22 = A17 - A22; B18 = A18 + A21; B21 = A18 - A21; B19 = A19 + A20; B20 = A19 - A20; B24 = A24 + A31; B31 = A24 - A31; B25 = A25 + A30; B30 = A25 - A30; B26 = A26 + A29; B29 = A26 - A29; B27 = A27 + A28; B28 = A27 - A28;
//stage 3
C0 = B0 + B3; C3 = B0 - B3; C1 = B1 + B2; C2 = B1 - B2; C4 = (49*B4 + 251*B7) >> 8; C7 = (-251*B4 + 49*B7) >> 8; C5 = (142*B5 + 212*B6) >> 8; C6 = (-212*B5 + 142*B6) >> 8; C8 = B8 + B11; C11 = B8 - B11; C9 = B9 + B10; C10 = B9 - B10; C12 = B12 + B15; C15 = B12 - B15; C13 = B13 + B14; C14 = B13 - B14; C16 = B16 + B28; C28 = B16 - B28; C17 = B17 + B29; C29 = B17 - B29; C18 = B18 + B30; C30 = B18 - B30; C19 = B19 + B31; C31 = B19 - B31; C20 = B20 + B23; C23 = B20 - B23; C21 = B21 + B22; C22 = B21 - B22; C24 = B24 + B27; C27 = B24 - B27; C25 = B25 + B26; C26 = B25 - B26;
//stage 4
D0 = (181*(C0 + C1)) >> 8; D1 = (181*(-C0 +C1)) >> 8; D2 = (97*C2 + 236*C3) >> 8; D3 = (-236*C2 + 97*C3) >> 8; D4 = C4 + C5; D5 = C4 - C5; D6 = -C6 + C7; D7 = C6 + C7; D8 = C8 + C14; D14 = C8 - C14; D9 = C9 + C15; D15 = C9 - C15; D10 = C10 + C11; D11 = C10 - C11; D12 = C12 + C13; D13 = C12 - C13; D16 = (181*(C16 + C19)) >> 8; D19 = (181*(-C16 + C19)) >> 8; D20 = C20 + C26; D26 = C20 - C26; D21 = C21 + C27; D27 = C21 - C27; D22 = C22 + C23; D23 = C22 - C23; D24 = C24 + C25; D25 = C24 - C25; D28 = (181*(C28 + C31)) >> 8; D31 = (181*(-C28 + C31)) >> 8;
//stage 5
E5 = (181*(D5 + D7)) >> 8; E7 = (181*(-D5 + D7)) >> 8; E8 = (97*D8 - 236*D9) >> 8; E9 = (236*D8 + 97*D9) >> 8; E11 = (181*(D11 + D12)) >> 8; E12 = (181*(-D11 + D12)) >> 8; E14 = (97*D14 - 236*D15) >> 8; E15 = (236*D14 + 97*D15) >> 8; E16 = D16 + C18; E18 = D16 - C18; E17 = C17 + D19; E19 = C17 - D19; E20 = (236*D20 + 97*D21) >> 8; E21 = (-97*D20 + 236*D21) >> 8; E23 = (181*(D23 + D24)) >> 8; E24 = (181*(-D23 + D24)) >> 8; E26 = (236*D26 + 97*D27) >> 8; E27 = (-97*D26 + 236*D27) >> 8; E28 = - D28 + C30; E30 = D28 + C30; E29 = - C29 + D31; E31 = C29 + D31;
//stage 6
F16 = (251*E16 - 49*E17) >> 8; F17 = (49*E16 + 251*E17) >> 8; F18 = (212*E18 - 142*E19) >> 8; F19 = (142*E18 + 212*E19) >> 8; F28 = (212*E28 - 142*E29) >> 8; F29 = (142*E28 + 212*E29) >> 8; F30 = (251*E30 - 49*E31) >> 8; F31 = (49*E30 + 251*E31) >> 8;
y0 = D0; y1 = E24; y2 = E12; y3 = -F16; y4 = D4; y5 = F31; y6 = E8; y7 = -E26; y8 = D2; y9 = E21; y10 = E15; y11 = F29; y12 = E5; y13 = -F18; y14 = D13; y15 = D22; y16 = -D1; y17 = D25; y18 = D10; y19 = -F19; y20 = -E7; y21 = -F28; y22 = -E14; y23 = -E20; y24 = D3; y25 = -E27; y26 = E9; y27 = -F30; y28 = D6; y29 = -F17; y30 = E11; y31 = -E23;
이에 대응되는 32 포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y31은 역변환되어야 할 입력값, A0 내지 G31은 중간값, X0 내지 X31은 역변환된 값을 나타낸다.
D0= y0; E24 = y1; E12 = y2; F16 = -y3; D4 = y4; F31 = y5; E8 = y6; E26 = -y7; D2 = y8; E21 = y9; E15 = y10; F29 = y11; E5 = y12; F18 = -y13; D13 = y14; D22 = y15; D1 = -y16; D25 = y17; D10 = y18; F19 = -y19; E7 = -y20; F28 = -y21 ; E14 = -y22; E20 = -y23; D3 = y24; E27 = -y25; E9 = y26; F30 = -y27; D6 = y28; F17 = -y29 ; E11 = y30; E23 = -y31;
//stage 6
E16 = (251*F16 + 49*F17) >> 8; E17 = (-49*F16 + 251*F17) >> 8; E18 = (212*F18 + 142*F19) >> 8; E19 = (-142*F18 + 212*F19) >> 8; E28 = (212*F28 + 142*F29) >> 8; E29 = (-142*F28 + 212*F29) >> 8; E30 = (251*F30 + 49*F31) >> 8; E31 = (-49*F30 + 251*F31) >> 8;
//stage 5
D5 = (181*(E5 - E7)) >> 8; D7 = (181*(E5 + E7)) >> 8; D8 = (97*E8 + 236*E9) >> 8; D9 = (-236*E8 + 97*E9) >> 8; D11 = (181*(E11 - E12)) >> 8; D12 = (181*(E11 + E12)) >> 8; D14 = (97*E14 + 236*E15) >> 8; D15 = (-236*E14 + 97*E15) >> 8; D16 = E16 + E18; C18 = E16 - E18; C17 = E17 + E19; D19 = E17 - E19; D20 = (236*E20 - 97*E21) >> 8; D21 = (97*E20 + 236*E21) >> 8; D23 = (181*(E23 - E24)) >> 8; D24 = (181*(E23 + E24)) >> 8; D26 = (236*E26 - 97*E27) >> 8; D27 = (97*E26 + 236*E27) >> 8; D28 = - E28 + E30; C30 = E28 + E30; C29 = - E29 + E31; D31 = E29 + E31;
//stage 4
C0 = (181*(D0 - D1)) >> 8; C1 = (181*(D0 + D1)) >> 8; C2 = (97*D2 - 236*D3) >> 8; C3 = (236*D2 + 97*D3) >> 8; C4 = D4 + D5; C5 = D4 - D5; C6 = -D6 + D7; C7 = D6 + D7; C8 = D8 + D14; C14 = D8 - D14; C9 = D9 + D15; C15 = D9 - D15; C10 = D10 + D11; C11 = D10 - D11; C12 = D12 + D13; C13 = D12 - D13; C16 = (181*(D16 - D19)) >> 8; C19 = (181*(D16 + D19)) >> 8; C20 = D20 + D26; C26 = D20 - D26; C21 = D21 + D27; C27 = D21 - D27; C22 = D22 + D23; C23 = D22 - D23; C24 = D24 + D25; C25 = D24 - D25; C28 = (181*(D28 - D31)) >> 8; C31 = (181*(D28 + D31)) >> 8;
//stage 3
B0 = C0 + C3; B3 = C0 - C3; B1 = C1 + C2; B2 = C1 - C2; B4 = (49*C4 - 251*C7) >> 8; B7 = (251*C4 + 49*C7) >> 8; B5 = (142*C5 - 212*C6) >> 8; B6 = (212*C5 + 142*C6) >> 8; B8 = C8 + C11; B11 = C8 - C11; B9 = C9 + C10; B10 = C9 - C10; B12 = C12 + C15; B15 = C12 - C15; B13 = C13 + C14; B14 = C13 - C14; B16 = C16 + C28; B28 = C16 - C28; B17 = C17 + C29; B29 = C17 - C29; B18 = C18 + C30; B30 = C18 - C30; B19 = C19 + C31; B31 = C19 - C31; B20 = C20 + C23; B23 = C20 - C23; B21 = C21 + C22; B22 = C21 - C22; B24 = C24 + C27; B27 = C24 - C27; B25 = C25 + C26; B26 = C25 - C26;
//stage 2
A0 = B0 + B7; A7 = B0 - B7; A1 = B1 + B6; A6 = B1 - B6; A2 = B2 + B5; A5 = B2 - B5; A3 = B3 + B4; A4 = B3 - B4; A8 = (197*B8 - 162*B15) >> 8; A15 = (162*B8 + 197*B15) >> 8; A9 = (120*B9 + 225*B14) >> 8; A14 = (-225*B9 + 120*B14) >> 8; A10 = (244*B10 - 74*B13) >> 8; A13 = (74*B10 + 244*B13) >> 8; A11 = (25*B11 + 254*B12) >> 8; A12 = (-254*B11 + 25*B12) >> 8; A16 = B16 + B23; A23 = B16 - B23; A17 = B17 + B22; A22 = B17 - B22; A18 = B18 + B21; A21 = B18 - B21; A19 = B19 + B20; A20 = B19 - B20; A24 = B24 + B31; A31 = B24 - B31; A25 = B25 + B30; A30 = B25 - B30; A26 = B26 + B29; A29 = B26 - B29; A27 = B27 + B28; A28 = B27 - B28;
//stage 1
Z0 = A0 + A15; Z1 = A1 + A14; Z2 = A2 + A13; Z3 = A3 + A12; Z4 = A4 + A11; Z5 = A5 + A10; Z6 = A6 + A9; Z7 = A7 + A8; Z8 = A7 - A8; Z9 = A6 - A9; Z10 = A5 - A10; Z11 = A4 - A11; Z12 = A3 - A12; Z13 = A2 - A13; Z14 = A1 - A14; Z15 = A0 - A15; Z16 = (171*A16 + 189*A31) >> 8; Z31 = (-189*A16 + 171*A31) >> 8; Z17 = (205*A17 - 152*A30) >> 8; Z30 = (152*A17 + 205*A30) >> 8; Z18 = (131*A18 + 219*A29) >> 8; Z29 = (-219*A18 + 131*A29) >> 8; Z19 = (231*A19 - 109*A28) >> 8; Z28 = (109*A19 + 231*A28) >> 8; Z20 = (86*A20 + 241*A27) >> 8; Z27 = (-241*A20 + 86*A27) >> 8; Z21 = (248*A21 - 62*A26) >> 8; Z26 = (62*A21 + 248*A26) >> 8; Z22 = (37*A22 + 253*A25) >> 8; Z25 = (-253*A22 + 37*A25) >> 8; Z23 = (255*A23 - 12*A24) >> 8; Z24 = (12*A23 + 255*A24) >> 8;
x0 = Z0 + Z31; x31 = Z0 - Z31; x1 = Z1 + Z30; x30 = Z1 - Z30; x2 = Z2 + Z29; x29 = Z2 - Z29; x3 = Z3 + Z28; x28 = Z3 - Z28; x4 = Z4 + Z27; x27 = Z4 - Z27; x5 = Z5 + Z26; x26 = Z5 - Z26; x6 = Z6 + Z25; x25 = Z6 - Z25; x7 = Z7 + Z24; x24 = Z7 - Z24; x8 = Z8 + Z23; x23 = Z8 - Z23; x9 = Z9 + Z22; x22 = Z9 - Z22; x10 = Z10 + Z21; x21 = Z10 - Z21; x11 = Z11 + Z20; x20 = Z11 - Z20; x12 = Z12 + Z19; x19 = Z12 - Z19; x13 = Z13 + Z18; x18 = Z13 - Z18; x14 = Z14 + Z17; x17 = Z14 - Z17; x15 = Z15 +Z16; x16 = Z15 - Z16;
전술한 도 125에 도시된 32 포인트 이산 코사인 변환에 기초하여, cos 및 sin 값을 분모가 2의 거듭제곱꼴인 형태로 치환하여 이산 코사인 변환을 수행하는 경우 전술한 도 3의 단계 350과 유사하게, 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬(Original_A)과 치환된 삼각함수 값을 이용한 변환 사이의 차이값을 보정하기 위한 스케일링 행렬 및 시프트 연산을 적용하여 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행할 수 있다.
본 발명의 또 다른 실시예에 따라서 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 131a 내지 도 131f와 같다. 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예는 도 132a 내지 도 132f와 같다.
32 포인트 변환에 대해서 스케일링 행렬(MF) 및 역스케일링 행렬(V)를 직접적인 디비젼을 통해 계산하는 경우에는 전술한 도 131 및 도 132과 거의 유사한 스케일링 행렬 및 역스케일링 행렬이 획득된다. 구체적으로, 본 발명의 또 다른 실시예에 따른 32 포인트 이산 코사인 변환을 수행하는 행렬을 A라고 하면, 중간 행렬(S)의 i번째 행의 각 원소를 다음의 수학식;S(i)=1/sqrt(AAT(i,i)) 과 같이 정의한다. sqrt는 제곱근(square root) 함수를 의미한다. 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 곱한 행렬(SⓧST)을 PF라고 하면, 스케일링 행렬(MF)는 다음의 수학식; MF=PF*2^m/Qstep 과 같이 계산될 수 있다. 여기서, Qstep은 양자화 스텝, m은 양의 정수이다. 역스케일링 행렬(V)는 전술한 스케일링 행렬(MF)의 생성시에도 이용되는 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 각각 곱한 행렬(SⓧST)인 PF에 기초하여 생성될 수 있다. 구체적으로, 양자화 스텝을 Qstep, 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)동일 위치의 원소들을 각각 곱한 행렬을 PF, n은 양의 정수라고 할 때, 역스케일링 행렬(V)은 다음의 수학식; V=Qstep*PF*2^n 을 통해 획득된다.
도 134a 내지 도 134f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다. 도 134a 내지 도 134f에서 스케일링 행렬 계산시 m=10인 경우이다. 도 135a 내지 도 135f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다. 도 108a 내지 도 108f에서는 역스케일링 행렬 계산시 n=10인 경우를 나타낸다
한편, 도 128의 이산 코사인 변환에 포함된 버터 플라이 구조를 θ값에 따라 도 20 또는 도 129의 변경된 버터 플라이 구조로 치환하고, 전술한 도 130과 같이 분모가 2의 거듭제곱 형태인 유리수를 이용하여 32 포인트 이산 코사인 변환을 수행하는 단계는, X0 내지 X31은 변환되어야 할 입력값, A0 내지 Z31은 중간값, Y0 내지 Y31은 변환된 값을 나타낸다고 할 때, 다음의 연산 과정과 같이 표현될 수 있다.
//stage 0
Z0 = x0 + x31; Z31 = x0 - x31; Z1 = x1 + x30; Z30 = x1 - x30; Z2 = x2 + x29; Z29 = x2 - x29; Z3 = x3 + x28; Z28 = x3 - x28; Z4 = x4 + x27; Z27 = x4 - x27; Z5 = x5 + x26; Z26 = x5 - x26; Z6 = x6 + x25; Z25 = x6 - x25; Z7 = x7 + x24; Z24 = x7 - x24; Z8 = x8 + x23; Z23 = x8 - x23; Z9 = x9 + x22; Z22 = x9 - x22; Z10 = x10 + x21; Z21 = x10 - x21; Z11 = x11 + x20; Z20 = x11 - x20; Z12 = x12 + x19; Z19 = x12 - x19; Z13 = x13 + x18; Z18 = x13 - x18; Z14 = x14 + x17; Z17 = x14 - x17; Z15 = x15 + x16; Z16 = x15 - x16;
//stage 1
A0 = Z0 + Z15; A1 = Z1 + Z14; A2 = Z2 + Z13; A3 = Z3 + Z12; A4 = Z4 + Z11; A5 = Z5 + Z10; A6 = Z6 + Z9; A7 = Z7 + Z8; A8 = Z7 - Z8; A9 = Z6 - Z9; A10 = Z5 - Z10; A11 = Z4 - Z11; A12 = Z3 - Z12; A13 = Z2 - Z13; A14 = Z1 - Z14; A15 = Z0 - Z15; A16 = Z16 - (113*Z31 >> 8); A31 = Z31 + (189*A16 >> 8); A16 = A16 - (113*A31 >> 8); A17 = Z17 + (84*Z30 >> 8); A30 = Z30 - (152*A17 >> 8); A17 = A17 + (84*A30 >> 8); A18 = Z18 - (145*Z29 >> 8); A29 = Z29 + (219*A18 >> 8); A18 = A18 - (145*A29 >> 8); A19 = Z19 + (57*Z28 >> 8); A28 = Z28 - (109*A19 >> 8); A19 = A19 + (57*A28 >> 8); A20 = Z20 - (180*Z27 >> 8); A27 = Z27 + (241*A20 >> 8); A20 = A20 - (180*A27 >> 8); A21 = Z21 + (31*Z26 >> 8); A26 = Z26 - (62*A21 >> 8); A21 = A21 + (31*A26 >> 8); A22 = Z22 - (220*Z25 >> 8); A25 = Z25 + (253*A22 >> 8); A22 = A22 - (220*A25 >> 8); A23 = Z23 + (6*Z24 >> 8); A24 = Z24 - (12*A23 >> 8); A23 = A23 + (6*A24 >> 8);
//stage 2
B0 = A0 + A7; B7 = A0 - A7; B1 = A1 + A6; B6 = A1 - A6; B2 = A2 + A5; B5 = A2 - A5; B3 = A3 + A4; B4 = A3 - A4; B8 = A8 + (91*A15 >> 8); B15 = A15 - (162*B8 >> 8); B8 = B8 + (91*B15 >> 8); B9 = A9 - (153*A14 >> 8); B14 = A14 + (225*B9 >> 8); B9 = B9 - (153*B14 >> 8); B10 = A10 + (37*A13 >> 8); B13 = A13 - (74*B10 >> 8); B10 = B10 + (37*B13 >> 8); B11 = A11 - (232*A12 >> 8); B12 = A12 + (254*B11 >> 8); B11 = B11 - (232*B12 >> 8); B16 = A16 + A23; B23 = A16 - A23; B17 = A17 + A22; B22 = A17 - A22; B18 = A18 + A21; B21 = A18 - A21; B19 = A19 + A20; B20 = A19 - A20; B24 = A24 + A31; B31 = A24 - A31; B25 = A25 + A30; B30 = A25 - A30; B26 = A26 + A29; B29 = A26 - A29; B27 = A27 + A28; B28 = A27 - A28;
//stage 3
C0 = B0 + B3; C3 = B0 - B3; C1 = B1 + B2; C2 = B1 - B2; C4 = B4 + (210*B7 >> 8); C7 = B7 - (251*C4 >> 8); C4 = C4 + (210*C7 >> 8); C5 = B5 + (136*B6 >> 8); C6 = B6 - (212*C5 >> 8); C5 = C5 + (136*C6 >> 8); C8 = B8 + B11; C11 = B8 - B11; C9 = B9 + B10; C10 = B9 - B10; C12 = B12 + B15; C15 = B12 - B15; C13 = B13 + B14; C14 = B13 - B14; C16 = B16 + B28; C28 = B16 - B28; C17 = B17 + B29; C29 = B17 - B29; C18 = B18 + B30; C30 = B18 - B30; C19 = B19 + B31; C31 = B19 - B31; C20 = B20 + B23; C23 = B20 - B23; C21 = B21 + B22; C22 = B21 - B22; C24 = B24 + B27; C27 = B24 - B27; C25 = B25 + B26; C26 = B25 - B26;
//stage 4
D0 = C0 + C1; D1 = C1 - (D0 >> 1); D3 = C2 - (106*C3 >> 8); D2 = C3 + (90*D3 >> 8); D3 = -D3; D4 = C4 + C5; D5 = C4 - C5; D6 = -C6 + C7; D7 = C6 + C7; D8 = C8 + C14; D14 = C8 - C14; D9 = C9 + C15; D15 = C9 - C15; D10 = C10 + C11; D11 = C10 - C11; D12 = C12 + C13; D13 = C12 - C13; D16 = C16 + (106*C19 >> 8); D19 = C19 - (181*D16 >> 8); D16 = D16 + (106*D19 >> 8);D20 = C20 + C26; D26 = C20 - C26; D21 = C21 + C27; D27 = C21 - C27; D22 = C22 + C23; D23 = C22 - C23; D24 = C24 + C25; D25 = C24 - C25; D28 = C28 + (106*C31 >> 8); D31 = C31 - (181*D28 >> 8); D28 = D28 + (106*D31 >> 8); //stage 5
E5 = D5 + D7; E7 = D7 - (E5 >> 1); E9 = D8 + (106*D9 >> 8); E8 = -(D9 - (90*E9 >> 8)); E11 = D11 + D12; E12 = D12 - (E11 >> 1); E15 = D14 + (106*D15 >> 8); E14 = -(D15 - (90*E15 >> 8)); E16 = D16 + C18; E18 = D16 - C18; E17 = C17 + D19; E19 = C17 - D19; E20 = D20 + (106*D21 >> 8); E21 = D21 - (90*E20 >> 8); E23 = D23 + D24; E24 = D24 - (E23 >> 1); E26 = D26 + (106*D27 >> 8); E27 = D27 - (90*E26 >> 8); E28 = - D28 + C30; E30 = D28 + C30; E29 = - C29 + D31; E31 = C29 + D31;
//stage 6
F16 = E16 - (50*E17 >> 8); F17 = E17 + (48*F16 >> 8); F18 = E18 - (171*E19 >> 8); F19 = E19 + (118*F18 >> 8); F28 = E28 - (171*E29 >> 8); F29 = E29 + (118*F28 >> 8); F30 = E30 - (50*E31 >> 8); F31 = E31 + (48*F30 >> 8);
y0 = D0; y1 = E24; y2 = E12; y3 = -F16; y4 = D4; y5 = F31; y6 = E8; y7 = -E26; y8 = D2; y9 = E21; y10 = E15; y11 = F29; y12 = E5; y13 = -F18; y14 = D13; y15 = D22; y16 = -D1; y17 = D25; y18 = D10; y19 = -F19; y20 = -E7; y21 = -F28; y22 = -E14; y23 = -E20; y24 = D3; y25 = -E27; y26 = E9; y27 = -F30; y28 = D6; y29 = -F17; y30 = E11; y31 = -E23;
이에 대응되는 32 포인트 역 이산 코사인 변환 과정은 다음의 연산 과정과 같이 표현된다. 다음의 연산 과정에서 Y0 내지 Y31은 역변환되어야 할 입력값, A0 내지 G31은 중간값, X0 내지 X31은 역변환된 값을 나타낸다.
D0= y0; E24 = y1; E12 = y2; F16 = -y3; D4 = y4; F31 = y5; E8 = y6; E26 = -y7; D2 = y8; E21 = y9; E15 = y10; F29 = y11; E5 = y12; F18 = -y13; D13 = y14; D22 = y15; D1 = -y16; D25 = y17; D10 = y18; F19 = -y19; E7 = -y20; F28 = -y21; E14 = -y22; E20 = -y23; D3 = y24; E27 = -y25; E9 = y26; F30 = -y27; D6 = y28; F17 = -y29; E11 = y30; E23 = -y31;
//stage 6
E17 = F17 - (48*F16 >> 8); E16 = F16 + (50*E17 >> 8); E19 = F19 - (118*F18 >> 8); E18 = F18 + (171*E19 >> 8); E29 = F29 - (118*F28 >> 8); E28 = F28 + (171*E29 >> 8); E31 = F31 - (48*F30 >> 8); E30 = F30 + (50*E31 >> 8);
//stage 5
D7 = E7 + (E5 >> 1); D5= E5 - D7; D9 = -E8 + (90*E9 >> 8); D8 = E9 - (106*D9 >> 8); D12 = E12 + (E11 >> 1); D11 = E11 - D12; D15 = -E14 + (90*E15 >> 8); D14 = E15 - (106*D15 >> 8); D16 = E16 + E18; C18 = E16 - E18; C17 = E17 + E19; D19 = E17 - E19; D21 = E21 + (90*E20 >> 8); D20 = E20 - (106*D21 >> 8); D24 = E24 + (E23 >> 1); D23 = E23 - D24; D27 = E27 + (90*E26 >> 8); D26 = E26 - (106*D27 >> 8); D28 = - E28 + E30; C30 = E28 + E30; C29 = - E29 + E31; D31 = E29 + E31;
//stage 4
C1 = D1 + (D0 >> 1); C0 = D0 - C1; D3 = -D3; C3 = D2 - (90*D3 >> 8); C2 = D3 + (106*C3 >> 8); C4 = D4 + D5; C5 = D4 - D5; C6 = -D6 + D7; C7 = D6 + D7; C8 = D8 + D14; C14 = D8 - D14; C9 = D9 + D15; C15 = D9 - D15; C10 = D10 + D11; C11 = D10 - D11; C12 = D12 + D13; C13 = D12 - D13; D16 = D16 - (106*D19 >> 8); C19 = D19 + (181*D16 >> 8); C16 = D16 - (106*C19 >> 8); C20 = D20 + D26; C26 = D20 - D26; C21 = D21 + D27; C27 = D21 - D27; C22 = D22 + D23; C23 = D22 - D23; C24 = D24 + D25; C25 = D24 - D25; D28 = D28 - (106*D31 >> 8); C31 = D31 + (181*D28 >> 8); C28 = D28 - (106*C31 >> 8);
//stage 3
B0 = C0 + C3; B3 = C0 - C3; B1 = C1 + C2; B2 = C1 - C2; C4 = C4 - (210*C7 >> 8); B7 = C7 + (251*C4 >> 8); B4 = C4 - (210*B7 >> 8); C5 = C5 - (136*C6 >> 8); B6 = C6 + (212*C5 >> 8); B5 = C5 - (136*B6 >> 8); B8 = C8 + C11; B11 = C8 - C11; B9 = C9 + C10; B10 = C9 - C10; B12 = C12 + C15; B15 = C12 - C15; B13 = C13 + C14; B14 = C13 - C14; B16 = C16 + C28; B28 = C16 - C28; B17 = C17 + C29; B29 = C17 - C29; B18 = C18 + C30; B30 = C18 - C30; B19 = C19 + C31; B31 = C19 - C31; B20 = C20 + C23; B23 = C20 - C23; B21 = C21 + C22; B22 = C21 - C22; B24 = C24 + C27; B27 = C24 - C27; B25 = C25 + C26; B26 = C25 - C26;
//stage 2
A0 = B0 + B7; A7 = B0 - B7; A1 = B1 + B6; A6 = B1 - B6; A2 = B2 + B5; A5 = B2 - B5; A3 = B3 + B4; A4 = B3 - B4; B8 = B8 - (91*B15 >> 8); A15 = B15 + (162*B8 >> 8); A8 = B8 - (91*A15 >> 8); B9 = B9 + (153*B14 >> 8); A14 = B14 - (225*B9 >> 8); A9 = B9 + (153*A14 >> 8); B10 = B10 - (37*B13 >> 8); A13 = B13 + (74*B10 >> 8); A10 = B10 - (37*A13 >> 8); B11 = B11 + (232*B12 >> 8); A12 = B12 - (254*B11 >> 8); A11 = B11 + (232*A12 >> 8); A16 = B16 + B23; A23 = B16 - B23; A17 = B17 + B22; A22 = B17 - B22; A18 = B18 + B21; A21 = B18 - B21; A19 = B19 + B20; A20 = B19 - B20; A24 = B24 + B31; A31 = B24 - B31; A25 = B25 + B30; A30 = B25 - B30; A26 = B26 + B29; A29 = B26 - B29; A27 = B27 + B28; A28 = B27 - B28;
//stage 1
Z0 = A0 + A15; Z1 = A1 + A14; Z2 = A2 + A13; Z3 = A3 + A12; Z4 = A4 + A11; Z5 = A5 + A10; Z6 = A6 + A9; Z7 = A7 + A8; Z8 = A7 - A8; Z9 = A6 - A9; Z10 = A5 - A10; Z11 = A4 - A11; Z12 = A3 - A12; Z13 = A2 - A13; Z14 = A1 - A14; Z15 = A0 - A15; A16 = A16 + (113*A31 >> 8); Z31 = A31 - (189*A16 >> 8); Z16 = A16 + (113*Z31 >> 8); A17 = A17 - (84*A30 >> 8); Z30 = A30 + (152*A17 >> 8); Z17 = A17 - (84*Z30 >> 8); A18 = A18 + (145*A29 >> 8); Z29 = A29 - (219*A18 >> 8); Z18 = A18 + (145*Z29 >> 8); A19 = A19 - (57*A28 >> 8); Z28 = A28 + (109*A19 >> 8); Z19 = A19 - (57*Z28 >> 8); A20 = A20 + (180*A27 >> 8); Z27 = A27 - (241*A20 >> 8); Z20 = A20 + (180*Z27 >> 8); A21 = A21 - (31*A26 >> 8); Z26 = A26 + (62*A21 >> 8); Z21 = A21 - (31*Z26 >> 8); A22 = A22 + (220*A25 >> 8); Z25 = A25 - (253*A22 >> 8); Z22 = A22 + (220*Z25 >> 8);A23 = A23 - (6*A24 >> 8); Z24 = A24 + (12*A23 >> 8); Z23 = A23 - (6*Z24 >> 8);
x0 = Z0 + Z31; x31 = Z0 - Z31; x1 = Z1 + Z30; x30 = Z1 - Z30; x2 = Z2 + Z29; x29 = Z2 - Z29; x3 = Z3 + Z28; x28 = Z3 - Z28; x4 = Z4 + Z27; x27 = Z4 - Z27; x5 = Z5 + Z26; x26 = Z5 - Z26; x6 = Z6 + Z25; x25 = Z6 - Z25; x7 = Z7 + Z24; x24 = Z7 - Z24; x8 = Z8 + Z23; x23 = Z8 - Z23; x9 = Z9 + Z22; x22 = Z9 - Z22; x10 = Z10 + Z21; x21 = Z10 - Z21; x11 = Z11 + Z20; x20 = Z11 - Z20; x12 = Z12 + Z19; x19 = Z12 - Z19; x13 = Z13 + Z18; x18 = Z13 - Z18; x14 = Z14 + Z17; x17 = Z14 - Z17; x15 = Z15 + Z16; x16 = Z15 - Z16;
전술한 도 128에 도시된 32 포인트 이산 코사인 변환에 기초하여, cos 및 sin 값을 분모가 2의 거듭제곱꼴인 형태로 치환하여 이산 코사인 변환을 수행하는 경우 전술한 도 3의 단계 350과 유사하게, 이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬(Original_A)과 치환된 삼각함수 값을 이용한 변환 사이의 차이값을 보정하기 위한 스케일링 행렬 및 시프트 연산을 적용하여 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행할 수 있다.
본 발명의 또 다른 실시예에 따라서 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예는 도 136a 내지 도 136f와 같다. 32x32 블록의 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)의 예는 도 137a 내지 도 137f와 같다.
32 포인트 변환에 대해서 스케일링 행렬(MF) 및 역스케일링 행렬(V)를 직접적인 디비젼을 통해 계산하는 경우에는 전술한 도 136 및 도 137과 거의 유사한 스케일링 행렬 및 역스케일링 행렬이 획득된다. 구체적으로, 본 발명의 또 다른 실시예에 따른 32 포인트 이산 코사인 변환을 수행하는 행렬을 A라고 하면, 중간 행렬(S)의 i번째 행의 각 원소를 다음의 수학식;S(i)=1/sqrt(AAT(i,i)) 과 같이 정의한다. sqrt는 제곱근(square root) 함수를 의미한다. 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 곱한 행렬(SⓧST)을 PF라고 하면, 스케일링 행렬(MF)는 다음의 수학식; MF=PF*2^m/Qstep 과 같이 계산될 수 있다. 여기서, Qstep은 양자화 스텝, m은 양의 정수이다. 역스케일링 행렬(V)는 전술한 스케일링 행렬(MF)의 생성시에도 이용되는 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)의 동일 위치의 원소를 각각 곱한 행렬(SⓧST)인 PF에 기초하여 생성될 수 있다. 구체적으로, 양자화 스텝을 Qstep, 중간 행렬(S)의 각 원소와 중간 행렬의 전치 행렬(ST)동일 위치의 원소들을 각각 곱한 행렬을 PF, n은 양의 정수라고 할 때, 역스케일링 행렬(V)은 다음의 수학식; V=Qstep*PF*2^n 을 통해 획득된다.
도 138a 내지 도 138f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 스케일링 행렬(MF)의 예를 도시한다. 도 138a 내지 도 138f에서 스케일링 행렬 계산시 m=10인 경우이다. 도 139a 내지 도 139f는 본 발명의 또 다른 실시예에 따라서 32 포인트 이산 코사인 변환시에 이용되는 양자화 파라메터(QP)에 따른 역스케일링 행렬(V)을 도시한다. 도 139a 내지 도 139f에서는 역스케일링 행렬 계산시 n=10인 경우를 나타낸다
전술한 도 128에 기초한 32 포인트 변환 및 역변환 과정은 곱셈을 포함하지 않는 형태로 변경될 수 있다. 구체적으로, 각 변환 과정은 분모가 2의 거듭 제곱꼴인 유리수(dyadic rational)와 중간값들의 곱으로 표현될 수 있다. 도 140는 32 포인트 변환에 이용되는 곱셈의 대체 연산 과정을 나타낸다. 또한, 전술한 바와 같이 곱셈 연산을 쉬프트 연산으로 대체하는 과정은 변환 및 역변환에 이용되는 값의 분모(denominator)를 고려하여 추가적인 연산을 줄일 수 있다. 도 128에 기초한 32 포인트 이산 코사인 변환에 이용되는 곱셈 연산은 도 141에 도시된 테이블에 따라서 곱셈이 생략된 연산 형태로 대체될 수 있다.
또한, 도 128의 이산 코사인 변환에 포함된 버터 플라이 구조를 θ값에 따라 도 20 또는 도 129의 변경된 버터 플라이 구조로 치환하고, 전술한 도 130과 같이 분모가 2의 거듭제곱 형태인 유리수를 이용하여 32 포인트 이산 코사인 변환을 수행할 때 곱셈 연산은 도 142에 도시된 바와 같이 곱셈을 쉬프트 연산등으로 대체한 연산 과정을 통해 수행될 수 있다. 또한, 전술한 바와 같이 곱셈 연산을 쉬프트 연산으로 대체하는 과정은 변환 및 역변환에 이용되는 값의 분모(denominator)를 고려하여 추가적인 연산을 줄일 수 있다. 도 142에 기초한 32 포인트 이산 코사인 변환에 이용되는 곱셈 연산은 도 133에 도시된 테이블에 따른 연산 형태로 대체될 수 있다.
도 127은 본 발명의 또 다른 실시예에 따른 영상 역변환 방법을 나타낸 플로우 차트이다.
도 127을 참조하면, 단계 12710에서 복호화되는 영상을 구성하는 NxN(N은 정수) 크기의 블록의 양자화된 변환 계수들을 수신한다.
단계 12720에서 수신된 양자화된 변환 계수들을 역양자화한다.
단계 12730에서 NxN 크기의 블록의 1차원 이산 코사인 역변환에 이용되는 NxN 역변환 행렬의 원소들 중 삼각함수에 기초한 값들을 소정의 유리수 값들로 치환하고, 치환된 값들을 갖는 행렬을 이용하여 상기 NxN 크기의 블록의 역양자화된 변환 계수들을 역변환한다.
이상과 같이 본 발명은 비록 한정된 실시예와 도면에 의해 설명되었으나, 본 발명이 상기의 실시예에 한정되는 것은 아니며, 이는 본 발명이 속하는 분야에서 통상의 지식을 가진 자라면 이러한 기재로부터 다양한 수정 및 변형이 가능하다. 따라서, 본 발명의 사상은 아래에 기재된 특허청구범위에 의해서만 파악되어야 하고, 이와 균등하거나 또는 등가적인 변형 모두는 본 발명 사상의 범주에 속한다 할 것이다. 또한, 본 발명에 따른 시스템은 컴퓨터로 읽을 수 있는 기록매체에 컴퓨터가 읽을 수 있는 코드로서 구현하는 것이 가능하다. 컴퓨터가 읽을 수 있는 기록매체는 컴퓨터 시스템에 의하여 읽혀질 수 있는 데이터가 저장되는 모든 종류의 기록장치를 포함한다. 기록매체의 예로는 ROM, RAM, CD-ROM, 자기 테이프, 플로피 디스크, 광데이터 저장장치 등을 포함한다. 또한 컴퓨터가 읽을 수 있는 기록매체는 네트워크로 연결된 컴퓨터 시스템에 분산되어 분산방식으로 컴퓨터가 읽을 수 있는 코드가 저장되고 실행될 수 있다.

Claims (14)

  1. 영상의 변환 방법에 있어서,
    NxN(N은 정수) 크기의 블록의 1차원 이산 코사인 변환에 이용되는 NxN 변환 행렬의 원소들 중 삼각함수에 기초한 값들을 소정의 유리수 값들로 치환하는 단계; 및
    상기 치환된 값들을 갖는 행렬을 이용하여 상기 NxN 크기의 블록을 변환하는 단계를 포함하는 것을 특징으로 하는 영상 변환 방법.
  2. 제 1항에 있어서,
    상기 치환하는 단계는
    상기 삼각함수에 기초한 값들을 분모가 2의 거듭 제곱꼴인 유리수로 치환하는 것을 특징으로 하는 영상 변환 방법.
  3. 제 1항에 있어서,
    상기 치환하는 단계는
    상기 NxN 변환 행렬을 소정의 순열 행렬과 회전 행렬들의 곱셈 형태로 분해하고, 상기 분해된 순열 행렬과 회전 행렬에 구비된 삼각함수에 기초한 값을 소정의 유리수로 치환하는 것을 특징으로 하는 영상 변환 방법.
  4. 제 1항에 있어서,
    상기 변환하는 단계는
    상기 치환된 값들을 갖는 행렬을 이용한 변환 과정에 포함된 곱셈 연산을 쉬프트 연산, 덧셈 연산 및 뺄셈 연산으로 대체한 대체 연산을 통해 수행하는 것을 특징으로 하는 영상 변환 방법.
  5. 제 1항에 있어서,
    이산 코사인 변환에 이용되는 원래의 NxN 변환 행렬과 상기 치환된 NxN 변환 행렬 사이의 차이값을 보정하기 위한 스케일링 행렬 및 시프트 연산을 적용하여 상기 NxN 크기의 블록을 변환한 변환 블록에 대한 양자화를 수행하는 단계를 더 포함하는 것을 특징으로 하는 영상 변환 방법.
  6. 영상 변환 장치에 있어서,
    NxN(N은 정수) 크기의 블록의 1차원 이산 코사인 변환에 이용되는 NxN 변환 행렬의 원소들 중 삼각함수에 기초한 값들을 소정의 유리수 값들로 치환하고, 치환된 값들을 갖는 행렬을 이용하여 상기 NxN 크기의 블록을 변환하는 변환부를 포함하는 것을 특징으로 하는 영상 변환 장치.
  7. 영상의 역변환 방법에 있어서,
    복호화되는 영상을 구성하는 NxN(N은 정수) 크기의 블록의 양자화된 변환 계수들을 수신하는 단계;
    상기 수신된 양자화된 변환 계수들을 역양자화하는 단계; 및
    상기 NxN 크기의 블록의 1차원 이산 코사인 역변환에 이용되는 NxN 역변환 행렬의 원소들 중 삼각함수에 기초한 값들을 소정의 유리수 값들로 치환하고, 치환된 값들을 갖는 행렬을 이용하여 상기 NxN 크기의 블록의 역양자화된 변환 계수들을 역변환하는 단계를 포함하는 것을 특징으로 하는 영상 역변환 방법.
  8. 제 7항에 있어서,
    상기 역변환하는 단계는
    상기 삼각함수에 기초한 값들을 분모가 2의 거듭 제곱꼴인 유리수로 치환하는 것을 특징으로 하는 영상 역변환 방법.
  9. 제 7항에 있어서,
    상기 역변환하는 단계는
    상기 NxN 역변환 행렬을 소정의 순열 행렬과 회전 행렬들의 곱셈 형태로 분해하고, 상기 분해된 순열 행렬과 회전 행렬에 구비된 삼각함수에 기초한 값을 소정의 유리수로 치환하는 것을 특징으로 하는 영상 역변환 방법.
  10. 제 7항에 있어서,
    상기 역변환하는 단계는
    상기 치환된 값들을 갖는 행렬을 이용한 역변환 과정에 포함된 곱셈 연산을 쉬프트 연산, 덧셈 연산 및 뺄셈 연산으로 대체한 대체 연산을 통해 수행하는 것을 특징으로 하는 영상 역변환 방법.
  11. 제 7항에 있어서,
    상기 역양자화하는 단계는
    이산 코사인 역변환에 이용되는 원래의 NxN 역변환 행렬과 상기 치환된 NxN 역변환 행렬 사이의 차이값을 보정하기 위한 역스케일링 행렬 및 시프트 연산을 적용하여 상기 역양자화를 수행하는 단계를 더 포함하는 것을 특징으로 하는 영상 역변환 방법.
  12. 영상의 역변환 장치에 있어서,
    복호화되는 영상을 구성하는 NxN(N은 정수) 크기의 블록의 1차원 이산 코사인 역변환에 이용되는 NxN 역변환 행렬의 원소들 중 삼각함수에 기초한 값들을 소정의 유리수 값들로 치환하고, 치환된 값들을 갖는 행렬을 이용하여 상기 NxN 크기의 블록의 역양자화된 변환 계수들을 역변환하는 역변환부를 포함하는 것을 특징으로 하는 영상 역변환 장치.
  13. 제 1항 내지 제 5항에 기재된 영상 변환 방법을 구현하기 위한 프로그램이 기록된 컴퓨터로 판독가능한 기록 매체.
  14. 제 7항 내지 제 11항에 기재된 영상 역변환 방법을 구현하기 위한 프로그램이 기록된 컴퓨터로 판독가능한 기록 매체.
KR1020110038680A 2010-04-23 2011-04-25 영상의 변환 방법 및 장치, 역변환 방법 및 장치 KR20110118598A (ko)

Applications Claiming Priority (6)

Application Number Priority Date Filing Date Title
US32730810P 2010-04-23 2010-04-23
US61/327,308 2010-04-23
US33098010P 2010-05-04 2010-05-04
US61/330,980 2010-05-04
US34608210P 2010-05-19 2010-05-19
US61/346,082 2010-05-19

Publications (1)

Publication Number Publication Date
KR20110118598A true KR20110118598A (ko) 2011-10-31

Family

ID=44834704

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020110038680A KR20110118598A (ko) 2010-04-23 2011-04-25 영상의 변환 방법 및 장치, 역변환 방법 및 장치

Country Status (2)

Country Link
KR (1) KR20110118598A (ko)
WO (1) WO2011133008A2 (ko)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101423083B1 (ko) * 2013-01-16 2014-07-25 한밭대학교 산학협력단 Hevc 복호기용 역변환기 설계 방법
WO2014200322A2 (ko) * 2013-06-14 2014-12-18 삼성전자 주식회사 신호 변환 방법 및 디바이스

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116366867A (zh) * 2021-12-28 2023-06-30 中国电信股份有限公司 数据变换与恢复方法、装置、系统、电子设备及存储介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE69406306T2 (de) * 1993-11-30 1998-01-29 Polaroid Corp Verfahren zur bildskalierung und zum filtern mit diskreter cosinustransformation
JP3652717B2 (ja) * 1994-05-27 2005-05-25 株式会社ルネサステクノロジ 離散コサイン高速演算器
JP3970442B2 (ja) * 1998-11-02 2007-09-05 シャープ株式会社 離散コサイン変換装置及び逆離散コサイン変換装置
JP2007299221A (ja) * 2006-04-28 2007-11-15 Samsung Electronics Co Ltd データ処理装置

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101423083B1 (ko) * 2013-01-16 2014-07-25 한밭대학교 산학협력단 Hevc 복호기용 역변환기 설계 방법
WO2014200322A2 (ko) * 2013-06-14 2014-12-18 삼성전자 주식회사 신호 변환 방법 및 디바이스
WO2014200322A3 (ko) * 2013-06-14 2015-04-23 삼성전자 주식회사 신호 변환 방법 및 디바이스
US10511860B2 (en) 2013-06-14 2019-12-17 Samsung Electronics Co., Ltd. Signal transforming method and device

Also Published As

Publication number Publication date
WO2011133008A3 (ko) 2012-03-15
WO2011133008A2 (ko) 2011-10-27

Similar Documents

Publication Publication Date Title
EP2624561A2 (en) Method and device for the transformation and method and device for the reverse transformation of images
KR102149828B1 (ko) 비디오의 부호화 방법 및 장치, 복호화 방법 및 장치
RU2600536C2 (ru) Усовершенствованное кодирование с внутрикадровым предсказанием с использованием планарных представлений
AU2007204645B2 (en) Transforms with common factors
KR20070028951A (ko) 멀티 코덱용 변환 장치 및 방법과 멀티 코덱용 역변환 장치및 방법
KR20120098499A (ko) 영상의 변환 방법 및 장치, 및 영상의 역변환 방법 및 장치
WO2008068623A2 (en) Adaptive interpolation method and system for motion compensated predictive video coding and decoding
KR101480412B1 (ko) 영상의 변환 방법 및 장치, 역변환 방법 및 장치
KR20110118598A (ko) 영상의 변환 방법 및 장치, 역변환 방법 및 장치
AU2018200072B2 (en) Video encoding method and device and decoding method and device
Navarro et al. A full 2D IDCT with extreme low complexity
AU2015221483A1 (en) Video encoding method and device and decoding method and device
JP2013016972A (ja) 符号化装置、復号装置及びプログラム

Legal Events

Date Code Title Description
WITN Application deemed withdrawn, e.g. because no request for examination was filed or no examination fee was paid