Passion/My Idea

FFT (numpy , Python)

sunshout 2010. 5. 18. 16:27

1. 개요

Numpy는 fft와 같은 복잡한 수학 공식을 구현한 패키지 이다.

나는 여기서 Time 도메인을 주파수 도메인으로 변경하는 FFT를 사용하고자 한다.

 

2. Numpy 설치(우분투)

우분투나 데비안에서 쉽게 패키지를 이용하여 설치가능하다.

apt-get install python-numpy

 

3. 간단한 예제 (진한 글씨는 코딩)

Time 도메인에 있는 값 [1,2,3,4,5,4,3,2,1,2,3,4,5,4,3,2,1] 17개

위 값을 FFT를 하면 복소수 값 17개가 나온다.

from numpy import *

from numpy.fft import *

signal = array([1,2,3,4,5,4,3,2,1,2,3,4,5,4,3,2,1])

fourier = fft(signal)

fourier

결과값 (17개의 복소수가 나온 것을 알 수 있다)

각 복소수 값은 frequency의 크기를 나타내며

각 값들은 1/17 (1/array 개수)에 해당하는 주파수이다.

array([ 4.90000000e+01+0.j , -2.43836934e+00-0.45581023j,

-1.39283185e+01-5.39585933j, 1.06933953e+00+0.662107j ,

1.02527536e-01+0.0934662j , -2.33789169e-01-0.30958689j,

-8.75040251e-01-1.75731772j, 2.85701143e-01+1.00413536j,

1.79490439e-02+0.19370103j, 1.79490439e-02-0.19370103j,

2.85701143e-01-1.00413536j, -8.75040251e-01+1.75731772j,

-2.33789169e-01+0.30958689j, 1.02527536e-01-0.0934662j ,

1.06933953e+00-0.662107j , -1.39283185e+01+5.39585933j,

-2.43836934e+00+0.45581023j])

각 복소수 값을 크기를 구하면 frequency의 크기이다.

N=len(signal)

timestep=0.1

freq = fftfreq(N, d=timestep)

array([ 0. , 0.58823529, 1.17647059, 1.76470588, 2.35294118,

2.94117647, 3.52941176, 4.11764706, 4.70588235, -4.70588235,

-4.11764706, -3.52941176, -2.94117647, -2.35294118, -1.76470588,

-1.17647059, -0.58823529])

결과를 보면 fourier 의 복소수의 절대값을 구한 값이다. (timestep은 무슨 의미인지?)

9번째 값 4.70588235와 10번째 값 -4.70588235가 가장 높다.

이는 주파수 1/9, 1/10 이 가중 높은 주파수임을 알 수 있다.

이는 주기 9 또는 주기 10 라는 의미이다.

 

fftshift(freq)

array([-4.70588235, -4.11764706, -3.52941176, -2.94117647, -2.35294118,

-1.76470588, -1.17647059, -0.58823529, 0. , 0.58823529,

1.17647059, 1.76470588, 2.35294118, 2.94117647, 3.52941176,

4.11764706, 4.70588235])

Array를 소팅하여 보여준다.

Array에서 가장 작은 값과 큰 값을 비교하여 가장 절대값이 큰 수의 순서가 가장 큰 주기이다.