이산 푸리에 변환(DFT)과 고속 푸리에 변환(FFT)이란?
이산 푸리에 변환(Discrete Fourier Transform, DFT)은 공간 영역의 데이터를 주파수 영역의 데이터로 변환하는 수학적 기법입니다.
고속 푸리에 변환(Fast Fourier Transform, FFT)은 이러한 DFT를 빠르고 효율적으로 계산하기 위해 설계된 알고리즘입니다.
여기서 공간 데이터는 일반적으로 다차원 배열 형태로 표현되며, 주파수 데이터란 특정 시간 구간 내에 포함된 신호의 개수나 파장에 관한 정보를 담고 있는 데이터를 의미합니다.
이번 글에서는 파이썬의 'SciPy' 라이브러리를 사용하여 DFT를 수행하는 방법을 살펴보겠습니다.
그래프는 matplotlib 라이브러리로 그리고, 신호 데이터는 Numpy 라이브러리를 사용해 생성합니다.
예제 코드
from matplotlib import pyplot as plt
import numpy as np
my_freq = 6
freq_samp = 70
time_val = np.linspace(0, 3, 3 * freq_samp, endpoint=False)
amp_val = np.sin(my_freq * 3 * np.pi * time_val)
figure, axis = plt.subplots()
axis.plot(time_val, amp_val)
axis.set_xlabel('Time (in seconds)')
axis.set_ylabel('Amplitude of signal')
plt.show()
from scipy import fftpack
A = fftpack.fft(amp_val)
frequency = fftpack.fftfreq(len(amp_val)) * freq_samp
figure, axis = plt.subplots()
axis.stem(frequency, np.abs(A))
axis.set_xlabel('Frequency in Hz')
axis.set_ylabel('Frequency Spectrum Magnitude')
axis.set_xlim(-freq_samp / 2, freq_samp / 2)
axis.set_ylim(-7, 125)
plt.show()
실행 결과

코드 설명
- 먼저 필요한 패키지들(matplotlib, numpy, scipy)을 임포트합니다.
- Numpy 라이브러리의
linspace와sin함수를 사용하여 사인파 형태의 샘플 데이터를 생성합니다. - 생성된 데이터를 matplotlib 라이브러리를 통해 시간 축과 진폭 축으로 구성된 사인파 그래프로 시각화합니다.
- 다음으로 SciPy의
fftpack모듈을 사용하여 생성된 데이터에 대한 고속 푸리에 변환(FFT)을 계산합니다.fft()함수가 실제 변환을 수행하며,fftfreq()함수는 각 주파수 성분에 해당하는 주파수 값을 반환합니다. - 마지막으로 변환 결과인 주파수 스펙트럼을 줄기(stem) 그래프로 다시 시각화하여, 원래 신호에 포함된 주파수 성분의 크기를 확인할 수 있습니다.
이처럼 SciPy의 fftpack 모듈을 활용하면 몇 줄의 코드만으로도 시간 영역의 신호를 주파수 영역으로 손쉽게 변환하고 분석할 수 있습니다.