상세 컨텐츠

본문 제목

가버 변환(Gabor Transform) - 푸리에 변환 업그레이드 버전!

적분史

by ∫2tdt=t²+c 2013. 1. 16. 20:50

본문

음성인식이나 기타 음성 처리 등을 할때 시간 데이터를 주파수 데이터로 바꿔서 다루면 편합니다. 그래서 주로 푸리에 변환(Fourier Transform)을 이용하지요. 음성 인식 공부를 하려고 푸리에 변환을 했는데, 이게 생각처럼 수월하지 않습니다. 주파수를 정밀하게 얻고자, FFT 크기를 키우면, 시간 대역이 비정밀해지고, 시간 대역을 정밀하게 하려고 FFT 크기를 줄이면, 주파수 정보가 비정밀해집니다.


예를 들어 1초에 10000개씩 샘플링된 데이터가 있다고 치면, 5000Hz의 주파수까지 잡아낼수 있을겁니다. FFT 크기를 1000으로 잡는다면, 1초에 총 10개의 덩어리가 나올겁니다. 즉 한 덩어리는 0.1초를 표현하게 됩니다. 그리고 FFT 크기가 1000 이었으므로, 5000 Hz / 1000 = 5Hz 단위로 주파수 정보를 얻어낼수 있을 겁니다. 주파수 단위가 5Hz면 꽤나 정밀한 편이지요. 다만 0.1초라는 시간단위가 걸립니다.

FFT크기를 100으로 잡으면, 1초에 100개의 덩어리가 나올겁니다. 한 덩어리는 0.01초를 표현하므로, 시간단위는 정밀해졌지만, FFT 크기가 100 이므로 5000 Hz / 100 = 50Hz. 주파수 단위가 50Hz로 듬성듬성해졌습니다.


두 마리 토끼를 다 잡을 순 없을까?


그래서 생각해낸 아이디어는 샘플을 다시 이용하는 방법이었습니다.

0, 1, 2, 3, ... 9999 까지 총 10000개의 샘플이 있습니다. 시간단위는 0.01초, 주파수 단위는 5Hz로 분석하고 싶어요!


0~999 의 샘플링을 FFT변환합니다. 이게 0.00초 대의 주파수 정보가 됩니다.

100~1099 의 샘플링을 FFT변환합니다. 이는 0.01초 대의 주파수 정보가 됩니다.

200~1199 의 샘플링을 FFT변환합니다. 이는 0.02초 대의 주파수 정보가 됩니다.


이렇게 해서 얻어낸 스펙트로그램은 아래와 같은 형태입니다 .생각보다 지저분하게 나오네요. 포만트도 깔끔하게 보이지 않고... 시도는 해봤는데 결과는 쓸만하지 못한거 같습니다.



그래서 인터넷을 검색하던 도중 가버 변환(Gabor Transform)에 대해 알게되었지요. 가버는 글쓴이보다 훨씬 먼저 이런 문제에 봉착해서 고민했던 사람입니다. 푸리에변환에 약간의 변환을 주면 훨씬 깔끔한 분석 결과를 얻을 수 있다는 사실!



가버 변환을 이용해 스펙트로그램을 그린 결과입니다. 윗 결과보다는 훨씬 선들이 깔끔하고 날씬해졌지요.ㅋ


가버 변환은 window function을 가우스 분포함수(정규분포)로 사용하는 푸리에 변환입니다. window function은 전체 구간에서 특정 부분을 추출해내기 위해 곱해주는 함수입니다. 즉 처음의 결과에서는 0~999의 샘플을 그대로 사용했다면, 가버 변환에서는 이 샘플에 정규분포 함수를 곱하고 FFT를 사용한다는 것이지요.


0~999의 샘플에다가 500 지점이 중앙이 되는 가우스 분포함수를 곱하고, FFT 변환 : 0.05초 대의 주파수 정보가 얻어짐

100~1099 샘플에다가 600 지점이 중앙이 되는 가우스 분포함수를 곱하고, FFT 변환 : 0.06초 대의 주파수 정보가 얻어짐

200~1199 샘플에다가 700 지점이 중앙이 되는 가우스 분포함수를 곱하고, FFT 변환: 0.07초 대의 주파수 정보가 얻어짐

...


window function으로 가우스 분포함수를 사용함으로써 샘플 중에서 중요한 부분은 강조되고, 나머지 부분은 약화되기에 특정 지점에서의 시간 정보가 훨씬 명확하게 표현됩니다. 


찾아보니 window function을 가우스 분포함수를 사용하는 것 말고도, 다양한 방법이 있더라구요. 각자 장단점이 있습니다. - 링크


속도도 푸리에 변환에 비해 엄청 느리지 않습니다. 푸리에 변환 전에 가우스 분포함수를 한 번 곱해주는 것만 해주면 되는데, exp 지수 연산이 부담이 된다면 먼저 테이블을 만들어놓고 사용하면 되므로, 성능 상의 문제도 거의 없습니다. (FFT는 잘 알려진 라이브러리 fftw3 같은거 가져다 쓰면 짱이지요ㅋ)


다만 가버 변환도 만능은 아닙니다. 단순히 푸리에 변환을 이용하는 것보다 촘촘한 주파수 정보와 시간 정보를 얻을순 있더라도, 어느 정도 한계는 있습니다. 또한 가우스 분포함수를 곱하므로, 전체적인 크기가 조금씩 줄어듭니다. (윗 사진보다는 아랫사진이 강도가 약하죠?) 


이 정도만 유의한다면 가버 변환 사용하는데 무리가 없을듯?! 야호 가버 변환으로 음성 분석하러 가야지


p.s. 수식은 되도록 빼고 이해한대로 쉽게 쓰려고 했으나, 그거때문에 더 어려워진듯하네요. 수식은 링크 타고 위키백과로 들어가면 잘 나와있습니다!




관련글 더보기

댓글 영역