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에서 가장 작은 값과 큰 값을 비교하여 가장 절대값이 큰 수의 순서가 가장 큰 주기이다.