푸리에 변환과 웨이블릿 변환 비교

오늘은 푸리에 변환과 웨이블릿 변환에 대해서 정리하려고 한다. 이 글을 작성함에 있어서 아래 여러 참고자료들을 참고했는데, 이중에서 [5]가 푸리에 변환과 웨이블릿 변환의 차이를 직관적으로 이해하는데 가장 큰 도움을 줬다. [10], [11]도 개인적으로 매우 유익했다.  



▶ 푸리에 변환


웨이블릿 변환을 이해하기 위해서는 푸리에 변환을 어느 정도 알고 있는 것이 좋다. 푸리에 변환은 시간에 대한 함수 또는 신호를 주파수 성분으로 분해하는 작업이다. 푸리에 변환은 어떠한 형태의 신호든 다양한 주파수와 크기를 가진 사인 곡선들을 합해서 표현할 수 있다고 가정한다. 그림1을 참고하자. 


그림1. 푸리에 변환 설명. (그림출처: [11])


그림1과 같이 여러 개의 사인 곡선으로 분해한 다음에 그 사인 곡선들의 주파수들을 통해 신호 내의 어떤 주파수들이 존재하는지를 알아낼 수 있다. 푸리에 변환 후에 신호 내에 존재하는 주파수들을 분석할 수 있다는 장점이 있지만, 시간에 대한 정보가 사라져서 각 주파수가 시간적으로 언제 존재하는 것인지 알 수 없다는 한계가 있다. 그래서 시간마다 주파수가 변하는 신호를 제대로 분석하기 어렵다. 푸리에 변환은 0~10초까지는 10Hz, 10~20초까지는 20Hz인 신호1과 0~20초까지 10Hz와 20Hz가 공존하는 신호2를 구별해낼 수 없다. 단지 10Hz와 20Hz가 존재한다고만 알려줄 수 있다. 이것은 마치 악보에 음표가 시간의 흐름에 따라 배열되어 있는 것이 아니라, 음의 높이(주파수)에 따라 배열되어 있는 것과 같은 것이다. 어떤 음들이 해당 곡에 들어있는지는 알 수 있지만, 실제로 이 음들로 어떤 음악이 탄생했는지는 알 수 없다. 



▶ 단시간 푸리에 변환


이러한 한계를 돌파하기 위해 제안된 한 방법은 단시간 푸리에 변환(short-time fourier transfrom, STFT)이다. 시간에 따라 변화하는 긴 신호를 짧은 시간 단위로 분할한 다음에 푸리에 변환을 적용하는 것이다. 결과적으로 각 시간 구간마다 어떤 주파수들이 존재하는지 알 수 있다. 짧은 시간 단위로 신호를 분할할수록 어떤 '시간'에 어떤 주파수가 존재하고 있는가를 알기 좋아지고, 비교적 긴 시간 단위로 신호를 분할하면 어떤 '주파수'가 그 시간 내에 존재하는가를 알기 좋아진다. 그러니까 신호를 분할하는 창(window)의 너비가 작아질수록 시간분해능이 좋아진다는 것이고, 창의 너비가 커질수록 주파수분해능이 좋아진다는 것이다. 분해능이 좋다는 것은 더 세밀하게 분석할 수 있다는 뜻이다. 그림2를 참고하자. 


그림2. 단시간 푸리에 변환. 왼쪽은 창의 너비가 작아 시간 분해능이 좋은 경우고, 오른쪽은 창의 너비가 길어 주파수 분해능이 좋은 경우다. (그림출처: [8])


하지만 단시간 푸리에 변환의 경우 주파수분해능과 시간분해능이 동시에 좋아지는 것은 불가능하다. 나름대로 적절한 지점을 찾을 수는 있겠지만. 그래서 나오게 된 것이 바로 웨이블릿 변환이다. 



▶ 웨이블릿 변환


그림3은 단시간 푸리에 변환과 웨이블릿 변환의 차이를 보여준다.


그림3. 단시간 푸리에 변환과 웨이블릿 변환 비교. (그림출처: [11])


위 그림에서 볼 수 있듯이, 웨이블릿 변환은 고주파 성분의 신호에 대해서는 시간 해상도를 높이고 주파수 해상도를 낮춘다. 한편 저주파 성분의 신호에 대해서는 주파수 해상도를 높이고 시간해상도를 낮춘다. STFT가 시간 분해능과 주파수 분해능 중 하나를 포기해야했다면, 웨이블릿 변환은 교묘하게 둘다 잡는다. 


시간적으로 무한한 사인곡선을 기본함수로 사용하는 푸리에 변환과 달리, 웨이블릿 변환은 시간적으로 한정되어 있는 웨이블릿 함수를 기본함수로 사용한다. 웨이블릿은 여러 종류가 있어서 응용분야에 따라 하나를 선택해서 사용하면 된다는 유연성도 지니고 있다. 그림4는 몇 가지 예를 보여준다.


그림4. 다양한 웨이블릿 형태들. (그림출처: https://www.mathworks.com/videos/understanding-wavelets-part-1-what-are-wavelets-121279.html)


이 웨이블릿을 스케일링(시간에 대해 확장 또는 축소)하고 시프팅함(시간축으로 이동)으로 신호를 분석해낼 수 있다는 것이 웨이블릿 변환의 핵심이다. 웨이블릿 변환의 절차는 다음과 같다.


1) 작은 스케일의 웨이블릿을 신호의 시작부터 끝까지 이동시키면서 비교한다. 신호와 웨이블릿의 유사도를 C라는 계수에 담는다. 

2) 신호의 끝까지 비교했다면, 웨이블릿의 스케일을 좀 더 확장시킨 다음에 1)의 과정을 진행한다. 

3) 설정한 스케일까지 이 과정을 반복한다. 작은 스케일의 웨이블릿은 신호 내에서 급작스러운 변화들과 가장 닮았기 때문에 그런 구간을 만날 때 큰 C값을 준다. 웨이블릿의 스케일이 커질수록 신호 내에서 완만한 변화들과 가장 닮았기 때문에 그런 구간에 더 큰 C값을 준다. 그림5를 참고하자. 


그림5. 웨이블릿 변환 절차 설명. (그림출처: [11])


스케일이 작을 때 여러 구간으로 신호를 분리해서 분석하기 때문에 시간 분해능이 좋은 것이고, 스케일이 클 때 신호가 큼직하게 분리되지만 주파수에 대한 정보는 좀 더 잘 살펴볼 수 있기 때문에 주파수 분해능이 좋은 것이다. 


결과적으로 웨이블릿 변환은 신호를 근사값(approximation)과 세부값(detail)로 분해한다. 근사값은 신호의 저주파 성분(전반적 내용)을 담고, 세부값은 신호의 고주파 성분(세부 사항)을 담는다. 그림6을 참고하자. 


그림6. 웨이블릿 변환은 신호를 근사값과 세부값으로 분해한다. 이 과정은 멀티 스케일로 반복될 수 있다. (그림출처: [11])


그림6과 같이 여러 스케일로 웨이블릿 분해를 적용할 수 있다. 해상도가 반으로 줄어든 근사값을 또다시 근사값과 세부값으로 분해한다. 이것은 사용자의 필요에 따라 원하는 만큼 반복될 수 있다.


그렇다면 2차원 신호의 웨이블릿 변환은 어떨까? 웨이블릿 변환을 2차원 영상에 적용하면 1개의 근사값과 3개의 세부값(수평 세부값, 수직 세부값, 대각 세부값)으로 분해된다. 멀티 스케일로 분해하면 근사값을 또 다시 1개의 근사값과 3개의 세부값으로 분해한다. 예를 들어, 400 x 400 이미지를 2개의 스케일로 분해한다면 첫 단계에서는 200 x 200 사이즈의 근사값 이미지와 3개의 세부값 이미지를 얻게 되고, 두번째 단계에서는 200 x 200 근사값 이미지가 다시 한번 분해되어 100 x 100 사이즈의 근사값 이미지와 3개의 세부값 이미지로 분해된다. 그림7을 참고하자. 


그림7. 2차원 영상의 웨이블릿 분해의 예. (그림출처: https://en.wikipedia.org/wiki/Discrete_wavelet_transform)


영상 압축 기술인 JPEG2000이 웨이블릿 변환을 활용한다. 방법은 웨이블릿 분해 후에 산출된 계수들을 양자화(quantization)해서 계수의 갯수를 줄인 다음에 다시 합성하는 것이다. 결과적으로 이미지의 디테일들이 사라지기 때문에 그만큼 용량이 줄어들게 된다. 이 디테일들은 사람들의 눈에 잘 보이지 않는 것들이기 때문에 용량을 줄이는 것이 우선이라면 어느 정도 제거해도 괜찮다. 



▶ 글을 마무리하며


웨이블릿 변환을 제대로 이해하기 위해 조사하며 작성하다 보니 5일이나 걸렸네요. 나름대로 최선을 다했지만 여전히 부족한 부분도 많이 있습니다. 하지만 정독하신다면 웨이블릿 변환과 푸리에 변환의 차이를 직관적으로 이해할 수 있을 것이라 생각합니다. 끝까지 읽어주셔서 감사합니다! 



<참고자료>

[1] https://ko.wikipedia.org/wiki/%EC%9B%A8%EC%9D%B4%EB%B8%94%EB%A6%BF_%EB%B3%80%ED%99%98, 위키백과 웨이블릿 변환(한글)

[2] https://en.wikipedia.org/wiki/Wavelet_transform, 위키백과 웨이블릿 변환(영문)

[3] https://m.blog.naver.com/PostView.nhn?blogId=matlablove&logNo=221229281729&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F, Mathworks가 제공하는 웨이블릿 변환에 관한 강의들. 

[4] http://cfd.hanyang.ac.kr/index_kor.htm, 한양대 CFD 랩 웨이블릿 설명. 

[5] http://clavez.tistory.com/54, clavez님 티스토리, Wavelet 변환의 등장 배경 및 배경. Good! 

[6] https://en.wikipedia.org/wiki/Fourier_transform, 위키백과 푸리에 변환(영문)

[7] https://ko.wikipedia.org/wiki/%ED%91%B8%EB%A6%AC%EC%97%90_%EB%B3%80%ED%99%98, 위키백과 푸리에 변환(한글)

[8] https://en.wikipedia.org/wiki/Short-time_Fourier_transform, 위키백과 단시간 푸리에 변환(영문)

[9] https://en.wikipedia.org/wiki/Multiresolution_analysis, 위키백과 멀티분해능 분석(영문)

[10] http://ryoo.tistory.com/attachment/pns3830.ppt, 홍정미, 문희윤님에 의해 작성된 웨이블릿 변환에 관한 PPT 자료. Good!  

[11] https://slideplayer.com/slide/7537671/, 이 웨이블릿 변환에 관한 Alexander Kolesnikov 강의 PPT, Very Good! 

댓글()
  1. anonymous 2019.03.13 15:07 댓글주소  수정/삭제  댓글쓰기

    잘 정리된 글 잘 보았습니다! 정독하니 정말 쉽게 이해되네요 ㅎㅎㅎ