operator01.jpg



안녕하세요? 교주 LGS입니다.

이번 시간에는 STFT (Short Time Fourier Transform)에 대해서 설명드리겠습니다.

바로 강의 시작하도록 하죠~ ^^


우리는 이미 지난 FFT 강좌를 통해 Fourier Transform이란 것이 Time Domain에서 Frequency Domain으로 Domain을 변경하는

녀석이란 것을 알고 있습니다. (FFT 강좌는 여기(1부, 2부)를 참조하세요)

FFT를 하면 시간축으로 기록한 데이터에서는 잘 보이지 않던 것들이 주파수 축에서는 아주 잘 보이는 신기한 경험을 하게 됩니다.


STFT01.png

(이미지 출처: http://masters.donntu.edu.ua/2008/eltf/naftulin/library/letter5.htm)


그!런!데! FFT를 하면 "결정적"인 단점이 하나 있습니다. 바로 시간에 대한 정보가 휭~ 하고 다 날아가 버린다는 것이죠~ -_-;;

예를 들어 아래와 같이 시간이 흘러감에 따라 주파수가 변하는 데이터를 FFT 한다고 해봅시다.


STFT02.png



0초부터 0.2초까지는 10Hz로 진동하고 0.2초부터 0.4초까지는 25Hz로 진동하고... 대충 이런 녀석입니다.

시간에 따라 주파수가 변하죠? ^^ 자~ 위의 data에 FFT를 걸어주면...


STFT03.png


오~ 아주 깔끔하게 data에 포함되어있는 주파수 성분을 찾아주네요.. ^^

BUT!! 냠.. 어느 주파수가 언제나오는지는 위의 FFT 그래프만 보고는 알 수가 없습니다. -_-;;

FFT 그래프만 보고 100Hz성분이 0.6초에서 0.8초 사이에 위치해 있다는 것을 절대 알 수가 없어요!!

(나는 FFT 그래프만 보고 time domain에서 어느 주파수성분이 언제 나오는지 알 수 있다는 분은 어서 빨리 정신과 상담을...)


사실 시간에 따라 주파수가 변하는 데이터(transient data)는 실제 현장에서 굉장히 자주 나타납니다.

지진 데이터, 환자의 뇌파 데이터, 주가 데이터 등등 모두 시간이 흘러감에 따라 진동수가 바뀌는 녀석들입니다.

단순히 FFT만가지고는 지진이 언제 일어났고, 환자의 뇌파가 언제 변했고, 주가의 흐름이 언제 바뀌었는지 모른다는 말이예요.

그래서 머리를 굴리기 시작했습니다. ^^ 주파수 정보와 시간 정보를 동시에 볼 수 있는 방법은 없을까?

밑으로 내려가시기 전에 주파수 정보와 시간정보를 동시에 보는 방법이 무엇일까 잠시 생각해보세요~ o(^o^)o


가장 간단한 방법은 Time domain data를 일정한 크기로 잘개 쪼개서 각 구간마다 FFT를 하는거예요 (그럴듯 하나요? ^^)

아니면 일정한 크기의 창(Window)를 끌고 다니면서 window에 들어온 data에 대해서만 FFT를 수행한 후 

Window가 위치한 시간을 x축으로 하고 그때의  FFT한 결과를 y축(Frequency)과 z축(magnitude)으로 표현한 

3차원 그래프로(아니면 지도와 같은 형태로 표현된 2차원 이미지로) 표현할 수 있을 겁니다.


STFT_ani.gif 


무슨말인지 모르시겠다구요? ^^

아래의 그림을 보시면 바로 이해가 갈 것입니다.

STFT08.png


위와 같이 일정 구간의 짧은 시간(Short Time)에 대해서 Fourier Transform을 한 것을 STFT(Short Time Fourier Transform)이라고 합니다.

알고 보니 STFT도 별거 아니죠? ^^


iPad-mini TV 광고에 나왔던 Heart and Soul 피아노 곡을 STFT로 가지고 놀아 보겠습니다.



MATLAB에서 STFT를 수행하시려면 spectrogram 이라는 함수를 사용하시면 됩니다. ^^

spectrogram 함수의 자세한 사용법은 Help Browser를 참고하시구요~

피아노 음을 STFT한 결과를 위에서 바라 봤더니 아래처럼 나오내요~


STFT07.png 

Window size를 적절히 조정한 다음 

contour 함수를 사용하여 peak를 보기좋게 골라낸 후 iPad-mini의 도입부 (광고의 08초 부분 높은 음)의 STFT를 확대해보면...


STFT06.png


짠~ 음의 높낮이와 박자를 정확히 찾아내고 있음을 알 수 있습니다. (x축(시간)과 y축(음의 높이)은 맞추지 않았습니다.)

iPad-mini의 건반을 두드리는 순서와 STFT 그래프를 비교해보세요~ ^^


STFT(Short Time Fourier Transform)에도 단점이 하나 있습니다.

마치 양자역학의 불확정성의 원리(uncertainty principle)처럼 STFT로는 

시간해상도, 주파수해상도라는 두마리의 토끼를 한꺼번에 잡을 수 없습니다. -_-;;

window의 크기를 크게하면 주파수의 해상도는 올라가는 대신에 시간축의 해상도는 떨어지구요  (오른쪽 그림)

window의 크기를 작게하면 시간축의 해상도는 올라가지만 주파수축의 해상도가 떨어집니다.     (왼쪽 그림)


STFT04.png

(이미지 출처: http://en.wikipedia.org/wiki/Short-time_Fourier_transform)


그래서 또 머리를 굴려 나온 것이 바로바로바로바로 Wavelet 이라는 녀석입니다. ^^

STFT는 Window의 Size가 고정되어 있었죠? 

반면 Wavelet은 Window의 크기를 바꿔가면서 어러번 STFT하신다고 생각하시면 편합니다.

그리고 Fourier Transform이나 STFT의 경우 Bais로 cos 코사인을 사용했잖아요?

그런데 Wavelet은 이 Bais에 제약이 없습니다. 여러분이 원하는 어떠한 모양도 Bais가 될 수 있습니다.


STFT05.png

(이미지 출처: http://www.sciencedirect.com/science/article/pii/S0957417411002181)


MATLAB에서 Wavelet Toolbox를 제공하고 있으니 참고하세요..



급 마무리.. 오늘은 여기까지 입니다.

허접한 강의 따라오느라 수고하셨습니다.

다음 시간에 뵙겠습니다 ^ㅠ^ 뿅~!!

profile