[파이썬][numpy] numpy `fft` 패키지

신호 처리는 데이터를 입력받아 해당 데이터의 주파수 성분을 분석하거나 필터링하는 과정을 말합니다. 파이썬에서는 Numpy 패키지의 fft (Fast Fourier Transform) 기능을 사용하여 신호 처리 작업을 효과적으로 수행할 수 있습니다. 이번 글에서는 Numpy fft 패키지의 다양한 기능과 사용법을 살펴보겠습니다.

주파수 분석

먼저, 주어진 시간 동안 측정된 신호의 주파수 성분을 분석하는 방법에 대해 알아보겠습니다. Numpy fft 패키지의 fft 함수는 주어진 시간 동안 측정된 신호를 주파수 영역으로 변환하여 분석할 수 있습니다.

import numpy as np

# 입력 신호 생성
sampling_rate = 1000  # 샘플링 주파수
duration = 2  # 측정 시간
t = np.linspace(0, duration, sampling_rate * duration)
x = np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t) + np.sin(2*np.pi*200*t)

# 주파수 분석
fft_result = np.fft.fft(x)
frequencies = np.fft.fftfreq(len(x), 1/sampling_rate)

# 결과 출력
print(frequencies)
print(np.abs(fft_result))

위 코드에서 입력 신호 x는 50Hz, 120Hz, 200Hz의 주파수를 가진 세 개의 사인파를 합성한 것입니다. np.fft.fft를 사용하여 입력 신호를 주파수 영역으로 변환하고, np.fft.fftfreq 함수를 사용하여 주파수 값들을 얻을 수 있습니다. 결과를 출력하면 입력 신호의 주파수 성분들과 해당 주파수들의 크기를 확인할 수 있습니다.

필터링

데이터에서 원하는 주파수 성분만을 추출하거나 제외하고 싶을 때 필터링을 사용합니다. Numpy fft 패키지를 사용하면 주파수 영역에서의 필터링 작업을 간편하게 수행할 수 있습니다.

import numpy as np
import matplotlib.pyplot as plt

# 입력 신호 생성
sampling_rate = 1000  # 샘플링 주파수
duration = 2  # 측정 시간
t = np.linspace(0, duration, sampling_rate * duration)
x = np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t) + np.sin(2*np.pi*200*t)

# 주파수 필터링
fft_result = np.fft.fft(x)
frequencies = np.fft.fftfreq(len(x), 1/sampling_rate)

cut_off = 100  # 고주파수 컷오프
fft_result[frequencies > cut_off] = 0
filtered_signal = np.fft.ifft(fft_result)

# 결과 출력
plt.plot(t, x, label='Original')
plt.plot(t, filtered_signal, label='Filtered')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.legend()
plt.show()

위 코드에서 입력 신호 x는 이전 예제와 동일한 신호입니다. np.fft.fft를 사용하여 입력 신호를 주파수 영역으로 변환하고, np.fft.fftfreq 함수를 사용하여 주파수 값들을 얻습니다. 필터링을 위해 원하는 주파수 이상의 성분을 제거하기 위해 해당 주파수의 값들을 0으로 설정합니다. 마지막으로, np.fft.ifft 함수를 사용하여 필터링된 주파수 신호를 다시 시간 영역으로 변환합니다. 결과를 그래프로 출력하면 필터링된 신호를 확인할 수 있습니다.

Numpy fft 패키지를 활용하면 주파수 분석 및 신호 필터링과 같은 신호 처리 작업을 효과적으로 수행할 수 있습니다. 추가로 np.fft.fft2, np.fft.ifft2 함수를 사용하면 이미지 처리에서도 다양한 작업을 수행할 수 있습니다. Numpy fft 패키지에 대한 더 자세한 내용은 공식 문서를 참고하시기 바랍니다.