ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • The Spectrogram and the Gabor Transform
    Math♾️/Fourier Analysis 2022. 9. 21. 21:01

    Gabor Transform 

    음악을 듣는다 했을 때 소리는 공기의 진동으로 나타나는 파동의 형태로 귀로 들어오게 될것이다.

    이러한 파동을 시간에 대하여 나타내면 아래와 같이 나타난다. 

    시간 domain에서는 특정시간($t_0$)에서의 파동의 형태를 알 수는 있지만 그 파동이 어떠한 진동수로 구성되어 있는지 알 수가 없다.

     

     

    위와 같은 파동을 푸리에 변환하게 되면 파동이 어떠한 진동수들로 구성되어 있는지 또 해당 진동수들은 얼마나 포함되어 있는지 알 수 있다.

    하지만 진동수 domain에서는 특정 진동수($c$)가 어느 시점(시간)에 나타나는지 알 수 없다. 

     

    시간 domain에서는 진동수에 대한 정보가 진동수 domain에서는 시간에 대한 정보가 없어서 특정 시점에서 파동이 어느 진동수로 구성되어 있는지에 대한 정보를 얻을 수가 없다. 이를 해결하기 위해 고안한 방법이 "Gabor Transform"이다. 

     

    Gabor Transform

    Gabor transform은 위와 같은 수식으로 표현된다. Gabor transform시 $t$(시간)와 $w$(진동수) 모두에 대하여 표현되는 것을 알 수 있다. 즉 한 좌표계내에서 시간과 진동수에 대한 정보를 모두 얻을 수 있으므로 특정시간에서의 진동수의 조합을 알 수 있다.

    기본적인 푸리에변환에서 함수$g$(가우시안 함수)등을 합성곱을 통하여 반사 및 전이시키는 과정을 추가한것이다.

    함수 $g$를 $f$상에 전이시키며 적분하는 합성곱을 이용하여 각 시간에서의 $g$의 영역에 대해서만 푸리에변환을 진행하는 것이다. 

    일반적인 푸리에변환처럼 전체구간에 대한 푸리에변환이 아니라 각 시간 구간에서의 푸리에 변환을 순차적으로 하기 때문에 특정시점에서의 진동수의 구성 및 크기를 구할 수 있게 되는 것이다. ($g$가 푸리에변환을 하는 시간 구간을 나누는 필터의 역할을 하게 되는 것이다.)

     

    Gabor transform을 하게 되면 위와 같이 각 시간에 대하여 파형이 어떠한 진동수로 구성되어 있는지 나타나게 된다. 

     

    spectrogram

    - 진동수 50과 250으로 이루어진 파형을 Gabor transform하여 나타낸 Spectrogram

    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['figure.figsize'] = [12, 8]
    plt.rcParams.update({'font.size': 18})
    
    dt = 0.001
    t = np.arange(0,2,dt)
    f0 = 50
    f1 = 250
    t1 = 2
    x = np.cos(2*np.pi*t*(f0 + (f1-f0)*np.power(t,2)/(3*t1**2)))
    
    plt.specgram(x, NFFT=128, Fs=1/dt, noverlap=120,cmap='jet')
    plt.colorbar()
    plt.show()

    위의 그림은 아래쪽 축이 시간 $t$에 대한 축이며 , 왼쪽 축이 진동수 $w$에 대한 축이다.

    오른쪽에 색으로 나타난 부분은 각 진동수의 밀도를 나타내며 현재 그림에서는 빨간색에 가까울수록 진동수의 밀도가 높은것을 의미한다.

    이를 바탕으로 파형을 분석하면 초기에는 진동수 50 성분이 많이 포함되어 있다가 시간이 지남에 따라 진동수 250 성분의 크기가 커지는 것을 알 수 있다 따라서 처음에는 낮은 음을 가지다가 시간에 지남에 따라 음의 높이가 증가할것임을 알 수 있다.

     


     

    댓글

Designed by Tistory.