[파이썬] scipy 푸리에 변환 응용

푸리에 변환은 시간 도메인의 신호를 주파수 도메인으로 변환하는 데 사용되는 강력한 도구입니다. scipy 라이브러리는 푸리에 변환과 관련된 다양한 기능을 제공합니다. 이 블로그 포스트에서는 scipy를 사용하여 푸리에 변환을 응용하는 몇 가지 예를 살펴보겠습니다.

1. 신호 스펙트럼 계산

푸리에 변환을 사용하면 신호의 주파수 컴포넌트를 얻을 수 있습니다. 주파수 스펙트럼은 주파수 대역별로 신호의 세기를 나타내는 것으로, 음악, 음성, 센서 데이터 등 다양한 신호를 분석할 때 유용합니다.

import numpy as np
from scipy.fft import fft, fftfreq
import matplotlib.pyplot as plt

# 샘플링 주기
T = 1.0 / 800.0
# 시간 범위
t = np.arange(0.0, 1.0, T)
# 신호 생성
x = np.sin(50.0 * 2.0*np.pi*t) + 0.5*np.sin(80.0 * 2.0*np.pi*t)
# 푸리에 변환
xf = fft(x)
# 주파수 축 생성
freqs = fftfreq(len(x), T)
# 스펙트럼 계산
spectrum = np.abs(xf)

plt.plot(freqs, spectrum)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.show()

위의 코드는 800Hz의 샘플링 주기로 생성된 신호를 푸리에 변환하여 주파수 스펙트럼을 계산하고 그래프로 표현하는 예입니다.

2. 필터링

푸리에 변환은 신호를 주파수 도메인으로 변환하기 때문에, 필터링 작업에도 유용하게 사용될 수 있습니다. 특정 주파수 대역의 신호를 제거하거나, 특정 주파수 대역의 신호를 강화하는 등의 작업을 할 수 있습니다.

from scipy.fft import fft, ifft
import numpy as np
import matplotlib.pyplot as plt

# 샘플링 주기
T = 0.01
# 시간 범위
t = np.arange(0, 10, T)
# 신호 생성
x = np.sin(2 * np.pi * 5 * t) + np.sin(2 * np.pi * 20 * t)
# 푸리에 변환
xf = fft(x)
# 주파수 축 생성
freqs = np.linspace(0.0, 1.0 / (2.0 * T), len(t) // 2)
# 스펙트럼 계산
spectrum = np.abs(xf[:len(t) // 2])

# 5Hz 이하 및 15-25Hz 필터링
xf_filtered = xf.copy()
xf_filtered[(freqs < 5) | (freqs > 25)] = 0

# 필터링된 신호로 역 푸리에 변환
x_filtered = ifft(xf_filtered)

plt.figure(figsize=(10, 6))
plt.subplot(211)
plt.plot(t, x)
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.title('Original Signal')

plt.subplot(212)
plt.plot(t, x_filtered)
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.title('Filtered Signal')

plt.tight_layout()
plt.show()

위의 코드는 5Hz 이하 및 15-25Hz 주파수 대역을 필터링하여 주파수 별 세기를 0으로 설정한 후, 다시 역 푸리에 변환하여 필터링된 신호를 얻는 예입니다.

결론

scipy의 푸리에 변환 기능은 다양한 응용 분야에서 유용하게 사용될 수 있습니다. 이 블로그 포스트에서는 주파수 스펙트럼 계산과 신호 필터링 두 가지 예를 소개했지만, 푸리에 변환은 이 외에도 많은 용도로 사용될 수 있습니다. scipy 라이브러리의 다양한 함수와 기능을 활용하여 신호 처리 및 분석 작업을 보다 편리하게 수행할 수 있습니다.