이하, 첨부된 도면을 참조하여 본 발명의 바람직한 실시예들에 대하여 구체적으로 설명한다.
도 1은 본 발명의 일 실시예에 따른 영상 부호화 장치를 도시한다.
도 1을 참조하면, 본 발명의 일 실시예에 따른 영상 부호화 장치(100)는 예측부(110), 감산부(115), 변환부(120), 양자화부(130) 및 엔트로피 부호화부(140)를 포함한다.
예측부(110)는 입력 영상을 소정 크기의 블록들로 분할하고, 분할된 각 블록에 대하여 인터 예측 또는 인트라 예측을 통해 예측 블록을 생성한다. 구체적으로, 예측부(110)는 이전에 부호화된 후 복원된 참조 픽처의 소정 탐색 범위 내에서 현재 블록과 유사한 영역을 가리키는 움직임 벡터를 생성하는 움직임 예측 및 보상 과정을 통해 예측 블록을 생성하는 인터 예측 및 현재 블록에 인접한 주변 블록의 데이터를 이용하여 예측 블록을 생성하는 인트라 예측을 수행한다.
감산부(115)는 현재 블록의 예측 블록과 원 영상 데이터를 감산한 레지듀얼을 생성한다.
변환부(120)는 레지듀얼을 주파수 영역으로 변환한다. 특히, 본 발명의 실시예에 따른 변환부(120)는 종래 4x4, 8x8의 상대적으로 작은 크기에 대해서 정의되었던 이산 코사인 변환(discret cosine transform) 행렬을 확장하여 16x16 이상의 큰 크기의 블록에도 적용될 수 있다. 후술되는 바와 같이 본 발명의 일 실시예에 따른 변환부(120)는 N(N은 정수) 포인트 이산 코사인 변환에 이용되는 변환 행렬을 구성하는 원소들을 소정의 스케일링 팩터(scaling factor)를 이용하여 스케일링하여 정수값을 갖는 원소들로 구성된 N 포인트 이산 코사인 변환 행렬을 생성하고, 생성된 N 포인트 이산 코사인 변환 행렬을 이용하여 N 포인트 이산 코사인 변환을 수행한다. 또한, 본 발명의 일 실시예에 따른 변환부(120)는 원(original) N 포인트 이산 코사인 변환 행렬에 따른 결과값과의 차이를 고려하여, 스케일링된 원소들을 이용한 N 포인트 이산 코사인 변환 행렬의 결과값에 대하여 다시 스케일링 팩터를 이용한 디스케일링(de-scaling)을 수행한다. 후술되는 바와 같이 이러한 스케일링 및 디스케일링 과정은 스케일링 팩터가 2의 지수승(power of 2)의 값을 갖는 경우 쉬프트 연산(>>,<<)으로 구현될 수 있다. 이러한 쉬프트 연산은 곱셈 연산에 비하여 간단하게 구현될 수 있으며, 곱셈 연산에 비하여 연산 복잡도가 감소된다. 따라서, 본 발명의 실시예에 따른 변환부(120)는 큰 크기의 블록에 대한 이산 코사인 변환시에 연산 복잡도를 감소시키면서 연산 속도를 증가시킬 수 있다. 또한, 본 발명의 일 실시예에 따른 변환부(120)는 N 포인트 이산 코사인 변환 행렬에 따른 연산 과정에서 필요한 곱셈 연산의 횟수를 감소시키기 위하여, 회전 변환에 해당하는 연산들을 곱셈 연산의 횟수가 감소된 대체 연산을 통해 수행함으로써 N 포인트 이산 코사인 변환 과정에 필요한 전체 곱셈 연산의 횟수를 감소시키고 전체적인 연산 복잡도를 감소시킨다.
양자화부(130)는 변환된 레지듀얼을 양자화한다. 양자화부(130)는 양자화 과정에서 스케일링 팩터를 이용하여, 변환부(120)에서 스케일링되어 정수값을 갖는 원소들로 구성된 N 포인트 이산 코사인 변환 행렬을 이용하여 변환된 결과값과 원 N 포인트 이산 코사인 변환 행렬에 기초한 결과값의 차이를 보상하기 위한 디스케일링 과정을 수행할 수 있다. 즉, 변환부(120)에서 수행되는 디스케일링 과정은 양자화부(130)에 의한 양자화 과정에 통합될 수 있으며, 이에 대해서는 후술한다.
엔트로피 부호화부(140)는 양자화된 영상 데이터에 대하여 가변 길이 부호화를 수행하여 비트스트림을 생성한다.
이하, 도 1의 변환부(120)에서 수행되는 변환 과정에 대하여 구체적으로 설명한다.
변환부(120)는 NxN(N은 정수) 입력 블록에 대해서 열 방향 변환(column-wise transform) 및 행 방향 변환(row-wise transform)을 수행하여 NxN 변환 블록을 생성한다. NxN 입력 블록을 Input, 행 방향의 DCT 변환 행렬을 Transform_hor, 열 방향의 DCT 변환 행렬을 Transform_ver, 변환 결과값을 Output이라고 한다면, 변환부(120)은 다음의 수학식; Output=Transform_hor x Input x Transform_ver 과 같은 N 포인트 이산 코사인 변환 행렬 연산을 수행하여 변환 결과값 Output을 출력한다. 여기서, 첫 번째 행렬 곱셈 Transform_hor x Input는 N×N 입력 블록인 Input의 각 행에 대해서 1차원 수평 방향 N 포인트 이산 코사인 변환을 수행하는 것에 해당되며, Transform_hor x Input에 Transform_ver 를 곱하는 것은 1차원 N 포인트 수직 방향 이산 코사인 변환을 수행하는 것에 해당된다. 행 방향의 이산 코사인 변환 행렬 Transform_hor과 열 방향의 이산 코사인 변환 행렬 Transform_ver 는 서로 이항(transpose) 행렬 관계이다. 이하의 설명에서 행 방향 및 열 방향에 대하여 수행되는 N 포인트 이산 코사인 변환 행렬에 대하여 설명한다.
N 포인트 이산 코사인 변환 행렬의 (k,n)번째(k,n는 각각 0부터 (N-1)까지의 정수)에 위치한 원소를 Akn라고 하면, NxN 입력 블록의 변환을 위한 수직 또는 수평 방향의 N 포인트 이산 코사인 변환 행렬의 (k,n)번째의 원소 Akn은 다음의 수학식 1과 같이 정의될 수 있다.
N 포인트 이산 코사인 변환 행렬과 N 포인트 이산 코사인 역변환 행렬은 서로 이항 관계(transpose)에 있으므로, N 포인트 이산 코사인 역변환 행렬의 (k,n)번째의 원소 Bkn은 다음의 수학식 2와 같이 정의될 수 있다.
수학식 1 및 2에서 C 및 iC는 C*iC=2/(N^2)을 만족하는 계수값이다. C 및 iC를 곱하는 연산 과정은 변환 과정 이후에 양자화 과정과 결합되어 쉬프트 연산으로 구현될 수 있으므로, 이하의 설명에서는 N 포인트 변환 행렬 및 N 포인트 역변환 행렬에 포함된
성분을 정수값으로 대체하는 경우를 중심으로 설명한다. 또한, 이하의 설명에서 π는 pi로 표현될 수 있다.
도 2는 본 발명의 일 실시예에 따른 32 포인트 이산 코사인 변환의 흐름도(flow graph)의 일 예를 도시한다.
수학식 1로 정의된 원소들로 구성된 이산 코사인 변환 행렬은 도 2에 도시된 바와 같은 흐름도(200)를 통해 구현될 수 있다.
구체적으로 도 2를 참조하면, X0 내지 X31은 32 포인트 이산 코사인 변환의 입력값들을 나타낸다. Y0 내지 Y31은 32 포인트 이산 코사인 변환에 따른 결과값이다. 반대로, Y0 내지 Y31을 입력값이라고 가정하면, X0 내지 X31은 32 포인트 이산 코사인 역변환의 출력값이 된다. 즉, X0 내지 X31은 32포인트 이산 코사인 변환의 입력값들을 나타내는 동시에 32포인트 이산 코사인 역변환의 출력값이다. 32 포인트 이산 코사인 변환시에 데이터 처리 방향은 좌측에서 우측이며, 32 포인트 이산 코사인 역변환시에 데이터 처리 방향은 우측에서 좌측이다. 점에서 교차하는 2개의 라인은 2개의 수의 덧셈을 나타낸다. '-'는 부정(negation)을 나타내는 것으로, 해당 라인을 지나는 값을 X라고 하면 -X를 출력한다. 각 라인 위의 값 R(θ)는 입력값을 θ만큼 회전 변환을 수행하는 회전 변환에 해당하는 연산을 나타내는 것으로, 각 라인을 통해 입력되는 값에 cosθ 또는 sin θ의 값을 곱한 값을 가산하거나 감산하는 연산을 나타낸다. 도 2의 회전 변환 연산 과정에 대해서는 다음의 도 6을 참조하여 상세히 설명한다.
도 2에서는 32 포인트 이산 코사인 변환 행렬의 흐름도를 도시하였으나, 짝수 번째 및 홀수 번째 입력에 대한 부분을 선택함으로써 16 포인트 이산 코사인 변환의 흐름도를 획득할 수 있으며, 다시 16 포인트 이산 코사인 변환의 흐름도 중 짝수 번째 및 홀수 번째 입력에 대한 부분을 선택함으로써 8 포인트 이산 코사인 변환의 흐름도를 획득할 수 있다. 유사하게, 도 2의 흐름도로부터 4 포인트 이산 코사인 변환 및 2 포인트 이산 코사인 변환의 흐름도를 획득할 수 있다.
도 2에서 일부 라인에 표시된 R(θ)는 입력값을 θ만큼 회전 변환을 수행하는 연산에 나타낸다. 예를 들어, 도 2의 도면 부호 210으로 도시된 부분의 연산 과정을 도 6을 참조하여 설명한다.
도 6은 도 2의 32 포인트 이산 코사인 변환 행렬에 포함된 회전 변환 연산 과정을 설명하기 위한 참조도이다.
도 6을 참조하면, 도 2의 도면 부호 210으로 도시된 연산은 입력값 [X1,X2]에 대해서 다음의 수학식;
과 같은 연산을 통해 출력값 [Y1, Y2]를 출력하는 것이다. 이와 같은 연산은 (x1,x2)의 값을 θ만큼 회전한 값을 출력하는 회전 변환 연산에 해당한다.
도 2의 흐름도에 따라서 N 포인트 이산 코사인 변환을 수행하는 경우, R(θ)에 따라서 cosθ 및 sinθ와 입력된 값과의 곱셈 연산이 수행된다. θ가 0, pi/2, pi/3, pi/6인 특정한 경우를 제외하고 cos θ 및 sinθ는 무리수(irrational number)이기 때문에 cos θ 및 sinθ를 이용한 곱셈 연산 과정은 하드웨어로 구현시에 복잡도를 증가시킨다. 따라서, 본 발명의 일 실시예에 따른 변환부(120)는 이산 코사인 변환 연산 행렬에 포함된 원소들에 소정의 스케일링 팩터를 곱한 다음 반올림하여 정수값을 갖는 원소들로 구성된 이산 코사인 변환 행렬을 생성하고, 이산 코사인 변환 결과값을 다시 스케일링 팩터를 이용하여 디스케일링하는 과정을 수행한다.
이하, 본 발명의 일 실시예에 따라서 정수값을 갖는 원소들로 구성된 이산 코사인 변환 행렬을 생성하는 과정에 대하여 구체적으로 설명한다.
도 3은 본 발명의 일 실시예에 따른 영상 변환 방법을 나타낸 플로우 차트이다.
도 1 및 3을 참조하면, 단계 310에서 변환부(120)는 N 포인트 이산 코사인 변환 행렬을 구성하는 각 원소들에 소정의 스케일링 팩터(scaling factor) S를 곱한 후 반올림하여 정수값을 갖는 원소들을 획득한다.
전술한 바와 같이, N 포인트 이산 코사인 변환 행렬은
인 성분을 포함한다. 변환부(120)는 이러한
에 소정의 스케일링 팩터 S를 곱한 다음 반올림하여 정수값을 획득한다. int(x)(x는 실수)를 x를 반올림한 정수값, sqrt(x)는 x의 제곱근, S를 스케일링 팩터라고 하면, 변환부(120)에 의하여 N 포인트 이산 코사인 변환 행렬에 포함된
을 정수값으로 변환한 원소는 int(cos((2n+1)k)*sqrt(2.0)*S)로 표현되며, 이러한 정수값으로 변환된 원소 int(cos((2n+1)k)*sqrt(2.0)*S)를 COS_((2n+1)k)_SQRT_2로 나타낸다고 정의한다. 일 예로 32 포인트 이산 코사인 변환 행렬에 포함된
에 스케일링 팩터 S를 곱하여 반올림한 정수값을 획득하는 경우, 다음의 표 1에 정의된 바와 같이
를 정수값으로 변환한 원소가 정의된다.
표 1
기호 | 스케일링된 32 포인트 이산 코사인 변환 행렬의 원소 | 예시적인 값 |
SQRT_2 | int(sqrt(2.0) * S ) | 90 |
COS8_SQRT_2 | int(cos( 8*pi/64) *sqrt(2.0) * S) | 83 |
COS16_SQRT_2 | int(cos( 16*pi/64) *sqrt(2.0) * S) | 64 |
COS24_SQRT_2 | int(cos( 24*pi/64) *sqrt(2.0) * S) | 36 |
COS4_SQRT_2 | int(cos( 4*pi/64) * S) | 63 |
COS12_SQRT_2 | int(cos( 12*pi/64) * S) | 53 |
COS20_SQRT_2 | int(cos( 20*pi/64) * S) | 36 |
COS28_SQRT_2 | int(cos( 28*pi/64) * S) | 12 |
COS2_SQRT_2 | int(cos(2*pi/64) * S) | 64 |
COS6_SQRT_2 | int(cos( 6*pi/64) * S) | 61 |
COS10_SQRT_2 | int(cos( 10*pi/64) * S) | 56 |
COS14_SQRT_2 | int(cos( 14*pi/64) * S) | 49 |
COS18_SQRT_2 | int(cos( 18*pi/64) * S) | 41 |
COS22_SQRT_2 | int(cos( 22*pi/64) * S) | 30 |
COS26_SQRT_2 | int(cos( 26*pi/64) * S) | 19 |
COS30_SQRT_2 | int(cos( 30*pi/64) * S) | 6 |
COS1_SQRT_2 | int(cos( 1*pi/64) * S) | 64 |
COS3_SQRT_2 | int(cos( 3*pi/64) * S) | 63 |
COS5_SQRT_2 | int(cos( 5*pi/64) * S) | 62 |
COS7_SQRT_2 | int(cos( 7*pi/64) * S) | 60 |
COS9_SQRT_2 | int(cos( 9*pi/64) * S) | 58 |
COS11_SQRT_2 | int(cos( 11*pi/64) * S) | 55 |
COS13_SQRT_2 | int(cos( 13*pi/64) * S) | 51 |
COS15_SQRT_2 | int(cos(15*pi/64) * S) | 47 |
COS17_SQRT_2 | int(cos( 17*pi/64) * S) | 43 |
COS19_SQRT_2 | int(cos( 19*pi/64) * S) | 38 |
COS21_SQRT_2 | int(cos( 21*pi/64) * S) | 33 |
COS23_SQRT_2 | int(cos( 23*pi/64) * S) | 27 |
COS25_SQRT_2 | int(cos( 25*pi/64) * S) | 22 |
COS27_SQRT_2 | int(cos( 27*pi/64) * S) | 16 |
COS29_SQRT_2 | int(cos( 29*pi/64) * S) | 9 |
COS31_SQRT_2 | int(cos( 31*pi/64) * S) | 3 |
COS4_SQRT_2 | int(cos( 4*pi/64) *sqrt(2.0) * S) | 89 |
COS12_SQRT_2 | int(cos( 12*pi/64) *sqrt(2.0) * S) | 75 |
COS20_SQRT_2 | int(cos( 20*pi/64) *sqrt(2.0) * S) | 50 |
COS28_SQRT_2 | int(cos( 28*pi/64) *sqrt(2.0) * S) | 18 |
표 1에서 SQRT_2는
에서 k가 0의 값을 갖는 경우, 즉
를 정수값으로 변환한 원소를 나타낸다. 표 1에서는 스케일링 팩터 S는 2^6, 즉 64의 값을 갖는 경우,
대신에 이용되는 정수값을 예시하고 있다. 예를 들어, cos(7*pi/64)*64는 약 60.2588의 값을 가지며, 이를 반올림하면 60의 값을 갖는다. 따라서, 변환부(120)는 cos(7*pi/64)*64 대신에 cos(7*pi/64)*64를 반올림한 값인 COS7_SQRT_2(=60)를 이용하여 변환을 수행한다.
변환부(120)는 이와 같이 N 포인트 이산 코사인 변환 행렬의 원소들에 스케일링 팩터 S를 곱한 다음 반올림한 값에 대하여 다시 스케일링 팩터 S를 이용한 좌향 쉬프트 연산(<<)을 수행한다. S_BIT 를 log2S 라고 정의하면, 변환부(120)는 COS_((2n+1)k)_SQRT_2를 다시 S_BIT 만큼 좌향 쉬프트(<<)하여 N 포인트 이산 코사인 변환 행렬을 획득한다. S=1<<S_BIT 이므로, COS_((2n+1)k)_SQRT_2를 다시 S_BIT 만큼 좌향 쉬프트(<<)하는 연산은 결국 S를 곱하는 연산에 해당한다. 따라서, 본 발명의 일 실시예에 따른 변환부(120)는 N 포인트 이산 코사인 변환 행렬의 원소들에 S를 곱한 후 반올림한 값에 다시 S를 곱함으로써 결과적으로 S^2만큼 N 포인트 이산 코사인 변환 행렬의 원소들을 스케일링하게 된다. 이와 같은 스케일링 과정을 통해 획득된 4 포인트 이산 코사인 변환 행렬인 DCT_4x4[4][4], 8 포인트 이산 코사인 변환 행렬인 DCT_8x8[8][8], 16 포인트 이산 코사인 변환 행렬인 DCT_16x16[16][16], 32 포인트 이산 코사인 변환 행렬인 DCT_32x32[32][32]을 표 1에 기재된 바와 같은 기호를 이용하여 표현하면 다음과 같다.
DCT_4x4[4][4] = {
{ COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT},
{ COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT },
{ COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT},
{ COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT }
};
DCT_8x8[8][8] = {
{ COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT
{ (COS12+COS20)<<S_BIT, (COS4+COS28)<<S_BIT, (COS4-COS28)<<S_BIT, (COS12-COS20)<<S_BIT,-((COS12-COS20)<<S_BIT),-((COS4-COS28)<<S_BIT),-((COS4+COS28)<<S_BIT),-((COS12+COS20)<<S_BIT)},
{ COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT},
{ COS12*SQRT_2,-COS28*SQRT_2,-COS4*SQRT_2,-COS20*SQRT_2, COS20*SQRT_2, COS4*SQRT_2, COS28*SQRT_2,-COS12*SQRT_2},
{ COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT},
{ COS20*SQRT_2,-COS4*SQRT_2, COS28*SQRT_2, COS12*SQRT_2,-COS12*SQRT_2,-COS28*SQRT_2, COS4*SQRT_2,-COS20*SQRT_2},
{ COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT},
{ (COS12-COS20)<<S_BIT,-((COS4-COS28)<<S_BIT), (COS4+COS28)<<S_BIT,-((COS12+COS20)<<S_BIT), (COS12+COS20)<<S_BIT,-((COS4+COS28)<<S_BIT), (COS4-COS28)<<S_BIT,-((COS12-COS20)<<S_BIT)}
};
DCT_16x16[16][16] = {
{ COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT},
{ (COS14+COS18)<<S_BIT, (COS10+COS22)<<S_BIT, (COS6+COS26)<<S_BIT, (COS2+COS30)<<S_BIT, (COS2-COS30)<<S_BIT, (COS6-COS26)<<S_BIT, (COS10-COS22)<<S_BIT, (COS14-COS18)<<S_BIT, -(COS14-COS18)<<S_BIT,-(COS10-COS22)<<S_BIT,-(COS6-COS26)<<S_BIT,-(COS2-COS30)<<S_BIT,-(COS2+COS30)<<S_BIT,-(COS6+COS26)<<S_BIT,-(COS10+COS22)<<S_BIT,-(COS14+COS18)<<S_BIT},
{ ((COS12+COS20)<<S_BIT), ((COS4+COS28)<<S_BIT), ((COS4-COS28)<<S_BIT), ((COS12-COS20)<<S_BIT),-((COS12-COS20)<<S_BIT),-((COS4-COS28)<<S_BIT),-((COS4+COS28)<<S_BIT),-((COS12+COS20)<<S_BIT),-((COS12+COS20)<<S_BIT),-((COS4+COS28)<<S_BIT),-((COS4-COS28)<<S_BIT),-((COS12-COS20)<<S_BIT), ((COS12-COS20)<<S_BIT), ((COS4-COS28)<<S_BIT), ((COS4+COS28)<<S_BIT), ((COS12+COS20)<<S_BIT)},
{ (COS24_SQRT_2*COS18+COS8_SQRT_2*COS14), (COS10*COS8_SQRT_2-COS22*COS24_SQRT_2), (COS6*COS24_SQRT_2-COS8_SQRT_2*COS26),-(COS30*COS8_SQRT_2+COS2*COS24_SQRT_2),-(COS2*COS8_SQRT_2-COS24_SQRT_2*COS30),-(COS24_SQRT_2*COS26+COS8_SQRT_2*COS6),-(COS10*COS24_SQRT_2+COS22*COS8_SQRT_2),-(COS18*COS8_SQRT_2-COS14*COS24_SQRT_2), (COS18*COS8_SQRT_2-COS14*COS24_SQRT_2), (COS10*COS24_SQRT_2+COS22*COS8_SQRT_2), (COS24_SQRT_2*COS26+COS8_SQRT_2*COS6), (COS2*COS8_SQRT_2-COS24_SQRT_2*COS30), (COS30*COS8_SQRT_2+COS2*COS24_SQRT_2), -(COS6*COS24_SQRT_2-COS8_SQRT_2*COS26),-(COS10*COS8_SQRT_2-COS22*COS24_SQRT_2),-(COS24_SQRT_2*COS18+COS8_SQRT_2*COS14)},
{ COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT},
{ (COS24_SQRT_2*COS14+COS8_SQRT_2*COS18), (COS8_SQRT_2*COS22-COS24_SQRT_2*COS10),-(COS8_SQRT_2*COS6-COS24_SQRT_2*COS26),-(COS24_SQRT_2*COS30+COS8_SQRT_2*COS2),-(COS24_SQRT_2*COS2-COS8_SQRT_2*COS30), (COS24_SQRT_2*COS6+COS8_SQRT_2*COS26), (COS22*COS24_SQRT_2+COS8_SQRT_2*COS10), (-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(COS22*COS24_SQRT_2+COS8_SQRT_2*COS10),-(COS24_SQRT_2*COS6+COS8_SQRT_2*COS26), (COS24_SQRT_2*COS2-COS8_SQRT_2*COS30), (COS24_SQRT_2*COS30+COS8_SQRT_2*COS2), (COS8_SQRT_2*COS6-COS24_SQRT_2*COS26), -(COS8_SQRT_2*COS22-COS24_SQRT_2*COS10),-(COS24_SQRT_2*COS14+COS8_SQRT_2*COS18)},
{ COS12*SQRT_2,-COS28*SQRT_2,-COS4*SQRT_2,-COS20*SQRT_2, COS20*SQRT_2, COS4*SQRT_2, COS28*SQRT_2,-COS12*SQRT_2,-COS12*SQRT_2, COS28*SQRT_2, COS4*SQRT_2, COS20*SQRT_2,-COS20*SQRT_2,-COS4*SQRT_2,-COS28*SQRT_2, COS12*SQRT_2},
{ COS14*SQRT_2,-COS22*SQRT_2,-COS6*SQRT_2, COS30*SQRT_2, COS2*SQRT_2, COS26*SQRT_2,-COS10*SQRT_2,-COS18*SQRT_2, COS18*SQRT_2, COS10*SQRT_2,-COS26*SQRT_2,-COS2*SQRT_2, -COS30*SQRT_2, COS6*SQRT_2, COS22*SQRT_2,-COS14*SQRT_2},
{ COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT},
{ COS18*SQRT_2,-COS10*SQRT_2,-COS26*SQRT_2, COS2*SQRT_2, -COS30*SQRT_2,-COS6*SQRT_2, COS22*SQRT_2, COS14*SQRT_2,-COS14*SQRT_2,-COS22*SQRT_2, COS6*SQRT_2, COS30*SQRT_2,-COS2*SQRT_2, COS26*SQRT_2, COS10*SQRT_2,-COS18*SQRT_2},
{ COS20*SQRT_2,-COS4*SQRT_2, COS28*SQRT_2, COS12*SQRT_2,-COS12*SQRT_2,-COS28*SQRT_2, COS4*SQRT_2,-COS20*SQRT_2,-COS20*SQRT_2, COS4*SQRT_2,-COS28*SQRT_2,-COS12*SQRT_2, COS12*SQRT_2, COS28*SQRT_2,-COS4*SQRT_2, COS20*SQRT_2},
{ (-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(COS22*COS24_SQRT_2+COS8_SQRT_2*COS10), (COS24_SQRT_2*COS6+COS8_SQRT_2*COS26), (COS24_SQRT_2*COS2-COS8_SQRT_2*COS30),-(COS24_SQRT_2*COS30+COS8_SQRT_2*COS2), (COS8_SQRT_2*COS6-COS24_SQRT_2*COS26), (COS8_SQRT_2*COS22-COS24_SQRT_2*COS10),-(COS24_SQRT_2*COS14+COS8_SQRT_2*COS18), (COS24_SQRT_2*COS14+COS8_SQRT_2*COS18), -(COS8_SQRT_2*COS22-COS24_SQRT_2*COS10),-(COS8_SQRT_2*COS6-COS24_SQRT_2*COS26), (COS24_SQRT_2*COS30+COS8_SQRT_2*COS2),-(COS24_SQRT_2*COS2-COS8_SQRT_2*COS30),-(COS24_SQRT_2*COS6+COS8_SQRT_2*COS26), (COS22*COS24_SQRT_2+COS8_SQRT_2*COS10),-(-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14)},
{ COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT},
{ (COS18*COS8_SQRT_2-COS14*COS24_SQRT_2),-(COS10*COS24_SQRT_2+COS22*COS8_SQRT_2), (COS24_SQRT_2*COS26+COS8_SQRT_2*COS6),-(COS2*COS8_SQRT_2-COS24_SQRT_2*COS30), (COS30*COS8_SQRT_2+COS2*COS24_SQRT_2), (COS6*COS24_SQRT_2-COS8_SQRT_2*COS26),-(COS10*COS8_SQRT_2-COS22*COS24_SQRT_2), (COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(COS24_SQRT_2*COS18+COS8_SQRT_2*COS14), (COS10*COS8_SQRT_2-COS22*COS24_SQRT_2), -(COS6*COS24_SQRT_2-COS8_SQRT_2*COS26),-(COS30*COS8_SQRT_2+COS2*COS24_SQRT_2), (COS2*COS8_SQRT_2-COS24_SQRT_2*COS30),-(COS24_SQRT_2*COS26+COS8_SQRT_2*COS6), (COS10*COS24_SQRT_2+COS22*COS8_SQRT_2),-(COS18*COS8_SQRT_2-COS14*COS24_SQRT_2)},
{ ((COS12-COS20)<<S_BIT),-((COS4-COS28)<<S_BIT), ((COS4+COS28)<<S_BIT),-((COS12+COS20)<<S_BIT), ((COS12+COS20)<<S_BIT),-((COS4+COS28)<<S_BIT), ((COS4-COS28)<<S_BIT),-((COS12-COS20)<<S_BIT),-((COS12-COS20)<<S_BIT), ((COS4-COS28)<<S_BIT),-((COS4+COS28)<<S_BIT), ((COS12+COS20)<<S_BIT),-((COS12+COS20)<<S_BIT), ((COS4+COS28)<<S_BIT),-((COS4-COS28)<<S_BIT), ((COS12-COS20)<<S_BIT)},
{ (COS14-COS18)<<S_BIT,-(COS10-COS22)<<S_BIT, (COS6-COS26)<<S_BIT,-(COS2-COS30)<<S_BIT, (COS2+COS30)<<S_BIT,-(COS6+COS26)<<S_BIT, (COS10+COS22)<<S_BIT,-(COS14+COS18)<<S_BIT, (COS14+COS18)<<S_BIT,-(COS10+COS22)<<S_BIT, (COS6+COS26)<<S_BIT,-(COS2+COS30)<<S_BIT, (COS2-COS30)<<S_BIT,-(COS6-COS26)<<S_BIT, (COS10-COS22)<<S_BIT, -(COS14-COS18)<<S_BIT}
};
DCT_32x32[32][32] = {
{ COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT},
{ COS16_SQRT_2*COS17 + COS16_SQRT_2*COS15, COS13*COS16_SQRT_2 + COS19*COS16_SQRT_2, COS16_SQRT_2*COS21 + COS16_SQRT_2*COS11, COS16_SQRT_2*COS9 + COS16_SQRT_2*COS23, COS16_SQRT_2*COS25 + COS16_SQRT_2*COS7, COS16_SQRT_2*COS5 + COS16_SQRT_2*COS27, COS16_SQRT_2*COS29 + COS16_SQRT_2*COS3, COS1*COS16_SQRT_2 + COS31*COS16_SQRT_2, COS1*COS16_SQRT_2 - COS16_SQRT_2*COS31, COS16_SQRT_2*COS3 - COS29*COS16_SQRT_2, COS5*COS16_SQRT_2 - COS16_SQRT_2*COS27, COS16_SQRT_2*COS7 - COS25*COS16_SQRT_2, COS9*COS16_SQRT_2 - COS16_SQRT_2*COS23, COS16_SQRT_2*COS11 - COS21*COS16_SQRT_2, COS13*COS16_SQRT_2 - COS16_SQRT_2*COS19, COS16_SQRT_2*COS15 - COS17*COS16_SQRT_2, COS17*COS16_SQRT_2 - COS16_SQRT_2*COS15, COS16_SQRT_2*COS19 - COS13*COS16_SQRT_2, COS21*COS16_SQRT_2 - COS16_SQRT_2*COS11, COS16_SQRT_2*COS23 - COS9*COS16_SQRT_2, COS25*COS16_SQRT_2 - COS16_SQRT_2*COS7, COS16_SQRT_2*COS27 - COS5*COS16_SQRT_2, COS29*COS16_SQRT_2 - COS16_SQRT_2*COS3, COS16_SQRT_2*COS31 - COS1*COS16_SQRT_2, - COS1*COS16_SQRT_2 - COS31*COS16_SQRT_2, - COS16_SQRT_2*COS29 - COS16_SQRT_2*COS3, - COS16_SQRT_2*COS5 - COS16_SQRT_2*COS27, - COS16_SQRT_2*COS25 - COS16_SQRT_2*COS7, - COS16_SQRT_2*COS9 - COS16_SQRT_2*COS23, - COS16_SQRT_2*COS21 - COS16_SQRT_2*COS11, - COS13*COS16_SQRT_2 - COS19*COS16_SQRT_2, - COS16_SQRT_2*COS17 - COS16_SQRT_2*COS15},
{ (COS14+COS18)<<S_BIT, (COS10+COS22)<<S_BIT, (COS6+COS26)<<S_BIT, (COS2+COS30)<<S_BIT, (COS2-COS30)<<S_BIT, (COS6-COS26)<<S_BIT, (COS10-COS22)<<S_BIT, (COS14-COS18)<<S_BIT, -(COS14-COS18)<<S_BIT,-(COS10-COS22)<<S_BIT,-(COS6-COS26)<<S_BIT,-(COS2-COS30)<<S_BIT,-(COS2+COS30)<<S_BIT,-(COS6+COS26)<<S_BIT,-(COS10+COS22)<<S_BIT,-(COS14+COS18)<<S_BIT,-(COS14+COS18)<<S_BIT,-(COS10+COS22)<<S_BIT,-(COS6+COS26)<<S_BIT,-(COS2+COS30)<<S_BIT,-(COS2-COS30)<<S_BIT,-(COS6-COS26)<<S_BIT,-(COS10-COS22)<<S_BIT, -(COS14-COS18)<<S_BIT, (COS14-COS18)<<S_BIT, (COS10-COS22)<<S_BIT, (COS6-COS26)<<S_BIT, (COS2-COS30)<<S_BIT, (COS2+COS30)<<S_BIT, (COS6+COS26)<<S_BIT, (COS10+COS22)<<S_BIT, (COS14+COS18)<<S_BIT},
{ COS12_SQRT_2*COS15 + COS17*COS20_SQRT_2, COS13*COS4_SQRT_2 + COS19*COS28_SQRT_2, COS4_SQRT_2*COS11 - COS21*COS28_SQRT_2, COS12_SQRT_2*COS9 - COS20_SQRT_2*COS23, COS20_SQRT_2*COS7 - COS12_SQRT_2*COS25, COS5*COS28_SQRT_2 - COS4_SQRT_2*COS27, - COS29*COS4_SQRT_2 - COS3*COS28_SQRT_2, - COS1*COS20_SQRT_2 - COS12_SQRT_2*COS31, COS31*COS20_SQRT_2 - COS1*COS12_SQRT_2, COS29*COS28_SQRT_2 - COS4_SQRT_2*COS3, - COS4_SQRT_2*COS5 - COS28_SQRT_2*COS27, - COS12_SQRT_2*COS7 - COS25*COS20_SQRT_2, - COS12_SQRT_2*COS23 - COS9*COS20_SQRT_2, - COS21*COS4_SQRT_2 - COS11*COS28_SQRT_2, COS13*COS28_SQRT_2 - COS4_SQRT_2*COS19, COS20_SQRT_2*COS15 - COS12_SQRT_2*COS17, COS12_SQRT_2*COS17 - COS20_SQRT_2*COS15, COS4_SQRT_2*COS19 - COS13*COS28_SQRT_2, COS21*COS4_SQRT_2 + COS11*COS28_SQRT_2, COS12_SQRT_2*COS23 + COS9*COS20_SQRT_2, COS12_SQRT_2*COS7 + COS25*COS20_SQRT_2, COS4_SQRT_2*COS5 + COS28_SQRT_2*COS27, COS4_SQRT_2*COS3 - COS29*COS28_SQRT_2, COS1*COS12_SQRT_2 - COS31*COS20_SQRT_2, COS1*COS20_SQRT_2 + COS12_SQRT_2*COS31, COS29*COS4_SQRT_2 + COS3*COS28_SQRT_2, COS4_SQRT_2*COS27 - COS5*COS28_SQRT_2, COS12_SQRT_2*COS25 - COS20_SQRT_2*COS7, COS20_SQRT_2*COS23 - COS12_SQRT_2*COS9, COS21*COS28_SQRT_2 - COS4_SQRT_2*COS11, - COS13*COS4_SQRT_2 - COS19*COS28_SQRT_2, - COS12_SQRT_2*COS15 - COS17*COS20_SQRT_2},
{ ((COS12+COS20)<<S_BIT), ((COS4+COS28)<<S_BIT), ((COS4-COS28)<<S_BIT), ((COS12-COS20)<<S_BIT),-((COS12-COS20)<<S_BIT),-((COS4-COS28)<<S_BIT),-((COS4+COS28)<<S_BIT),-((COS12+COS20)<<S_BIT),-((COS12+COS20)<<S_BIT),-((COS4+COS28)<<S_BIT),-((COS4-COS28)<<S_BIT),-((COS12-COS20)<<S_BIT), ((COS12-COS20)<<S_BIT), ((COS4-COS28)<<S_BIT), ((COS4+COS28)<<S_BIT), ((COS12+COS20)<<S_BIT), ((COS12+COS20)<<S_BIT), ((COS4+COS28)<<S_BIT), ((COS4-COS28)<<S_BIT), ((COS12-COS20)<<S_BIT),-((COS12-COS20)<<S_BIT),-((COS4-COS28)<<S_BIT),-((COS4+COS28)<<S_BIT),-((COS12+COS20)<<S_BIT),-((COS12+COS20)<<S_BIT),-((COS4+COS28)<<S_BIT),-((COS4-COS28)<<S_BIT),-((COS12-COS20)<<S_BIT), ((COS12-COS20)<<S_BIT), ((COS4-COS28)<<S_BIT), ((COS4+COS28)<<S_BIT), ((COS12+COS20)<<S_BIT)},
{ (COS17*COS4 - COS15*COS28) + (COS17*COS28 + COS4*COS15), (COS12*COS13 + COS20*COS19) + (COS12*COS19 - COS13*COS20), (COS12*COS21 + COS20*COS11) - (COS12*COS11 - COS21*COS20), (COS4*COS23 + COS9*COS28) - (COS4*COS9 - COS28*COS23), (COS25*COS4 - COS7*COS28) - (COS25*COS28 + COS4*COS7), (COS12*COS27 - COS5*COS20) - (COS12*COS5 + COS20*COS27), - (COS12*COS29 + COS20*COS3) - (COS12*COS3 - COS29*COS20), - (COS1*COS4 - COS31*COS28) - (COS1*COS28 + COS4*COS31), (COS1*COS28 + COS4*COS31) - (COS1*COS4 - COS31*COS28), (COS12*COS29 + COS20*COS3) - (COS12*COS3 - COS29*COS20), (COS12*COS5 + COS20*COS27) + (COS12*COS27 - COS5*COS20), (COS25*COS4 - COS7*COS28) + (COS25*COS28 + COS4*COS7), (COS4*COS9 - COS28*COS23) + (COS4*COS23 + COS9*COS28), (COS12*COS21 + COS20*COS11) + (COS12*COS11 - COS21*COS20), (COS12*COS13 + COS20*COS19) - (COS12*COS19 - COS13*COS20), (COS17*COS28 + COS4*COS15) - (COS17*COS4 - COS15*COS28), (COS17*COS4 - COS15*COS28) - (COS17*COS28 + COS4*COS15), (COS12*COS19 - COS13*COS20) - (COS12*COS13 + COS20*COS19), - (COS12*COS21 + COS20*COS11) - (COS12*COS11 - COS21*COS20), - (COS4*COS9 - COS28*COS23) - (COS4*COS23 + COS9*COS28), - (COS25*COS4 - COS7*COS28) - (COS25*COS28 + COS4*COS7), - (COS12*COS5 + COS20*COS27) - (COS12*COS27 - COS5*COS20), (COS12*COS3 - COS29*COS20) - (COS12*COS29 + COS20*COS3), (COS1*COS4 - COS31*COS28) - (COS1*COS28 + COS4*COS31), (COS1*COS4 - COS31*COS28) + (COS1*COS28 + COS4*COS31), (COS12*COS29 + COS20*COS3) + (COS12*COS3 - COS29*COS20), (COS12*COS5 + COS20*COS27) - (COS12*COS27 - COS5*COS20), (COS25*COS28 + COS4*COS7) - (COS25*COS4 - COS7*COS28), (COS4*COS9 - COS28*COS23) - (COS4*COS23 + COS9*COS28), (COS12*COS11 - COS21*COS20) - (COS12*COS21 + COS20*COS11), - (COS12*COS13 + COS20*COS19) - (COS12*COS19 - COS13*COS20), - (COS17*COS4 - COS15*COS28) - (COS17*COS28 + COS4*COS15)},
{ (COS24_SQRT_2*COS18+COS8_SQRT_2*COS14), (COS10*COS8_SQRT_2-COS22*COS24_SQRT_2), (COS6*COS24_SQRT_2-COS8_SQRT_2*COS26),-(COS30*COS8_SQRT_2+COS2*COS24_SQRT_2),-(COS2*COS8_SQRT_2-COS24_SQRT_2*COS30),-(COS24_SQRT_2*COS26+COS8_SQRT_2*COS6),-(COS10*COS24_SQRT_2+COS22*COS8_SQRT_2),-(COS18*COS8_SQRT_2-COS14*COS24_SQRT_2), (COS18*COS8_SQRT_2-COS14*COS24_SQRT_2), (COS10*COS24_SQRT_2+COS22*COS8_SQRT_2), (COS24_SQRT_2*COS26+COS8_SQRT_2*COS6), (COS2*COS8_SQRT_2-COS24_SQRT_2*COS30), (COS30*COS8_SQRT_2+COS2*COS24_SQRT_2), -(COS6*COS24_SQRT_2-COS8_SQRT_2*COS26),-(COS10*COS8_SQRT_2-COS22*COS24_SQRT_2),-(COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(COS10*COS8_SQRT_2-COS22*COS24_SQRT_2), -(COS6*COS24_SQRT_2-COS8_SQRT_2*COS26), (COS30*COS8_SQRT_2+COS2*COS24_SQRT_2), (COS2*COS8_SQRT_2-COS24_SQRT_2*COS30), (COS24_SQRT_2*COS26+COS8_SQRT_2*COS6), (COS10*COS24_SQRT_2+COS22*COS8_SQRT_2), (COS18*COS8_SQRT_2-COS14*COS24_SQRT_2),-(COS18*COS8_SQRT_2-COS14*COS24_SQRT_2),-(COS10*COS24_SQRT_2+COS22*COS8_SQRT_2),-(COS24_SQRT_2*COS26+COS8_SQRT_2*COS6),-(COS2*COS8_SQRT_2-COS24_SQRT_2*COS30),-(COS30*COS8_SQRT_2+COS2*COS24_SQRT_2), (COS6*COS24_SQRT_2-COS8_SQRT_2*COS26), (COS10*COS8_SQRT_2-COS22*COS24_SQRT_2), (COS24_SQRT_2*COS18+COS8_SQRT_2*COS14)},
{ COS17*COS24_SQRT_2 + COS8_SQRT_2*COS15, COS13*COS8_SQRT_2 - COS19*COS24_SQRT_2, COS11*COS24_SQRT_2 - COS21*COS8_SQRT_2, - COS8_SQRT_2*COS23 - COS9*COS24_SQRT_2, - COS25*COS24_SQRT_2 - COS8_SQRT_2*COS7, COS27*COS24_SQRT_2 - COS5*COS8_SQRT_2, COS29*COS8_SQRT_2 - COS3*COS24_SQRT_2, COS1*COS24_SQRT_2 + COS8_SQRT_2*COS31, COS1*COS8_SQRT_2 - COS31*COS24_SQRT_2, COS29*COS24_SQRT_2 + COS8_SQRT_2*COS3, COS5*COS24_SQRT_2 + COS8_SQRT_2*COS27, COS25*COS8_SQRT_2 - COS7*COS24_SQRT_2, COS24_SQRT_2*COS23 - COS8_SQRT_2*COS9, - COS21*COS24_SQRT_2 - COS8_SQRT_2*COS11, - COS13*COS24_SQRT_2 - COS8_SQRT_2*COS19, COS15*COS24_SQRT_2 - COS17*COS8_SQRT_2, COS17*COS8_SQRT_2 - COS15*COS24_SQRT_2, COS13*COS24_SQRT_2 + COS8_SQRT_2*COS19, COS21*COS24_SQRT_2 + COS8_SQRT_2*COS11, COS8_SQRT_2*COS9 - COS24_SQRT_2*COS23, COS7*COS24_SQRT_2 - COS25*COS8_SQRT_2, - COS5*COS24_SQRT_2 - COS8_SQRT_2*COS27, - COS29*COS24_SQRT_2 - COS8_SQRT_2*COS3, COS31*COS24_SQRT_2 - COS1*COS8_SQRT_2, - COS1*COS24_SQRT_2 - COS8_SQRT_2*COS31, COS3*COS24_SQRT_2 - COS29*COS8_SQRT_2, COS5*COS8_SQRT_2 - COS27*COS24_SQRT_2, COS25*COS24_SQRT_2 + COS8_SQRT_2*COS7, COS8_SQRT_2*COS23 + COS9*COS24_SQRT_2, COS21*COS8_SQRT_2 - COS11*COS24_SQRT_2, COS19*COS24_SQRT_2 - COS13*COS8_SQRT_2, - COS17*COS24_SQRT_2 - COS8_SQRT_2*COS15},
{ COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT},
{ COS17*COS8_SQRT_2 + COS15*COS24_SQRT_2, COS8_SQRT_2*COS19 - COS13*COS24_SQRT_2, COS21*COS24_SQRT_2 - COS8_SQRT_2*COS11, - COS8_SQRT_2*COS9 - COS24_SQRT_2*COS23, - COS25*COS8_SQRT_2 - COS7*COS24_SQRT_2, COS5*COS24_SQRT_2 - COS8_SQRT_2*COS27, COS8_SQRT_2*COS3 - COS29*COS24_SQRT_2, COS1*COS8_SQRT_2 + COS31*COS24_SQRT_2, COS1*COS24_SQRT_2 - COS8_SQRT_2*COS31, - COS29*COS8_SQRT_2 - COS3*COS24_SQRT_2, - COS5*COS8_SQRT_2 - COS27*COS24_SQRT_2, COS25*COS24_SQRT_2 - COS8_SQRT_2*COS7, COS8_SQRT_2*COS23 - COS9*COS24_SQRT_2, COS21*COS8_SQRT_2 + COS11*COS24_SQRT_2, COS13*COS8_SQRT_2 + COS19*COS24_SQRT_2, COS8_SQRT_2*COS15 - COS17*COS24_SQRT_2, COS17*COS24_SQRT_2 - COS8_SQRT_2*COS15, - COS13*COS8_SQRT_2 - COS19*COS24_SQRT_2, - COS21*COS8_SQRT_2 - COS11*COS24_SQRT_2, COS9*COS24_SQRT_2 - COS8_SQRT_2*COS23, COS8_SQRT_2*COS7 - COS25*COS24_SQRT_2, COS5*COS8_SQRT_2 + COS27*COS24_SQRT_2, COS29*COS8_SQRT_2 + COS3*COS24_SQRT_2, COS8_SQRT_2*COS31 - COS1*COS24_SQRT_2, - COS1*COS8_SQRT_2 - COS31*COS24_SQRT_2, COS29*COS24_SQRT_2 - COS8_SQRT_2*COS3, COS8_SQRT_2*COS27 - COS5*COS24_SQRT_2, COS25*COS8_SQRT_2 + COS7*COS24_SQRT_2, COS8_SQRT_2*COS9 + COS24_SQRT_2*COS23, COS8_SQRT_2*COS11 - COS21*COS24_SQRT_2, COS13*COS24_SQRT_2 - COS8_SQRT_2*COS19, - COS17*COS8_SQRT_2 - COS15*COS24_SQRT_2},
{ (COS24_SQRT_2*COS14+COS8_SQRT_2*COS18), (COS8_SQRT_2*COS22-COS24_SQRT_2*COS10),-(COS8_SQRT_2*COS6-COS24_SQRT_2*COS26),-(COS24_SQRT_2*COS30+COS8_SQRT_2*COS2),-(COS24_SQRT_2*COS2-COS8_SQRT_2*COS30), (COS24_SQRT_2*COS6+COS8_SQRT_2*COS26), (COS22*COS24_SQRT_2+COS8_SQRT_2*COS10), (-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(COS22*COS24_SQRT_2+COS8_SQRT_2*COS10),-(COS24_SQRT_2*COS6+COS8_SQRT_2*COS26), (COS24_SQRT_2*COS2-COS8_SQRT_2*COS30), (COS24_SQRT_2*COS30+COS8_SQRT_2*COS2), (COS8_SQRT_2*COS6-COS24_SQRT_2*COS26), -(COS8_SQRT_2*COS22-COS24_SQRT_2*COS10),-(COS24_SQRT_2*COS14+COS8_SQRT_2*COS18),-(COS24_SQRT_2*COS14+COS8_SQRT_2*COS18), -(COS8_SQRT_2*COS22-COS24_SQRT_2*COS10), (COS8_SQRT_2*COS6-COS24_SQRT_2*COS26), (COS24_SQRT_2*COS30+COS8_SQRT_2*COS2), (COS24_SQRT_2*COS2-COS8_SQRT_2*COS30),-(COS24_SQRT_2*COS6+COS8_SQRT_2*COS26),-(COS22*COS24_SQRT_2+COS8_SQRT_2*COS10),-(-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14), (-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14), (COS22*COS24_SQRT_2+COS8_SQRT_2*COS10), (COS24_SQRT_2*COS6+COS8_SQRT_2*COS26),-(COS24_SQRT_2*COS2-COS8_SQRT_2*COS30),-(COS24_SQRT_2*COS30+COS8_SQRT_2*COS2),-(COS8_SQRT_2*COS6-COS24_SQRT_2*COS26), (COS8_SQRT_2*COS22-COS24_SQRT_2*COS10), (COS24_SQRT_2*COS14+COS8_SQRT_2*COS18)},
{ COS17*COS28_SQRT_2 + COS4_SQRT_2*COS15, COS13*COS20_SQRT_2 - COS12_SQRT_2*COS19, - COS12_SQRT_2*COS21 - COS20_SQRT_2*COS11, COS28_SQRT_2*COS23 - COS4_SQRT_2*COS9, COS25*COS4_SQRT_2 - COS7*COS28_SQRT_2, COS12_SQRT_2*COS5 + COS20_SQRT_2*COS27, COS12_SQRT_2*COS3 - COS29*COS20_SQRT_2, - COS1*COS28_SQRT_2 - COS4_SQRT_2*COS31, COS31*COS28_SQRT_2 - COS1*COS4_SQRT_2, - COS12_SQRT_2*COS29 - COS20_SQRT_2*COS3, COS5*COS20_SQRT_2 - COS12_SQRT_2*COS27, COS25*COS28_SQRT_2 + COS4_SQRT_2*COS7, COS4_SQRT_2*COS23 + COS9*COS28_SQRT_2, COS21*COS20_SQRT_2 - COS12_SQRT_2*COS11, - COS12_SQRT_2*COS13 - COS20_SQRT_2*COS19, COS15*COS28_SQRT_2 - COS17*COS4_SQRT_2, COS17*COS4_SQRT_2 - COS15*COS28_SQRT_2, COS12_SQRT_2*COS13 + COS20_SQRT_2*COS19, COS12_SQRT_2*COS11 - COS21*COS20_SQRT_2, - COS4_SQRT_2*COS23 - COS9*COS28_SQRT_2, - COS25*COS28_SQRT_2 - COS4_SQRT_2*COS7, COS12_SQRT_2*COS27 - COS5*COS20_SQRT_2, COS12_SQRT_2*COS29 + COS20_SQRT_2*COS3, COS1*COS4_SQRT_2 - COS31*COS28_SQRT_2, COS1*COS28_SQRT_2 + COS4_SQRT_2*COS31, COS29*COS20_SQRT_2 - COS12_SQRT_2*COS3, - COS12_SQRT_2*COS5 - COS20_SQRT_2*COS27, COS7*COS28_SQRT_2 - COS25*COS4_SQRT_2, COS4_SQRT_2*COS9 - COS28_SQRT_2*COS23, COS12_SQRT_2*COS21 + COS20_SQRT_2*COS11, COS12_SQRT_2*COS19 - COS13*COS20_SQRT_2, - COS17*COS28_SQRT_2 - COS4_SQRT_2*COS15},
{ COS12*SQRT_2,-COS28*SQRT_2,-COS4*SQRT_2,-COS20*SQRT_2, COS20*SQRT_2, COS4*SQRT_2, COS28*SQRT_2,-COS12*SQRT_2,-COS12*SQRT_2, COS28*SQRT_2, COS4*SQRT_2, COS20*SQRT_2,-COS20*SQRT_2,-COS4*SQRT_2,-COS28*SQRT_2, COS12*SQRT_2, COS12*SQRT_2,-COS28*SQRT_2,-COS4*SQRT_2,-COS20*SQRT_2, COS20*SQRT_2, COS4*SQRT_2, COS28*SQRT_2,-COS12*SQRT_2,-COS12*SQRT_2, COS28*SQRT_2, COS4*SQRT_2, COS20*SQRT_2,-COS20*SQRT_2,-COS4*SQRT_2,-COS28*SQRT_2, COS12*SQRT_2},
{((COS12-COS20)*COS15+(COS12+COS20)*COS17),-((COS28-COS4)*COS19+(COS4+COS28)*COS13),-((COS4+COS28)*COS11-(COS28-COS4)*COS21),-(-(COS12-COS20)*COS9+(COS12+COS20)*COS23), (-(COS12-COS20)*COS25+(COS12+COS20)*COS7), (-(COS28-COS4)*COS5+(COS4+COS28)*COS27),-(-(COS28-COS4)*COS3-(COS4+COS28)*COS29),-((COS12-COS20)*COS31+(COS12+COS20)*COS1),-((COS12-COS20)*COS1-(COS12+COS20)*COS31), (-(COS28-COS4)*COS29+(COS4+COS28)*COS3), ((COS28-COS4)*COS27+(COS4+COS28)*COS5),-((COS12-COS20)*COS7+(COS12+COS20)*COS25),-((COS12-COS20)*COS23+(COS12+COS20)*COS9), -(-(COS28-COS4)*COS11-(COS4+COS28)*COS21), (-(COS28-COS4)*COS13+(COS4+COS28)*COS19), (-(COS12-COS20)*COS17+(COS12+COS20)*COS15),-(-(COS12-COS20)*COS17+(COS12+COS20)*COS15),-(-(COS28-COS4)*COS13+(COS4+COS28)*COS19), (-(COS28-COS4)*COS11-(COS4+COS28)*COS21), ((COS12-COS20)*COS23+(COS12+COS20)*COS9), ((COS12-COS20)*COS7+(COS12+COS20)*COS25),-((COS28-COS4)*COS27+(COS4+COS28)*COS5),-(-(COS28-COS4)*COS29+(COS4+COS28)*COS3), ((COS12-COS20)*COS1-(COS12+COS20)*COS31), ((COS12-COS20)*COS31+(COS12+COS20)*COS1), (-(COS28-COS4)*COS3-(COS4+COS28)*COS29),-(-(COS28-COS4)*COS5+(COS4+COS28)*COS27),-(-(COS12-COS20)*COS25+(COS12+COS20)*COS7), (-(COS12-COS20)*COS9+(COS12+COS20)*COS23), ((COS4+COS28)*COS11-(COS28-COS4)*COS21), ((COS28-COS4)*COS19+(COS4+COS28)*COS13),-((COS12-COS20)*COS15+(COS12+COS20)*COS17)},
{ COS14*SQRT_2,-COS22*SQRT_2,-COS6*SQRT_2, COS30*SQRT_2, COS2*SQRT_2, COS26*SQRT_2,-COS10*SQRT_2,-COS18*SQRT_2, COS18*SQRT_2, COS10*SQRT_2,-COS26*SQRT_2,-COS2*SQRT_2, -COS30*SQRT_2, COS6*SQRT_2, COS22*SQRT_2,-COS14*SQRT_2,-COS14*SQRT_2, COS22*SQRT_2, COS6*SQRT_2, -COS30*SQRT_2,-COS2*SQRT_2,-COS26*SQRT_2, COS10*SQRT_2, COS18*SQRT_2,-COS18*SQRT_2,-COS10*SQRT_2, COS26*SQRT_2, COS2*SQRT_2, COS30*SQRT_2,-COS6*SQRT_2,-COS22*SQRT_2, COS14*SQRT_2},
{ SQRT_2*COS15, -SQRT_2*COS19, -SQRT_2*COS11, SQRT_2*COS23, SQRT_2*COS7, -SQRT_2*COS27, -SQRT_2*COS3, SQRT_2*COS31, SQRT_2*COS1, SQRT_2*COS29, -SQRT_2*COS5, -SQRT_2*COS25, SQRT_2*COS9, SQRT_2*COS21, -SQRT_2*COS13, -SQRT_2*COS17, SQRT_2*COS17, SQRT_2*COS13, -SQRT_2*COS21, -SQRT_2*COS9, SQRT_2*COS25, SQRT_2*COS5, -SQRT_2*COS29, -SQRT_2*COS1, -SQRT_2*COS31, SQRT_2*COS3, SQRT_2*COS27, -SQRT_2*COS7, -SQRT_2*COS23, SQRT_2*COS11, SQRT_2*COS19, -SQRT_2*COS15},
{ COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT,-COS16_SQRT_2<<S_BIT, COS16_SQRT_2<<S_BIT},
{ SQRT_2*COS17, -SQRT_2*COS13, -SQRT_2*COS21, SQRT_2*COS9, SQRT_2*COS25, -SQRT_2*COS5, -SQRT_2*COS29, SQRT_2*COS1, -SQRT_2*COS31, -SQRT_2*COS3, SQRT_2*COS27, SQRT_2*COS7, -SQRT_2*COS23, -SQRT_2*COS11, SQRT_2*COS19, SQRT_2*COS15, -SQRT_2*COS15, -SQRT_2*COS19, SQRT_2*COS11, SQRT_2*COS23, -SQRT_2*COS7, -SQRT_2*COS27, SQRT_2*COS3, SQRT_2*COS31, -SQRT_2*COS1, SQRT_2*COS29, SQRT_2*COS5, -SQRT_2*COS25, -SQRT_2*COS9, SQRT_2*COS21, SQRT_2*COS13, -SQRT_2*COS17},
{ COS18*SQRT_2,-COS10*SQRT_2,-COS26*SQRT_2, COS2*SQRT_2, -COS30*SQRT_2,-COS6*SQRT_2, COS22*SQRT_2, COS14*SQRT_2,-COS14*SQRT_2,-COS22*SQRT_2, COS6*SQRT_2, COS30*SQRT_2,-COS2*SQRT_2, COS26*SQRT_2, COS10*SQRT_2,-COS18*SQRT_2,-COS18*SQRT_2, COS10*SQRT_2, COS26*SQRT_2,-COS2*SQRT_2, COS30*SQRT_2, COS6*SQRT_2,-COS22*SQRT_2,-COS14*SQRT_2, COS14*SQRT_2, COS22*SQRT_2,-COS6*SQRT_2, -COS30*SQRT_2, COS2*SQRT_2,-COS26*SQRT_2,-COS10*SQRT_2, COS18*SQRT_2},
{ (-(COS12-COS20)*COS17+(COS12+COS20)*COS15),-(-(COS28-COS4)*COS13+(COS4+COS28)*COS19), -(-(COS28-COS4)*COS11-(COS4+COS28)*COS21), ((COS12-COS20)*COS23+(COS12+COS20)*COS9),-((COS12-COS20)*COS7+(COS12+COS20)*COS25),-((COS28-COS4)*COS27+(COS4+COS28)*COS5), (-(COS28-COS4)*COS29+(COS4+COS28)*COS3), ((COS12-COS20)*COS1-(COS12+COS20)*COS31),-((COS12-COS20)*COS31+(COS12+COS20)*COS1), (-(COS28-COS4)*COS3-(COS4+COS28)*COS29), (-(COS28-COS4)*COS5+(COS4+COS28)*COS27),-(-(COS12-COS20)*COS25+(COS12+COS20)*COS7),-(-(COS12-COS20)*COS9+(COS12+COS20)*COS23), ((COS4+COS28)*COS11-(COS28-COS4)*COS21),-((COS28-COS4)*COS19+(COS4+COS28)*COS13),-((COS12-COS20)*COS15+(COS12+COS20)*COS17), ((COS12-COS20)*COS15+(COS12+COS20)*COS17), ((COS28-COS4)*COS19+(COS4+COS28)*COS13),-((COS4+COS28)*COS11-(COS28-COS4)*COS21), (-(COS12-COS20)*COS9+(COS12+COS20)*COS23), (-(COS12-COS20)*COS25+(COS12+COS20)*COS7),-(-(COS28-COS4)*COS5+(COS4+COS28)*COS27),-(-(COS28-COS4)*COS3-(COS4+COS28)*COS29), ((COS12-COS20)*COS31+(COS12+COS20)*COS1),-((COS12-COS20)*COS1-(COS12+COS20)*COS31),-(-(COS28-COS4)*COS29+(COS4+COS28)*COS3), ((COS28-COS4)*COS27+(COS4+COS28)*COS5), ((COS12-COS20)*COS7+(COS12+COS20)*COS25),-((COS12-COS20)*COS23+(COS12+COS20)*COS9), (-(COS28-COS4)*COS11-(COS4+COS28)*COS21), (-(COS28-COS4)*COS13+(COS4+COS28)*COS19),-(-(COS12-COS20)*COS17+(COS12+COS20)*COS15)},
{ COS20*SQRT_2,-COS4*SQRT_2, COS28*SQRT_2, COS12*SQRT_2,-COS12*SQRT_2,-COS28*SQRT_2, COS4*SQRT_2,-COS20*SQRT_2,-COS20*SQRT_2, COS4*SQRT_2,-COS28*SQRT_2,-COS12*SQRT_2, COS12*SQRT_2, COS28*SQRT_2,-COS4*SQRT_2, COS20*SQRT_2, COS20*SQRT_2,-COS4*SQRT_2, COS28*SQRT_2, COS12*SQRT_2,-COS12*SQRT_2,-COS28*SQRT_2, COS4*SQRT_2,-COS20*SQRT_2,-COS20*SQRT_2, COS4*SQRT_2,-COS28*SQRT_2,-COS12*SQRT_2, COS12*SQRT_2, COS28*SQRT_2,-COS4*SQRT_2, COS20*SQRT_2},
{ COS17*COS4_SQRT_2 - COS15*COS28_SQRT_2, - COS12_SQRT_2*COS13 - COS20_SQRT_2*COS19, COS12_SQRT_2*COS11 - COS21*COS20_SQRT_2, COS4_SQRT_2*COS23 + COS9*COS28_SQRT_2, - COS25*COS28_SQRT_2 - COS4_SQRT_2*COS7, COS5*COS20_SQRT_2 - COS12_SQRT_2*COS27, COS12_SQRT_2*COS29 + COS20_SQRT_2*COS3, COS31*COS28_SQRT_2 - COS1*COS4_SQRT_2, COS1*COS28_SQRT_2 + COS4_SQRT_2*COS31, COS12_SQRT_2*COS3 - COS29*COS20_SQRT_2, - COS12_SQRT_2*COS5 - COS20_SQRT_2*COS27, COS25*COS4_SQRT_2 - COS7*COS28_SQRT_2, COS4_SQRT_2*COS9 - COS28_SQRT_2*COS23, - COS12_SQRT_2*COS21 - COS20_SQRT_2*COS11, COS12_SQRT_2*COS19 - COS13*COS20_SQRT_2, COS17*COS28_SQRT_2 + COS4_SQRT_2*COS15, - COS17*COS28_SQRT_2 - COS4_SQRT_2*COS15, COS13*COS20_SQRT_2 - COS12_SQRT_2*COS19, COS12_SQRT_2*COS21 + COS20_SQRT_2*COS11, COS28_SQRT_2*COS23 - COS4_SQRT_2*COS9, COS7*COS28_SQRT_2 - COS25*COS4_SQRT_2, COS12_SQRT_2*COS5 + COS20_SQRT_2*COS27, COS29*COS20_SQRT_2 - COS12_SQRT_2*COS3, - COS1*COS28_SQRT_2 - COS4_SQRT_2*COS31, COS1*COS4_SQRT_2 - COS31*COS28_SQRT_2, - COS12_SQRT_2*COS29 - COS20_SQRT_2*COS3, COS12_SQRT_2*COS27 - COS5*COS20_SQRT_2, COS25*COS28_SQRT_2 + COS4_SQRT_2*COS7, - COS4_SQRT_2*COS23 - COS9*COS28_SQRT_2, COS21*COS20_SQRT_2 - COS12_SQRT_2*COS11, COS12_SQRT_2*COS13 + COS20_SQRT_2*COS19, COS15*COS28_SQRT_2 - COS17*COS4_SQRT_2},
{ (-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(COS22*COS24_SQRT_2+COS8_SQRT_2*COS10), (COS24_SQRT_2*COS6+COS8_SQRT_2*COS26), (COS24_SQRT_2*COS2-COS8_SQRT_2*COS30),-(COS24_SQRT_2*COS30+COS8_SQRT_2*COS2), (COS8_SQRT_2*COS6-COS24_SQRT_2*COS26), (COS8_SQRT_2*COS22-COS24_SQRT_2*COS10),-(COS24_SQRT_2*COS14+COS8_SQRT_2*COS18), (COS24_SQRT_2*COS14+COS8_SQRT_2*COS18), -(COS8_SQRT_2*COS22-COS24_SQRT_2*COS10),-(COS8_SQRT_2*COS6-COS24_SQRT_2*COS26), (COS24_SQRT_2*COS30+COS8_SQRT_2*COS2),-(COS24_SQRT_2*COS2-COS8_SQRT_2*COS30),-(COS24_SQRT_2*COS6+COS8_SQRT_2*COS26), (COS22*COS24_SQRT_2+COS8_SQRT_2*COS10),-(-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14), (COS22*COS24_SQRT_2+COS8_SQRT_2*COS10),-(COS24_SQRT_2*COS6+COS8_SQRT_2*COS26),-(COS24_SQRT_2*COS2-COS8_SQRT_2*COS30), (COS24_SQRT_2*COS30+COS8_SQRT_2*COS2),-(COS8_SQRT_2*COS6-COS24_SQRT_2*COS26), -(COS8_SQRT_2*COS22-COS24_SQRT_2*COS10), (COS24_SQRT_2*COS14+COS8_SQRT_2*COS18),-(COS24_SQRT_2*COS14+COS8_SQRT_2*COS18), (COS8_SQRT_2*COS22-COS24_SQRT_2*COS10), (COS8_SQRT_2*COS6-COS24_SQRT_2*COS26),-(COS24_SQRT_2*COS30+COS8_SQRT_2*COS2), (COS24_SQRT_2*COS2-COS8_SQRT_2*COS30), (COS24_SQRT_2*COS6+COS8_SQRT_2*COS26),-(COS22*COS24_SQRT_2+COS8_SQRT_2*COS10), (-COS24_SQRT_2*COS18+COS8_SQRT_2*COS14)},
{ COS8_SQRT_2*COS15 - COS17*COS24_SQRT_2, - COS13*COS8_SQRT_2 - COS19*COS24_SQRT_2, COS21*COS8_SQRT_2 + COS11*COS24_SQRT_2, COS9*COS24_SQRT_2 - COS8_SQRT_2*COS23, COS25*COS24_SQRT_2 - COS8_SQRT_2*COS7, COS5*COS8_SQRT_2 + COS27*COS24_SQRT_2, - COS29*COS8_SQRT_2 - COS3*COS24_SQRT_2, COS8_SQRT_2*COS31 - COS1*COS24_SQRT_2, COS1*COS8_SQRT_2 + COS31*COS24_SQRT_2, COS29*COS24_SQRT_2 - COS8_SQRT_2*COS3, COS5*COS24_SQRT_2 - COS8_SQRT_2*COS27, COS25*COS8_SQRT_2 + COS7*COS24_SQRT_2, - COS8_SQRT_2*COS9 - COS24_SQRT_2*COS23, COS8_SQRT_2*COS11 - COS21*COS24_SQRT_2, COS8_SQRT_2*COS19 - COS13*COS24_SQRT_2, - COS17*COS8_SQRT_2 - COS15*COS24_SQRT_2, COS17*COS8_SQRT_2 + COS15*COS24_SQRT_2, COS13*COS24_SQRT_2 - COS8_SQRT_2*COS19, COS21*COS24_SQRT_2 - COS8_SQRT_2*COS11, COS8_SQRT_2*COS9 + COS24_SQRT_2*COS23, - COS25*COS8_SQRT_2 - COS7*COS24_SQRT_2, COS8_SQRT_2*COS27 - COS5*COS24_SQRT_2, COS8_SQRT_2*COS3 - COS29*COS24_SQRT_2, - COS1*COS8_SQRT_2 - COS31*COS24_SQRT_2, COS1*COS24_SQRT_2 - COS8_SQRT_2*COS31, COS29*COS8_SQRT_2 + COS3*COS24_SQRT_2, - COS5*COS8_SQRT_2 - COS27*COS24_SQRT_2, COS8_SQRT_2*COS7 - COS25*COS24_SQRT_2, COS8_SQRT_2*COS23 - COS9*COS24_SQRT_2, - COS21*COS8_SQRT_2 - COS11*COS24_SQRT_2, COS13*COS8_SQRT_2 + COS19*COS24_SQRT_2, COS17*COS24_SQRT_2 - COS8_SQRT_2*COS15},
{ COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT,-COS24_SQRT_2<<S_BIT, COS8_SQRT_2<<S_BIT,-COS8_SQRT_2<<S_BIT, COS24_SQRT_2<<S_BIT},
{ COS17*COS8_SQRT_2 - COS15*COS24_SQRT_2, - COS13*COS24_SQRT_2 - COS8_SQRT_2*COS19, COS21*COS24_SQRT_2 + COS8_SQRT_2*COS11, COS24_SQRT_2*COS23 - COS8_SQRT_2*COS9, COS7*COS24_SQRT_2 - COS25*COS8_SQRT_2, COS5*COS24_SQRT_2 + COS8_SQRT_2*COS27, - COS29*COS24_SQRT_2 - COS8_SQRT_2*COS3, COS1*COS8_SQRT_2 - COS31*COS24_SQRT_2, - COS1*COS24_SQRT_2 - COS8_SQRT_2*COS31, COS29*COS8_SQRT_2 - COS3*COS24_SQRT_2, COS5*COS8_SQRT_2 - COS27*COS24_SQRT_2, - COS25*COS24_SQRT_2 - COS8_SQRT_2*COS7, COS8_SQRT_2*COS23 + COS9*COS24_SQRT_2, COS11*COS24_SQRT_2 - COS21*COS8_SQRT_2, COS19*COS24_SQRT_2 - COS13*COS8_SQRT_2, COS17*COS24_SQRT_2 + COS8_SQRT_2*COS15, - COS17*COS24_SQRT_2 - COS8_SQRT_2*COS15, COS13*COS8_SQRT_2 - COS19*COS24_SQRT_2, COS21*COS8_SQRT_2 - COS11*COS24_SQRT_2, - COS8_SQRT_2*COS23 - COS9*COS24_SQRT_2, COS25*COS24_SQRT_2 + COS8_SQRT_2*COS7, COS27*COS24_SQRT_2 - COS5*COS8_SQRT_2, COS3*COS24_SQRT_2 - COS29*COS8_SQRT_2, COS1*COS24_SQRT_2 + COS8_SQRT_2*COS31, COS31*COS24_SQRT_2 - COS1*COS8_SQRT_2, COS29*COS24_SQRT_2 + COS8_SQRT_2*COS3, - COS5*COS24_SQRT_2 - COS8_SQRT_2*COS27, COS25*COS8_SQRT_2 - COS7*COS24_SQRT_2, COS8_SQRT_2*COS9 - COS24_SQRT_2*COS23, - COS21*COS24_SQRT_2 - COS8_SQRT_2*COS11, COS13*COS24_SQRT_2 + COS8_SQRT_2*COS19, COS15*COS24_SQRT_2 - COS17*COS8_SQRT_2},
{ (COS18*COS8_SQRT_2-COS14*COS24_SQRT_2),-(COS10*COS24_SQRT_2+COS22*COS8_SQRT_2), (COS24_SQRT_2*COS26+COS8_SQRT_2*COS6),-(COS2*COS8_SQRT_2-COS24_SQRT_2*COS30), (COS30*COS8_SQRT_2+COS2*COS24_SQRT_2), (COS6*COS24_SQRT_2-COS8_SQRT_2*COS26),-(COS10*COS8_SQRT_2-COS22*COS24_SQRT_2), (COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(COS24_SQRT_2*COS18+COS8_SQRT_2*COS14), (COS10*COS8_SQRT_2-COS22*COS24_SQRT_2), -(COS6*COS24_SQRT_2-COS8_SQRT_2*COS26),-(COS30*COS8_SQRT_2+COS2*COS24_SQRT_2), (COS2*COS8_SQRT_2-COS24_SQRT_2*COS30),-(COS24_SQRT_2*COS26+COS8_SQRT_2*COS6), (COS10*COS24_SQRT_2+COS22*COS8_SQRT_2),-(COS18*COS8_SQRT_2-COS14*COS24_SQRT_2),-(COS18*COS8_SQRT_2-COS14*COS24_SQRT_2), (COS10*COS24_SQRT_2+COS22*COS8_SQRT_2),-(COS24_SQRT_2*COS26+COS8_SQRT_2*COS6), (COS2*COS8_SQRT_2-COS24_SQRT_2*COS30),-(COS30*COS8_SQRT_2+COS2*COS24_SQRT_2), -(COS6*COS24_SQRT_2-COS8_SQRT_2*COS26), (COS10*COS8_SQRT_2-COS22*COS24_SQRT_2),-(COS24_SQRT_2*COS18+COS8_SQRT_2*COS14), (COS24_SQRT_2*COS18+COS8_SQRT_2*COS14),-(COS10*COS8_SQRT_2-COS22*COS24_SQRT_2), (COS6*COS24_SQRT_2-COS8_SQRT_2*COS26), (COS30*COS8_SQRT_2+COS2*COS24_SQRT_2),-(COS2*COS8_SQRT_2-COS24_SQRT_2*COS30), (COS24_SQRT_2*COS26+COS8_SQRT_2*COS6),-(COS10*COS24_SQRT_2+COS22*COS8_SQRT_2), (COS18*COS8_SQRT_2-COS14*COS24_SQRT_2)},
{ (COS17*COS28 + COS4*COS15) - (COS17*COS4 - COS15*COS28), (COS12*COS19 - COS13*COS20) - (COS12*COS13 + COS20*COS19), (COS12*COS21 + COS20*COS11) + (COS12*COS11 - COS21*COS20), - (COS4*COS9 - COS28*COS23) - (COS4*COS23 + COS9*COS28), (COS25*COS4 - COS7*COS28) + (COS25*COS28 + COS4*COS7), - (COS12*COS5 + COS20*COS27) - (COS12*COS27 - COS5*COS20), (COS12*COS29 + COS20*COS3) - (COS12*COS3 - COS29*COS20), (COS1*COS4 - COS31*COS28) - (COS1*COS28 + COS4*COS31), - (COS1*COS4 - COS31*COS28) - (COS1*COS28 + COS4*COS31), (COS12*COS29 + COS20*COS3) + (COS12*COS3 - COS29*COS20), (COS12*COS27 - COS5*COS20) - (COS12*COS5 + COS20*COS27), (COS25*COS28 + COS4*COS7) - (COS25*COS4 - COS7*COS28), (COS4*COS23 + COS9*COS28) - (COS4*COS9 - COS28*COS23), (COS12*COS11 - COS21*COS20) - (COS12*COS21 + COS20*COS11), (COS12*COS13 + COS20*COS19) + (COS12*COS19 - COS13*COS20), - (COS17*COS4 - COS15*COS28) - (COS17*COS28 + COS4*COS15), (COS17*COS4 - COS15*COS28) + (COS17*COS28 + COS4*COS15), - (COS12*COS13 + COS20*COS19) - (COS12*COS19 - COS13*COS20), (COS12*COS21 + COS20*COS11) - (COS12*COS11 - COS21*COS20), (COS4*COS9 - COS28*COS23) - (COS4*COS23 + COS9*COS28), (COS25*COS4 - COS7*COS28) - (COS25*COS28 + COS4*COS7), (COS12*COS5 + COS20*COS27) - (COS12*COS27 - COS5*COS20), - (COS12*COS29 + COS20*COS3) - (COS12*COS3 - COS29*COS20), (COS1*COS4 - COS31*COS28) + (COS1*COS28 + COS4*COS31), (COS1*COS28 + COS4*COS31) - (COS1*COS4 - COS31*COS28), (COS12*COS3 - COS29*COS20) - (COS12*COS29 + COS20*COS3), (COS12*COS5 + COS20*COS27) + (COS12*COS27 - COS5*COS20), - (COS25*COS4 - COS7*COS28) - (COS25*COS28 + COS4*COS7), (COS4*COS9 - COS28*COS23) + (COS4*COS23 + COS9*COS28), - (COS12*COS21 + COS20*COS11) - (COS12*COS11 - COS21*COS20), (COS12*COS13 + COS20*COS19) - (COS12*COS19 - COS13*COS20), (COS17*COS4 - COS15*COS28) - (COS17*COS28 + COS4*COS15)},
{ ((COS12-COS20)<<S_BIT),-((COS4-COS28)<<S_BIT), ((COS4+COS28)<<S_BIT),-((COS12+COS20)<<S_BIT), ((COS12+COS20)<<S_BIT),-((COS4+COS28)<<S_BIT), ((COS4-COS28)<<S_BIT),-((COS12-COS20)<<S_BIT),-((COS12-COS20)<<S_BIT), ((COS4-COS28)<<S_BIT),-((COS4+COS28)<<S_BIT), ((COS12+COS20)<<S_BIT),-((COS12+COS20)<<S_BIT), ((COS4+COS28)<<S_BIT),-((COS4-COS28)<<S_BIT), ((COS12-COS20)<<S_BIT), ((COS12-COS20)<<S_BIT),-((COS4-COS28)<<S_BIT), ((COS4+COS28)<<S_BIT),-((COS12+COS20)<<S_BIT), ((COS12+COS20)<<S_BIT),-((COS4+COS28)<<S_BIT), ((COS4-COS28)<<S_BIT),-((COS12-COS20)<<S_BIT),-((COS12-COS20)<<S_BIT), ((COS4-COS28)<<S_BIT),-((COS4+COS28)<<S_BIT), ((COS12+COS20)<<S_BIT),-((COS12+COS20)<<S_BIT), ((COS4+COS28)<<S_BIT),-((COS4-COS28)<<S_BIT), ((COS12-COS20)<<S_BIT)},
{ COS12_SQRT_2*COS17 - COS20_SQRT_2*COS15, COS13*COS28_SQRT_2 - COS4_SQRT_2*COS19, COS21*COS4_SQRT_2 + COS11*COS28_SQRT_2, - COS12_SQRT_2*COS23 - COS9*COS20_SQRT_2, COS12_SQRT_2*COS7 + COS25*COS20_SQRT_2, - COS4_SQRT_2*COS5 - COS28_SQRT_2*COS27, COS4_SQRT_2*COS3 - COS29*COS28_SQRT_2, COS31*COS20_SQRT_2 - COS1*COS12_SQRT_2, COS1*COS20_SQRT_2 + COS12_SQRT_2*COS31, - COS29*COS4_SQRT_2 - COS3*COS28_SQRT_2, COS4_SQRT_2*COS27 - COS5*COS28_SQRT_2, COS20_SQRT_2*COS7 - COS12_SQRT_2*COS25, COS20_SQRT_2*COS23 - COS12_SQRT_2*COS9, COS4_SQRT_2*COS11 - COS21*COS28_SQRT_2, - COS13*COS4_SQRT_2 - COS19*COS28_SQRT_2, COS12_SQRT_2*COS15 + COS17*COS20_SQRT_2, - COS12_SQRT_2*COS15 - COS17*COS20_SQRT_2, COS13*COS4_SQRT_2 + COS19*COS28_SQRT_2, COS21*COS28_SQRT_2 - COS4_SQRT_2*COS11, COS12_SQRT_2*COS9 - COS20_SQRT_2*COS23, COS12_SQRT_2*COS25 - COS20_SQRT_2*COS7, COS5*COS28_SQRT_2 - COS4_SQRT_2*COS27, COS29*COS4_SQRT_2 + COS3*COS28_SQRT_2, - COS1*COS20_SQRT_2 - COS12_SQRT_2*COS31, COS1*COS12_SQRT_2 - COS31*COS20_SQRT_2, COS29*COS28_SQRT_2 - COS4_SQRT_2*COS3, COS4_SQRT_2*COS5 + COS28_SQRT_2*COS27, - COS12_SQRT_2*COS7 - COS25*COS20_SQRT_2, COS12_SQRT_2*COS23 + COS9*COS20_SQRT_2, - COS21*COS4_SQRT_2 - COS11*COS28_SQRT_2, COS4_SQRT_2*COS19 - COS13*COS28_SQRT_2, COS20_SQRT_2*COS15 - COS12_SQRT_2*COS17},
{ (COS14-COS18)<<S_BIT,-(COS10-COS22)<<S_BIT, (COS6-COS26)<<S_BIT,-(COS2-COS30)<<S_BIT, (COS2+COS30)<<S_BIT,-(COS6+COS26)<<S_BIT, (COS10+COS22)<<S_BIT,-(COS14+COS18)<<S_BIT, (COS14+COS18)<<S_BIT,-(COS10+COS22)<<S_BIT, (COS6+COS26)<<S_BIT,-(COS2+COS30)<<S_BIT, (COS2-COS30)<<S_BIT,-(COS6-COS26)<<S_BIT, (COS10-COS22)<<S_BIT, -(COS14-COS18)<<S_BIT, -(COS14-COS18)<<S_BIT, (COS10-COS22)<<S_BIT,-(COS6-COS26)<<S_BIT, (COS2-COS30)<<S_BIT,-(COS2+COS30)<<S_BIT, (COS6+COS26)<<S_BIT,-(COS10+COS22)<<S_BIT, (COS14+COS18)<<S_BIT,-(COS14+COS18)<<S_BIT, (COS10+COS22)<<S_BIT,-(COS6+COS26)<<S_BIT, (COS2+COS30)<<S_BIT,-(COS2-COS30)<<S_BIT, (COS6-COS26)<<S_BIT,-(COS10-COS22)<<S_BIT, (COS14-COS18)<<S_BIT},
{ COS16_SQRT_2*COS15 - COS17*COS16_SQRT_2, COS16_SQRT_2*COS19 - COS13*COS16_SQRT_2, COS16_SQRT_2*COS11 - COS21*COS16_SQRT_2, COS16_SQRT_2*COS23 - COS9*COS16_SQRT_2, COS16_SQRT_2*COS7 - COS25*COS16_SQRT_2, COS16_SQRT_2*COS27 - COS5*COS16_SQRT_2, COS16_SQRT_2*COS3 - COS29*COS16_SQRT_2, COS16_SQRT_2*COS31 - COS1*COS16_SQRT_2, COS1*COS16_SQRT_2 + COS31*COS16_SQRT_2, - COS16_SQRT_2*COS29 - COS16_SQRT_2*COS3, COS16_SQRT_2*COS5 + COS16_SQRT_2*COS27, - COS16_SQRT_2*COS25 - COS16_SQRT_2*COS7, COS16_SQRT_2*COS9 + COS16_SQRT_2*COS23, - COS16_SQRT_2*COS21 - COS16_SQRT_2*COS11, COS13*COS16_SQRT_2 + COS19*COS16_SQRT_2, - COS16_SQRT_2*COS17 - COS16_SQRT_2*COS15, COS16_SQRT_2*COS17 + COS16_SQRT_2*COS15, - COS13*COS16_SQRT_2 - COS19*COS16_SQRT_2, COS16_SQRT_2*COS21 + COS16_SQRT_2*COS11, - COS16_SQRT_2*COS9 - COS16_SQRT_2*COS23, COS16_SQRT_2*COS25 + COS16_SQRT_2*COS7, - COS16_SQRT_2*COS5 - COS16_SQRT_2*COS27, COS16_SQRT_2*COS29 + COS16_SQRT_2*COS3, - COS1*COS16_SQRT_2 - COS31*COS16_SQRT_2, COS1*COS16_SQRT_2 - COS16_SQRT_2*COS31, COS29*COS16_SQRT_2 - COS16_SQRT_2*COS3, COS5*COS16_SQRT_2 - COS16_SQRT_2*COS27, COS25*COS16_SQRT_2 - COS16_SQRT_2*COS7, COS9*COS16_SQRT_2 - COS16_SQRT_2*COS23, COS21*COS16_SQRT_2 - COS16_SQRT_2*COS11, COS13*COS16_SQRT_2 - COS16_SQRT_2*COS19, COS17*COS16_SQRT_2 - COS16_SQRT_2*COS15},
};
다시 도 3을 참조하면, 단계 320에서 변환부(120)는 정수값을 갖는 원소들로 구성된 N 포인트 이산 코사인 변환 행렬을 이용하여 N 포인트 이산 코사인 변환을 수행한다.
단계 330에서, 변환부(120)는 스케일링 팩터를 이용하여 N 포인트 이산 코사인 변환 결과값에 대한 디스케일링을 수행한다. 스케일링 팩터를 이용하여 스케일링된 정수값을 갖는 N 포인트 이산 코사인 변환 행렬과 원(original) N 포인트 이산 코사인 변환 행렬을 이용한 결과값의 차이를 보상하기 위해서는 스케일링된 정수값을 갖는 N 포인트 이산 코사인 변환 행렬을 이용한 변환 결과값을 다시 디스케일링(de-scaling)해야 한다. 본 발명의 일 실시예에 따른 스케일링된 N 포인트 이산 코사인 변환 행렬의 각 원소는 원(original) N 포인트 이산 코사인 변환 행렬의 각 원소에 스케일링 팩터의 제곱값을 곱한 값에 대응되므로, 디스케일링 과정은 변환 행렬 결과값을 S^2의 값으로 나누어줌으로써 수행될 수 있다. 전술한 바와 같이 S_BIT 를 log2S 라고 정의하면, 디스케일링 과정은 2*S_BIT 만큼 N 포인트 이산 코사인 변환에 따른 결과값을 우향 쉬프트(>>) 함으로써 수행될 수 있다. 이러한 우향 쉬프트(>>)를 통한 디스케일링 과정은 변환부(120)에서 수행되는 대신에 양자화부(130)에서 수행되는 양자화 과정과 통합될 수 있다. 구체적으로, 변환 계수값에 대하여 적용되는 양자화 스텝(Qstep) 값을 2*S_BIT 만큼 우향 쉬프트(>>)한 값, 즉 양자화 스텝(Qstep)값을 S^2의 값으로 나눈 새로운 양자화 스텝을 이용하여 양자화를 수행함으로써 양자화 과정에 통합되어 디스케일링 과정이 수행될 수 있다.
전술한 정수값을 갖는 원소들로 구성된 N 포인트 이산 코사인 변환 행렬은 다음의 도 4에 기재된 바와 같은 흐름도로 구현될 수 있다.
도 4는 본 발명의 일 실시예에 따른 32, 16, 8 및 4 포인트 이산 코사인 변환 과정을 재구성한 흐름도이며, 도 5는 도 4의 흐름도에 도시된 각 연산 구성 요소를 설명하기 위한 참조도이다. 도 4에서 점선으로 표시된 도면 부호 410은 16 포인트 이산 코사인 변환의 흐름도, 도면 부호 420은 8 포인트 이산 코사인 변환의 흐름도, 도면 부호 430은 4 포인트 일차원 변환의 흐름도를 나타낸다.
도 4의 흐름도는 전술한 본 발명의 일 실시예에 따른 정수값을 갖는 원소들로 구성된 N 포인트 이산 코사인 변환 행렬에 따라 구현된 것이다. 구체적으로, X0 내지 X31은 32 포인트 이산 코사인 변환의 입력값들을 나타내며, Y0 내지 Y31은 32 포인트 이산 코사인 변환에 따른 결과값이다. 반대로, Y0 내지 Y31을 입력값이라고 가정하면, X0 내지 X31은 32 포인트 이산 코사인 역변환의 출력값이 된다. 즉, X0 내지 X31은 32포인트 이산 코사인 변환의 입력값들을 나타내는 동시에 32포인트 이산 코사인 역변환의 출력값이다. 32 포인트 이산 코사인 변환시에 데이터 처리 방향은 좌측에서 우측이며, 32 포인트 이산 코사인 역변환시에 데이터 처리 방향은 우측에서 좌측이다.
도 4에 도시된 각 연산 기호의 의미에 대하여 도 5를 참조하여 설명한다.
도 5를 참조하면, 도면 부호 510으로 표시된 연산은 중간값 X,Y (X,Y는 실수)에 대하여 U=C1*X-C0*Y (C0 및 C1은 미리 정해진 실수) 및 V=C0*X+C1*Y 에 따라서 결과값 U,V(U,V는 실수)을 획득하는 연산이다. C0이 cos θ, C1이 sin θ인 경우 도면 부호 510의 연산은 결국 중간값 X,Y로 구성된 (X,Y)를 θ만큼 회전한 (U,V)를 출력하는 회전 변환에 해당한다.
이러한 회전 변환 연산 과정은 U값을 계산할 때 2번의 곱셈 과정, V값을 계산할 때 2번의 곱셈 과정이 포함되어 총 4번의 곱셈 과정이 수행된다. 본 발명의 일 실시예에 따른 변환부(120)는 이러한 도면 부호 510으로 표시된 회전 변환 연산을 수행할 때, 다음과 같이 T(T는 실수)를 계산한 다음, C1 및 C0를 이용하여 획득된 C1_p_C0 및 C1_m_C0과 입력된 X 및 Y값을 각각 곱하여 T를 더하거나 감산함으로써 U,V를 계산하는 변경된 연산을 수행한다. C1_p_C0=C1+C0 및 C1_m_C0=C1-C0 이다.
T=C0*(X+Y); U=C1_p_C0*X-T; V=T+C1_m_C0*Y
이와 같이 회전 변환 연산을 상기 연산으로 대체하여 수행되는 경우 T, U 및 V의 값을 계산하는 과정 각각에 대하여 한 번씩의 곱셈 과정이 수행되므로 총 3회의 곱셈 연산이 필요하다. 따라서, 이러한 대체 연산 과정을 수행함으로써 기존 4회의 곱셈 연산을 3회로 감소시킬 수 있다. 이러한 대체 연산 과정에 의할 때 덧셈 연산이나 뺄셈 연산의 횟수는 증가하지만, 이러한 덧셈 연산 및 뺄셈 연산은 연산 복잡도가 곱셈 연산에 비하여 현저히 낮으므로 곱셈 연산의 횟수를 감소시키는 것이 유리하다.
한편, C1 및 C0는 도시된 #n에 따라서 결정되는 값으로, 전술한 바와 같이 C0이 cos θ, C1이 sin θ라고 할 때, C0에 따라서 C1의 값이 결정될 수 있으며, 전술한 표 1에 기초하여 도 5의 #n에 따라서 이용되는 C0, C1_p_C0 및 C1_m_C0의 값은 다음의 표 2와 같다.
표 2
#n | C0 | C1_p_C0 | C1_m_C0 |
#1 | COS8_SQRT_2<<S_BIT | (COS24_SQRT_2<<S_BIT)+ (COS8_SQRT_2<<S_BIT) | (COS24_SQRT_2<<S_BIT)- (COS8_SQRT_2<<S_BIT) |
#2 | COS20 | COS20+COS12 | -COS20+COS12 |
#3 | COS28 | COS28+COS4 | -COS28+COS4 |
#4 | COS18 | COS18+COS14 | -COS18+COS14 |
#5 | -COS10 | -COS10+COS22 | COS10+COS22 |
#6 | COS26 | COS26+COS6 | -COS26+COS6 |
#7 | -COS2 | -COS2+COS30 | COS2+COS30 |
#8 | COS8_SQRT_2 | COS24_SQRT_2+COS8_SQRT_2 | COS24_SQRT_2-COS8_SQRT_2 |
#9 | -COS24_SQRT_2 | -COS24_SQRT_2+COS8_SQRT_2 | COS24_SQRT_2+COS8_SQRT_2 |
#10 | -COS15 | -COS15+COS17 | COS15+COS17 |
#11 | COS19 | COS19+COS13 | COS19-COS13 |
#12 | -COS11 | - COS11+COS21 | COS11+COS21 |
#13 | COS23 | COS23+ COS9 | COS23- COS9 |
#14 | -COS7 | -COS7+COS25 | COS7+COS25 |
#15 | COS27 | COS27+ COS5 | COS27- COS5 |
#16 | -COS3 | -COS3+ COS29 | -COS3+ COS29 |
#17 | COS31 | COS31+ COS1 | COS31- COS1 |
#18 | -COS20 | -COS20+COS12 | COS20+COS12 |
#19 | -COS28 | -COS28+COS4 | COS28+COS4 |
#20 | COS28 | COS28+COS4 | -COS28+COS4 |
#21 | COS20 | COS20+COS12 | -COS20+COS12 |
#22 | -COS24_SQRT_2 | COS8_SQRT_2-COS24_SQRT_2 | COS8_SQRT_2+COS24_SQRT_2 |
#23 | -COS24_SQRT_2 | COS8_SQRT_2-COS24_SQRT_2 | COS8_SQRT_2+COS24_SQRT_2 |
#24 | -COS20_SQRT_2 | -COS20_SQRT_2+COS12_SQRT_2 | COS20_SQRT_2+COS12_SQRT_2 |
#25 | -COS28_SQRT_2 | -COS28_SQRT_2+COS4_SQRT_2 | COS28_SQRT_2+COS4_SQRT_2 |
#26 | COS28_SQRT_2 | COS28_SQRT_2+COS4_SQRT_2 | -COS28_SQRT_2+COS4_SQRT_2 |
#27 | COS20_SQRT_2 | COS20_SQRT_2+COS12_SQRT_2 | -COS20_SQRT_2+COS12_SQRT_2 |
표 2의 값에 기초하여 도 4의 도면 부호 440의 연산을 수행하는 과정을 예시한다.
도 7a 내지 도 7c는 도 4의 도면 부호 440에 따른 연산 과정을 설명하기 위한 도면이다.
도 7a를 참조하면, 도면 부호 440으로 도시된 연산 과정에 입력되는 중간값을 각각 X1, X2, X3, X4, 출력값을 Y1, Y2, Y3, Y4라고 정의한다. 도 7a에 도시된 연산 과정(440)은 도 7b에 도시된 연산 과정 및 도 7c에 도시된 연산 과정을 포함한다.
도 7b를 참조하면, 변환부(120)는 다음의 알고리즘에 따라서 중간값 X1 및 X4에 대한 연산을 수행하여, Y1 및 Y4를 출력한다.
{ T=C0*(X1+X4); U=C1_p_C0*X1-T; V=T+C1_m_C0*X4 }
표 2를 참조하면 C0, C1_p_C0 및 C1_m_C0의 값으로써, C0=COS20, C1_p_C0=COS20+COS12, C1_m_C0=-COS20+COS12 값이 이용된다(#2인 경우).
유사하게, 도 7c를 참조하면 변환부(120)는 다음의 알고리즘에 따라서 중간값 X2 및 X3에 대한 연산을 수행하여, Y2 및 Y3를 출력한다.
{ T=C0*(X2+X3); U=C1_p_C0*X2-T; V=T+C1_m_C0*X3 }
표 2를 참조하면 C0, C1_p_C0 및 C1_m_C0의 값으로써, C0=COS28, C1_p_C0=-COS28+COS4, C1_m_C0=-COS28+COS4값이 이용된다(#3인 경우).
전술한 도 7에 예시된 바와 같이, 도 4에 도시된 도면 부호 510의 연산 과정이 표 2에 도시된 #n에 따른 파라메터를 이용하여 수행될 수 있다.
다시 도 5를 참조하면, 도면 부호 520은 중간값 X,Y를 더하거나 감산하여 U,V를 출력하는 연산이며, 도면 부호 530은 중간값 X를 소정 비트(S_BIT)만큼 좌향 쉬프트(<<)하는 연산이며, 도면 부호 540은 중간값 X를 소정 비트(2*S_BIT)만큼 좌향 쉬프트(<<)하는 연산이며, 도면 부호 550은 중간값 X의 제곱근을 출력하는 연산이며, 도면 부호 560은 감산 연산, 도면 부호 570은 덧셈 연산을 나타낸다.
전술한 본 발명의 일 실시예에 따른 변환부(120)에서의 32 포인트 이산 코사인 변환 과정은 다음과 같은 알고리즘을 통해 구현될 수 있다.
{
E[16],O[16];
EE[8],EO[8];
EEE[4],EEO[4];
EEEE[2],EEEO[2];
for (k=0;k<16;k++)
{
E[k] = block[k] + block[31-k];
O[k] = block[k] - block[31-k];
}
/* EE and EO */
for (k=0;k<8;k++)
{
EE[k] = E[k] + E[15-k];
EO[k] = E[k] - E[15-k];
}
/* EEE and EEO */
for (k=0;k<4;k++)
{
EEE[k] = EE[k] + EE[7-k];
EEO[k] = EE[k] - EE[7-k];
}
/* EEEE and EEEO */
EEEE[0] = EEE[0] + EEE[3];
EEEO[0] = EEE[0] - EEE[3];
EEEE[1] = EEE[1] + EEE[2];
EEEO[1] = EEE[1] - EEE[2];
xBoxE2 ( EEEE, EEEE);
xBoxO2 ( EEEO, EEEO);
xBoxO4 ( EEO , EEO);
xBoxO8 ( EO , EO);
xBoxO16( O , O);
coeff[ 0] = EEEE[0];
coeff[16] = EEEE[1];
coeff[ 8] = EEEO[0];
coeff[24] = EEEO[1];
coeff[ 4] = EEO[0];
coeff[12] = EEO[1];
coeff[20] = EEO[2];
coeff[28] = EEO[3];
coeff[ 2] = EO[0];
coeff[ 6] = EO[1];
coeff[10] = EO[2];
coeff[14] = EO[3];
coeff[18] = EO[4];
coeff[22] = EO[5];
coeff[26] = EO[6];
coeff[30] = EO[7];
coeff[ 1] = O[ 0];
coeff[ 3] = O[ 1];
coeff[ 5] = O[ 2];
coeff[ 7] = O[ 3];
coeff[ 9] = O[ 4];
coeff[11] = O[ 5];
coeff[13] = O[ 6];
coeff[15] = O[ 7];
coeff[17] = O[ 8];
coeff[19] = O[ 9];
coeff[21] = O[10];
coeff[23] = O[11];
coeff[25] = O[12];
coeff[27] = O[13];
coeff[29] = O[14];
coeff[31] = O[15];
}
상기 알고리즘에 포함된 서브 루틴은 다음과 같다.
xBoxE2( Int* Ein, Int* Eout)
{
Int EE[2];
EE[0] = Ein[0]+Ein[1];
EE[1] = Ein[0]-Ein[1];
Eout[0] = (EE[0]<<12);
Eout[1] = (EE[1]<<12);
}
xBoxO2( Int* Oin, Int* Oout)
{
Givens(Oin[0],Oin[1],Oout[1],Oout[0],5312,7616,-3008);
}
xBoxO4( Int* Oin, Int* Oout)
{
Int iStage[4][3];
Givens(Oin[0],Oin[3],iStage [0][0],iStage [3][0],36,89,17);
Givens(Oin[1],Oin[2],iStage [1][0],iStage [2][0],12,75,51);
iStage [0][1] = iStage [0][0]+iStage [2][0];
iStage [1][1] = iStage [0][0]-iStage [2][0];
iStage [2][1] = iStage [3][0]-iStage [1][0];
iStage [3][1] = iStage [3][0]+iStage [1][0];
Oout[0] = ((iStage [0][1]+iStage [3][1])<<6);
Oout[1] = iStage [1][1]* 90 ;
Oout[2] = iStage [2][1]* 90 ;
Oout[3] = ((iStage [0][1]-iStage [3][1])<<6);
}
xBoxO8( Int* Oin, Int* Oout)
{
Int iStage16[8][4];
Givens(Oin[0],Oin[7],iStage16[7][0],iStage16[0][0],41,90,8);
Givens(Oin[6],Oin[1],iStage16[1][0],iStage16[6][0],56,86,-26);
Givens(Oin[2],Oin[5],iStage16[5][0],iStage16[2][0],19,80,42);
Givens(Oin[4],Oin[3],iStage16[3][0],iStage16[4][0],64,70,-58);
iStage16[0][1] =iStage16[0][0] + iStage16[3][0];
iStage16[1][1] =iStage16[1][0] + iStage16[2][0];
iStage16[2][1] =iStage16[1][0] - iStage16[2][0];
iStage16[3][1] =iStage16[0][0] - iStage16[3][0];
iStage16[4][1] =iStage16[4][0] + iStage16[7][0];
iStage16[5][1] =iStage16[5][0] + iStage16[6][0];
iStage16[6][1] =iStage16[5][0] - iStage16[6][0];
iStage16[7][1] =iStage16[4][0] - iStage16[7][0];
iStage16[0][2] =iStage16[0][1] + iStage16[6][1];
iStage16[1][2] =iStage16[1][1] + iStage16[7][1];
iStage16[2][2] =iStage16[2][1] + iStage16[3][1];
iStage16[3][2] =iStage16[2][1] - iStage16[3][1];
iStage16[4][2] =iStage16[4][1] + iStage16[5][1];
iStage16[5][2] =iStage16[4][1] - iStage16[5][1];
iStage16[6][2] =iStage16[0][1] - iStage16[6][1];
iStage16[7][2] =iStage16[1][1] - iStage16[7][1];
Givens(iStage16[0][2],iStage16[1][2],iStage16[0][3],iStage16[1][3],83,119, -47);
Givens(iStage16[7][2],iStage16[6][2],iStage16[6][3],iStage16[7][3],36,119,47);
iStage16[3][3] = (iStage16[4][2] + iStage16[3][2])<<6;
iStage16[4][3] = (iStage16[4][2] - iStage16[3][2])<<6;
iStage16[2][3] = iStage16[2][2]*90;
iStage16[5][3] = iStage16[5][2]*90;
Oout[0] = iStage16[4][3];
Oout[1] = iStage16[0][3];
Oout[2] = iStage16[7][3];
Oout[3] = iStage16[5][3];
Oout[4] = iStage16[2][3];
Oout[5] = iStage16[6][3];
Oout[6] = iStage16[1][3];
Oout[7] = iStage16[3][3];
}
xBoxO16( Int* Oin, Int* Oout)
{
Int iStage32[22][5];
Givens(Oin[15],Oin[ 0],iStage32[ 0][0],iStage32[15][0],47,90,-4);
Givens(Oin[ 1],Oin[14],iStage32[14][0],iStage32[ 1][0],38,89,13);
Givens(Oin[13],Oin[ 2],iStage32[2][0],iStage32[13][0],55,88,-22);
Givens(Oin[ 3],Oin[12],iStage32[12][0],iStage32[ 3][0],27,85,31);
Givens(Oin[11],Oin[ 4],iStage32[4][0],iStage32[11][0],60,82,-38);
Givens(Oin[ 5],Oin[10],iStage32[10][0],iStage32[ 5][0],16,78,46);
Givens(Oin[ 9],Oin[ 6],iStage32[ 6][0],iStage32[9][0],63,72,-54);
Givens(Oin[ 7],Oin[ 8],iStage32[ 8][0],iStage32[ 7][0],3,67,61);
iStage32[ 0][1] =iStage32[ 0][0] + iStage32[ 7][0];
iStage32[ 1][1] =iStage32[ 1][0] + iStage32[ 6][0];
iStage32[ 2][1] =iStage32[ 2][0] + iStage32[ 5][0];
iStage32[ 3][1] =iStage32[ 3][0] + iStage32[ 4][0];
iStage32[ 4][1] =iStage32[ 3][0] - iStage32[ 4][0];
iStage32[ 5][1] =iStage32[ 2][0] - iStage32[ 5][0];
iStage32[ 6][1] =iStage32[ 1][0] - iStage32[ 6][0];
iStage32[ 7][1] =iStage32[ 0][0] - iStage32[ 7][0];
iStage32[ 8][1] =iStage32[ 8][0] + iStage32[15][0];
iStage32[ 9][1] =iStage32[ 9][0] + iStage32[14][0];
iStage32[10][1] =iStage32[10][0] + iStage32[13][0];
iStage32[11][1] =iStage32[11][0] + iStage32[12][0];
iStage32[12][1] =iStage32[11][0] - iStage32[12][0];
iStage32[13][1] =iStage32[10][0] - iStage32[13][0];
iStage32[14][1] =iStage32[ 9][0] - iStage32[14][0];
iStage32[15][1] =iStage32[ 8][0] - iStage32[15][0];
iStage32[ 0][2] =iStage32[ 0][1] + iStage32[12][1];
iStage32[ 1][2] =iStage32[ 1][1] + iStage32[13][1];
iStage32[ 2][2] =iStage32[ 2][1] + iStage32[14][1];
iStage32[ 3][2] =iStage32[ 3][1] + iStage32[15][1];
iStage32[ 4][2] =iStage32[ 4][1] + iStage32[ 7][1];
iStage32[ 5][2] =iStage32[ 5][1] + iStage32[ 6][1];
iStage32[ 6][2] =iStage32[ 5][1] - iStage32[ 6][1];
iStage32[ 7][2] =iStage32[ 4][1] - iStage32[ 7][1];
iStage32[ 8][2] =iStage32[ 8][1] + iStage32[11][1];
iStage32[ 9][2] =iStage32[ 9][1] + iStage32[10][1];
iStage32[10][2] =iStage32[ 9][1] - iStage32[10][1];
iStage32[11][2] =iStage32[ 8][1] - iStage32[11][1];
iStage32[12][2] =iStage32[ 0][1] - iStage32[12][1];
iStage32[13][2] =iStage32[ 1][1] - iStage32[13][1];
iStage32[14][2] =iStage32[ 2][1] - iStage32[14][1];
iStage32[15][2] =iStage32[ 3][1] - iStage32[15][1];
Givens(iStage32[ 3][2],iStage32[ 0][2],iStage32[15][4],iStage32[ 0][4],50,125,25);
Givens(iStage32[2][2],iStage32[1][2],iStage32[17][4],iStage32[16][4],18,107,71);
Givens(iStage32[ 3][2],iStage32[ 0][2],iStage32[ 3][3],iStage32[ 0][3],36,89,17);
Givens(iStage32[ 2][2],iStage32[ 1][2],iStage32[ 2][3],iStage32[ 1][3],12,75,51);
iStage32[ 4][3] = iStage32[ 4][2] + iStage32[10][2];
iStage32[ 5][3] = iStage32[ 5][2] + iStage32[11][2];
iStage32[ 6][3] = iStage32[ 6][2] + iStage32[ 7][2];
iStage32[ 7][3] = iStage32[ 6][2] - iStage32[ 7][2];
iStage32[ 8][3] = iStage32[ 8][2] + iStage32[ 9][2];
iStage32[ 9][3] = iStage32[ 8][2] - iStage32[ 9][2];
iStage32[10][3] = iStage32[ 4][2] - iStage32[10][2];
iStage32[11][3] = iStage32[ 5][2] - iStage32[11][2];
Givens(iStage32[12][2],iStage32[15][2],iStage32[12][3],iStage32[15][3],12,75,51);
Givens(iStage32[13][2],iStage32[14][2],iStage32[13][3],iStage32[14][3],36,89,17);
Givens(iStage32[12][2],iStage32[15][2],iStage32[18][4],iStage32[19][4],18,107,71);
Givens(iStage32[13][2],iStage32[14][2],iStage32[20][4],iStage32[21][4],50,125,25);
Givens(iStage32[ 5][3],iStage32[ 4][3],iStage32[ 5][4],iStage32[4][4],36,119,47);
Givens(iStage32[11][3],iStage32[10][3],iStage32[11][4],iStage32[10][4],36,119,47);
iStage32[ 2][4] = -iStage32[ 0][3] + iStage32[ 2][3];
iStage32[ 3][4] = -iStage32[ 1][3] + iStage32[ 3][3];
iStage32[ 6][4] = 90*iStage32[ 6][3] ;
iStage32[ 7][4] = ( iStage32[ 7][3] + iStage32[ 8][3])<<6;
iStage32[ 8][4] = (-iStage32[ 7][3] + iStage32[ 8][3])<<6;
iStage32[ 9][4] = 90*iStage32[ 9][3] ;
iStage32[13][4] = iStage32[12][3] - iStage32[13][3];
iStage32[14][4] = iStage32[14][3] + iStage32[15][3];
Oout[ 0] = iStage32[ 8][4];
Oout[ 1] = - iStage32[ 0][4] - iStage32[17][4];
Oout[ 2] = -iStage32[13][4] + iStage32[14][4];
Oout[ 3] = - iStage32[10][4];
Oout[ 4] = iStage32[ 5][4];
Oout[ 5] = - iStage32[18][4] - iStage32[20][4];
Oout[ 6] = -iStage32[ 3][4] + iStage32[ 2][4];
Oout[ 7] = iStage32[ 6][4];
Oout[ 8] = iStage32[ 9][4];
Oout[ 9] = iStage32[ 3][4] + iStage32[ 2][4];
Oout[10] = - iStage32[21][4] + iStage32[19][4];
Oout[11] = -iStage32[ 4][4];
Oout[12] = - iStage32[11][4];
Oout[13] = -iStage32[13][4] - iStage32[14][4];
Oout[14] = - iStage32[16][4] - iStage32[15][4];
Oout[15] = -iStage32[ 7][4];
}
한편, 본 발명의 일 실시예에 따르면, 표 1 및 2에 도시된 파라메터 값이나 정수값을 갖는 N 포인트 이산 코사인 변환 행렬의 원소들은 미리 계산되어 테이블 형태 등으로 미리 저장될 수 있으며, 변환부(120)는 이러한 미리 계산되어 저장된 파라메터 값이나 정수값을 갖는 N 포인트 이산 코사인 변환 행렬의 원소들을 이용하여 변환을 수행할 수 있다.
도 8은 본 발명의 일 실시예에 따른 영상 역변환 장치의 구성을 나타낸 블록도이다.
도 8을 참조하면, 본 발명의 일 실시예에 따른 영상 복호화 장치(800)는 엔트로피 복호화부(810), 역양자화부(820), 역변환부(830) 및 예측부(840)를 포함한다.
엔트로피 복호화부(810)는 입력 비트스트림으로부터 복호화되는 현재 블록의 예측 모드 정보, 참조 픽처 정보 및 레지듀얼 정보를 추출한다.
역양자화부(820)는 엔트로피 복호화부(810)에서 엔트로피 복호화된 양자화된 변환 계수들을 역양자화한다.
역변환부(830)는 역양자화된 변환 계수들을 역변환한다. 역변환 결과, 블록 단위에 대한 레지듀얼 값들이 복원된다. 특히, 본 발명의 일 실시예에 따른 역변환부(830)는 전술한 도 1의 변환부(120)에 대응되는 역변환 과정을 수행한다. 즉, 역변환부(830)는 N 포인트 이산 코사인 역변환에 이용되는 역변환 행렬을 구성하는 원소들을 소정의 스케일링 팩터(scaling factor)를 이용하여 스케일링하여 정수값을 갖는 원소들로 구성된 N 포인트 이산 코사인 역변환 행렬을 생성하고, 생성된 N 포인트 이산 코사인 역변환 행렬을 이용하여 N 포인트 이산 코사인 역변환을 수행한다. 또한, 본 발명의 일 실시예에 따른 역변환부(830)는 원(original) N 포인트 이산 코사인 역변환 행렬에 따른 결과값과의 차이를 고려하여, 스케일링된 원소들을 이용한 N 포인트 이산 코사인 역변환의 결과값에 대하여 다시 스케일링 팩터를 이용한 디스케일링(de-scaling)을 수행할 수 있다. 스케일링 및 디스케일링 과정은 스케일링 팩터가 2의 지수승(power of 2)의 값을 갖는 경우 쉬프트 연산(>>,<<)으로 구현될 수 있다. 디스케일링 과정은 역변환 과정 이후에 수행되거나, 역양자화 단계에서 수행되는 역양자화 과정에 통합될 수 있다.
예측부(840)는 인터 예측 또는 인트라 예측을 통해 현재 블록의 예측값을 생성하고, 생성된 예측값은 역변환부(830)에서 복원된 레지듀얼과 더하여져서 현재 블록이 복원된다.
이하, 도 8의 역변환부(830)에서 수행되는 역변환 과정에 대하여 구체적으로 설명한다. 역변환부(830)에서 수행되는 역변환 과정은 도 1의 변환부(120)에서 수행되는 변환 과정과 유사하게, 역변환부(830)는 전술한 수학식 2에 정의된 N 포인트 이산 코사인 역변환 행렬의 (k,n)번째의 원소 B
kn에 포함된
성분을 스케일링하여 정수값으로 대체하여 정수값인 원소들로 구성된 N 포인트 이산 코사인 역변환 행렬을 획득하고, 획득된 정수값인 원소들로 구성된 N 포인트 이산 코사인 역변환 행렬을 이용하여 주파수 역변환을 수행한다.
도 9는 본 발명의 일 실시예에 따른 영상 역변환 방법을 나타낸 플로우 차트이다.
도 8 및 9를 참조하면, 단계 810에서 역변환부(830)는 N 포인트 이산 코사인 역변환 행렬을 구성하는 각 원소들에 소정의 스케일링 팩터(scaling factor) S를 곱한 후 반올림하여 정수값을 갖는 원소들을 획득한다.
전술한 바와 같이, N 포인트 이산 코사인 역변환 행렬은
인 성분을 포함한다. 변환부(830)는 이러한
에 소정의 스케일링 팩터 S를 곱한 다음 반올림하여 정수값을 획득한다. 전술한 바와 같이, N 포인트 이산 코사인 역변환 행렬에 포함된
을 정수값으로 변환한 원소는 int(cos((2n+1)k)*sqrt(2.0)*S)로 표현되며, 이러한 정수값으로 변환된 원소 int(cos((2n+1)k)*sqrt(2.0)*S)를 COS_((2n+1)k)_SQRT_2로 나타낸다고 정의하며, 역변환 단계에서도 표 1에 정의된 파라메터를 그대로 이용할 수 있다.
역변환부(830)는 이와 같이 N 포인트 이산 코사인 역변환 행렬의 원소들에 스케일링 팩터 S를 곱한 다음 반올림한 값을 다시 스케일링 팩터 S를 이용하여 좌향 쉬프트 연산(<<)을 수행한다. S_BIT 를 log2S 라고 정의하면, 역변환부(830)는 COS_((2n+1)k)_SQRT_2를 다시 S_BIT 만큼 좌향 쉬프트(<<)하여 N 포인트 이산 코사인 역변환 행렬을 획득한다. 본 발명의 일 실시예에 따른 역변환부(830)는 N 포인트 이산 코사인 역변환 행렬의 원소들에 S를 곱한 후 반올림한 값에 다시 S를 곱함으로써 결과적으로 S^2만큼 N 포인트 이산 코사인 역변환 행렬의 원소들을 스케일링하게 된다. 이와 같은 스케일링 과정을 통해 획득된 N 포인트 이산 코사인 역변환 행렬 IDCT_NxN[N][N]은 전술한 N 포인트 이산 코사인 변환 행렬들 DCT_NxN[N][N]과의 역행렬 관계 또는 이항 관계를 이용하여서 획득될 수도 있다.
다시 도 9를 참조하면, 단계 920에서 역변환부(830)는 정수값을 갖는 원소들로 구성된 N 포인트 이산 코사인 역변환 행렬을 이용하여 N 포인트 이산 코사인 역변환을 수행한다.
단계 930에서, 역변환부(830)는 스케일링 팩터를 이용하여 N 포인트 이산 코사인 역변환 결과값에 대한 디스케일링을 수행한다. 스케일링 팩터를 이용하여 스케일링된 정수값을 갖는 N 포인트 이산 코사인 역변환 행렬과 원(original) N 포인트 이산 코사인 역변환 행렬을 이용한 결과값의 차이를 보상하기 위해서는 스케일링된 정수값을 갖는 N 포인트 이산 코사인 역변환 행렬을 이용한 역변환 결과값을 다시 디스케일링(de-scaling)해야 한다. 본 발명의 일 실시예에 따른 스케일링된 N 포인트 이산 코사인 역변환 행렬의 각 원소는 원(original) N 포인트 이산 코사인 역변환 행렬의 각 원소에 스케일링 팩터의 제곱값을 곱한 값에 대응되므로, 디스케일링 과정은 역변환 행렬 결과값을 S^2의 값으로 나누어줌으로써 수행될 수 있다. 전술한 바와 같이 S_BIT 를 log2S 라고 정의하면, 디스케일링 과정은 2*S_BIT 만큼 N 포인트 이산 코사인 역변환에 따른 결과값을 우향 쉬프트(>>) 함으로써 수행될 수 있다. 이러한 우향 쉬프트(>>)를 통한 디스케일링 과정은 역변환부(830)에서 수행되는 대신에 역양자화부(820)에서 수행되는 역양자화 과정과 통합될 수 있다. 구체적으로, 역양자화 과정에서 적용되는 양자화 스텝(Qstep) 값을 2*S_BIT 만큼 우향 쉬프트(>>)한 값, 즉 양자화 스텝(Qstep)값을 S^2의 값으로 나눈 새로운 양자화 스텝을 이용하여 역양자화를 수행함으로써 역양자화 과정에 통합되어 디스케일링 과정이 수행될 수 있다.
전술한 정수값을 갖는 원소들로 구성된 N 포인트 이산 코사인 역변환 행렬은 도 10에 기재된 바와 같은 흐름도로 구현될 수 있다.
도 10은 본 발명의 일 실시예에 따른 32, 16, 8 및 4 포인트 이산 코사인 역변환 과정을 재구성한 흐름도이다. 도 10에 도시된 각 연산 구성 요소의 동작은 전술한 도 5와 같다. 도 10에서 점선으로 표시된 도면 부호 1010은 16 포인트 이산 코사인 역변환의 흐름도, 도면 부호 1020은 8 포인트 이산 코사인 역변환의 흐름도, 도면 부호 1030은 4 포인트 이산 코사인 역변환의 흐름도를 나타낸다.
도 10의 흐름도는 본 발명의 일 실시예에 따른 정수값을 갖는 원소들로 구성된 N 포인트 이산 코사인 역변환 행렬에 따라 구현된 것이다. 구체적으로, Y0 내지 Y31은 32 포인트 이산 코사인 역변환의 입력값들을 나타내며, X0 내지 X31은 32 포인트 이산 코사인 역변환에 따른 결과값이다.
전술한 도 4와 같이, 도 10에 포함된 회전 변환 연산 과정은 T를 계산한 다음, C1 및 C0를 이용하여 획득된 C1_p_C0 및 C1_m_C0과 입력된 X 및 Y값을 각각 곱하여 T를 더하거나 감산함으로써 U,V를 계산하는 변경된 연산을 통해 수행될 수 있다. C1_p_C0=C1+C0 및 C1_m_C0=C1-C0 이다.
T=C0*(X+Y); U=C1_p_C0*X-T; V=T+C1_m_C0*Y
C1 및 C0는 도시된 #n에 따라서 결정되는 값으로, 전술한 바와 같이 C0이 cos θ, C1이 sin θ라고 할 때, C0에 따라서 C1의 값이 결정될 수 있으며, 전술한 표 1에 기초하여 도 10의 #n에 따라서 역변환 과정에서 이용되는 C0, C1_p_C0 및 C1_m_C0의 값은 다음의 표 3과 같다.
표 3
#n | C0 | C1_p_C0 | C1_m_C0 |
#1 | COS8_SQRT_2<<S_BIT | (COS24_SQRT_2<<S_BIT)+ (COS8_SQRT_2<<S_BIT) | (COS24_SQRT_2<<S_BIT)- (COS8_SQRT_2<<S_BIT) |
#2 | -COS20 | -COS20+COS12 | COS20-COS12 |
#3 | COS4 | COS28+COS4 | COS28-COS4 |
#4 | COS24_SQRT_2 | COS24_SQRT_2+COS8_SQRT_2 | -COS24_SQRT_2+COS8_SQRT_2 |
#5 | COS24_SQRT_2 | COS24_SQRT_2+COS8_SQRT_2 | -COS24_SQRT_2+COS8_SQRT_2 |
#6 | -COS18 | -COS18+COS14 | COS18+COS14 |
#7 | -COS22 | COS10-COS22 | COS10+COS22 |
#8 | -COS30 | COS2-COS30 | COS2+COS30 |
#9 | -COS26 | -COS26+COS6 | COS26+COS6 |
#10 | COS20_SQRT_2 | COS20_SQRT_2-COS12_SQRT_2 | -COS20_SQRT_2-COS12_SQRT_2 |
#11 | COS28_SQRT_2 | COS28_SQRT_2+COS4_SQRT_2 | -COS28_SQRT_2+COS4_SQRT_2 |
#12 | COS4_SQRT_2 | COS28_SQRT_2+COS4_SQRT_2 | COS28_SQRT_2-COS4_SQRT_2 |
#13 | COS20_SQRT_2 | COS20_SQRT_2+COS12_SQRT_2 | -COS20_SQRT_2+COS12_SQRT_2 |
#14 | COS4 | COS28+COS4 | COS28-COS4 |
#15 | COS12 | -COS20+COS12 | -COS20-COS12 |
#16 | COS24_SQRT_2 | COS8_SQRT_2+COS24_SQRT_2 | COS8_SQRT_2-COS24_SQRT_2 |
#17 | -COS24_SQRT_2 | -COS8_SQRT_2-COS24_SQRT_2 | -COS8_SQRT_2+COS24_SQRT_2 |
#18 | COS12 | COS20+COS12 | COS20-COS12 |
#19 | -COS28 | -COS28-COS4 | COS28-COS4 |
#20 | COS23 | COS23-COS9 | -COS23- COS9 |
#21 | -COS21 | -COS11-COS21 | -COS11+COS21 |
#22 | COS19 | COS19+COS13 | -COS19+COS13 |
#23 | -COS17 | COS15-COS17 | COS15+COS17 |
#24 | COS31 | COS31- COS1 | -COS31- COS1 |
#25 | -COS29 | -COS3- COS29 | -COS3+ COS29 |
#26 | COS27 | COS27+ COS5 | -COS27+ COS5 |
#27 | COS25 | COS7+COS25 | COS7-COS25 |
이상과 같이 본 발명은 비록 한정된 실시예와 도면에 의해 설명되었으나, 본 발명이 상기의 실시예에 한정되는 것은 아니며, 이는 본 발명이 속하는 분야에서 통상의 지식을 가진 자라면 이러한 기재로부터 다양한 수정 및 변형이 가능하다. 따라서, 본 발명의 사상은 아래에 기재된 특허청구범위에 의해서만 파악되어야 하고, 이와 균등하거나 또는 등가적인 변형 모두는 본 발명 사상의 범주에 속한다 할 것이다. 또한, 본 발명에 따른 시스템은 컴퓨터로 읽을 수 있는 기록매체에 컴퓨터가 읽을 수 있는 코드로서 구현하는 것이 가능하다. 컴퓨터가 읽을 수 있는 기록매체는 컴퓨터 시스템에 의하여 읽혀질 수 있는 데이터가 저장되는 모든 종류의 기록장치를 포함한다. 기록매체의 예로는 ROM, RAM, CD-ROM, 자기 테이프, 플로피 디스크, 광데이터 저장장치 등을 포함한다. 또한 컴퓨터가 읽을 수 있는 기록매체는 네트워크로 연결된 컴퓨터 시스템에 분산되어 분산방식으로 컴퓨터가 읽을 수 있는 코드가 저장되고 실행될 수 있다.