주파수 변환은 처음 인코딩에 관심을 갖기 시작했을 때 가장 이해하기 어려웠던 부분 중 하나입니다..;

혹시 공대를 졸업했거나 다니시는 분들은 이해하기 쉬울지도 모르겠는데 주파수 변환의 시초?라고 할 수 있는 것이 푸리에 변환이기 때문이죠.

이 푸리에 변환으로부터 FFT, DCT, 정수 변환 등의 주파수 변환 방법들이 파생되었고 동영상 압축 또는 필터링에 사용되고 있습니다.


동영상 압축에서 주파수 변환이란 픽셀 영역의 데이터를 주파수 영역의 계수들로 바꾸는 작업을 말합니다.

처음에는 이게 무슨 말인지 잘 감이 안 오는데요..글로 설명하는 것보다는 직접적인 예를 보면 비교적 쉽게 이해가 되실 겁니다.

먼저 아래와 같은 1차원 주파수 계수들을 생각해 보겠습니다. (주파수 변환보다 그 역변환을 보는 것이 이해가 쉽습니다.)

(1차원은 데이터가 한 방향으로만 배열된다는 뜻이고 보통은 샘플이라고 불리는 오디오 데이터의 압축에 사용됩니다.

비디오 데이터는 픽셀이 가로, 세로 방향으로 배열되니까 2차원에 해당합니다.)

97    0    0    0    0    0    0    0    0


이 계수들을 주파수 역변환하면 샘플 데이터로 바뀌는데 예를 들면 아래와 같이 바뀝니다. (97과 35는 임의로 정한 숫자이고 별 의미는 없습니다.)

35    35    35    35    35    35    35    35


여기에서 중요한 점은 첫 번째 주파수 계수인 97이 역변환을 통해 얻어진 샘플 데이터 전체에 영향을 준다는 것입니다.

이번에는 주파수 계수를 하나 더 늘려서 아래와 같은 계수들을 생각해 보겠습니다.

97    13    0    0    0    0    0    0    0


위 계수들을 주파수 역변환 하면 아래와 같이 바뀝니다.

70    60    50    40    30    20    10    0


잘 보면 35를 중점으로 해서 숫자가 점점 작아지고 있죠. 13이라는 주파수 계수 또한 이렇게 샘플 데이터 전체에 영향을 주고 있는 것입니다.

이번에는 아래와 같이 다른 위치에 있는 주파수 계수를 추가해 보겠습니다.

97    0    15    0    0    0    0    0    0


위 계수들을 주파수 역변환 하면 아래와 같이 바뀝니다.

70    54    38    12    12    38    54    70


이번에는 35를 중점으로 해서 숫자가 점점 작아지다가 다시 커지고 있습니다..대충 감이 오시나요?

주파수 계수들은 이렇게 그 위치에 따라서 샘플 데이터에 영향을 주는 모습이 달라집니다.

즉, 첫 번째 계수 97은 샘플 데이터의 전체적인 모습(평균)을 결정하고 그 다음 계수들 부터는 샘플 데이터가 변하는 정도를 결정하는 것입니다.

예를 들어 아래와 같은 주파수 계수들이 있다면 주파수 역변환을 했을 때 어떻게 바뀔까요?

97    13    0    0    0    0    0    0    7


첫 번째 계수인 97은 전체적인 평균(35)을 결정하고, 13은 데이터가 점점 감소하게 만들고, 마지막 7은 감소와 증가를 계속해서 반복하게 만들겠죠.

예를 들면 아래와 같은 모습으로 역변환 데이터가 얻어지는 것입니다.

68    62    48    42    28    22    8    2


두 번째 계수인 13만 있을 때와 비교를 해보면 70부터 0까지 일정하게 감소하는 것이 아니라 감소하는 와중에도 다시 감소와 증가를 반복하고 있죠.

마지막 계수인 7도 그 나름대로 샘플 데이터에 영향을 주고 있기 때문입니다.


이렇게 주파수 계수의 위치는 역변환 후의 샘플 데이터가 얼마나 급격히 변화하는지 그 정도, 즉 주파수를 의미합니다.

그리고 주파수 계수의 크기는 샘플 데이터가 변화할 때 그 변동 폭, 즉 주파수의 크기를 의미하죠.

예를 들면 다음과 같이 마지막 계수인 7이 11로 커진다면

97    13    0    0    0    0    0    0    11


67    63    47    43    27    23    7    3


위와 같이 증가와 감소의 폭이 커지는 결과가 나오게 되는 것입니다.

이때 첫 번째 계수인 97DC 계수, 나머지 7개의 계수들은 AC 계수라고 부릅니다. 그리고 DC와 가까운 계수들은 저주파 계수, 멀리 있는 계수들은

고주파 계수라고도 부릅니다. 즉 샘플 데이터가 급격히 변화하게 만드는 계수일수록 고주파 계수에 해당한다는 말이 되겠죠.



지금까지 설명드린 내용이 대략적인 1차원 주파수 변환의 개념입니다.

주로 역변환을 위주로 설명드렸지만 주파수 변환도 마찬가지입니다. 주파수 역변환을 반대로 생각하면 되니까요.

즉, 주파수 변환이란 임의의 데이터를 주파수 계수들로 분리하는 작업을 말합니다.

그리고 앞서 말씀드린대로 1차원 주파수 변환은 주로 오디오 데이터(샘플)의 압축에 사용됩니다.

샘플링된 데이터에 1차원 주파수 변환을 수행해서 주파수 계수들로 분리하고 이를 양자화하는 것이죠.

흔히 "mp3 압축은 고주파 음을 제거한다"라고 하는데 주파수 변환을 거쳐서 나오는 계수들 중 뒷부분에 있는 고주파 계수들의 대부분이

양자화 과정에서 제거되기 때문입니다. 사람은 일정 주파수를 넘는 소리는 잘 듣지 못하고 구별하는 것도 힘들기 때문에

입력 데이터를 주파수 별로 분리한 뒤 고주파 계수에 해당하는 부분을 일부 제거함으로써 청각적인 손실은 최소화하면서 압축을 수행하는 것이죠.



동영상(비디오) 압축에 사용되는 2차원 주파수 변환도 1차원 주파수 변환과 기본적인 개념은 똑같습니다.

다만 2차원의 픽셀 데이터에 적용되기 때문에 계산이 더 복잡할 뿐입니다.

아래는 8x8 주파수 변환(2차원 DCT)이 적용된 실제 계산 결과입니다.


일반적으로 주파수 변환을 거치면 대부분의 계수들은 보시는 것처럼 저주파 계수 쪽으로 집중되는 경향을 보입니다.

이렇게 어느 한 쪽의 계수들로 집중되는 특성은 압축 과정(양자화)에서도 유리하게 작용합니다.

널리 퍼져있는 임의의 데이터에 대해서 양자화를 하는 것보다 주파수 변환 후 한쪽으로 집중된 데이터에 양자화를 하는 것이

양자화로 인해 발생하는 시각적 손실은 적으면서도 압축률은 높기 때문입니다.


하지만 모든 블럭에서 이렇게 저주파 쪽으로 계수들이 집중되는 것은 아닙니다.

예를 들어 위 그림에 있는 픽셀 데이터는 시각적으로 볼 때 경계가 날카롭지 않고 부드러운 블럭일 겁니다.

다시 말해서 인접한 픽셀 간의 변화가 크지 않습니다. 대체적으로 주변 픽셀과의 차이가 크지 않고 부드럽게 이어진다는 말이죠.

따라서 주파수 변환을 적용했을 때에도 고주파 계수는 별로 큰 값이 나오지 않고 대부분 저주파 계수 쪽으로 집중되는 것입니다.

반면 픽셀 간의 변화가 매우 큰 경우에는 주파수 변환 후 고주파 계수들도 꽤 큰 값을 갖게 됩니다.

이것은 압축 과정(양자화)의 효율을 떨어뜨리게 됩니다. 똑같은 수치로 양자화를 해도 고주파 계수들이 줄어들거나 없어지지 않고

살아남기 때문이죠. 즉 비슷한 화질을 유지하려면 더 많은 비트가 필요하다는 말이 됩니다.

인코딩을 하다보면 흔히 접할 수 있는 아래와 같은 화면이 바로 이런 경우입니다.


예쁜 설리 뒤로 보이는 LED 조명 부분을 주파수 변환한다고 생각해보면 어떨지 대충 감이 오실 겁니다.

LED 조명 하나하나가 서로 약간의 간격을 두고 떨어져있기 때문에 인접한 픽셀들이 급격히 변하는 화면이죠.

따라서 주파수 변환 후 다수의 고주파 계수들이 큰 값을 갖게 되고 여기에 상당한 비트를 소모하게 되는 것입니다.

LED 조명이 아주 촘촘하게 박혀있어서 그 경계가 아예 안보인다면 모를까 이런 상황에서는 LED가 밝을 수록(변동 폭이 클수록),

또는 LED 개수가 많을수록 압축에 불리한 화면이라는 말이 됩니다. 심지어 이 상태에서 화면이 심하게 움직이기라도 한다면..답이 안 나오죠;

여기에서는 LED를 예로 들었지만 이런식으로 픽셀 간의 변화가 큰 화면이라면 LED가 아니더라도 똑같은 원리로 압축이 어려워집니다.

물론 동영상 압축(H.264)에서는 픽셀 데이터에 직접적으로 주파수 변환이 적용되는 것은 아니지만 대략적으로 보면 그렇다는 것이죠.



마지막으로 주파수 변환은 동영상 필터링에도 유용하게 사용될 수 있습니다.

예를 들어 어떤 화면에 주파수 변환을 적용한 후 일정 수준 이상의 고주파 계수들을 모두 제거해 버리면 어떻게 될까요?

화면 내 픽셀 간의 급격한 변화는 사라지고 아주 완만한 변화만 남겠죠. 즉 블러 처리된 것처럼 부드러운(흐릿한) 화면이 나오게 됩니다.

반대로 일정 수준 이상의 고주파 계수들의 크기를 키운다면..픽셀 간 변화가 심해지면서 경계가 날카로워지는 효과가 발생하겠죠.

이런식으로 주파수 계수들을 이용하면 샤픈이나 디노이즈 같은 필터를 만들 수 있습니다.

예를 들면 FFT3DFilter는 공간적 디노이즈에 주파수 변환의 일종인 고속 푸리에 변환(FFTFast Fourier Transform)을 사용합니다.

이 외에도 avs 필터들 중에는 주파수 변환을 사용하는 것들이 많이 있습니다.




Posted by 김코덱
,