[파이썬][Numpy] 신호 처리 예제

신호 처리는 신호(예: 오디오, 이미지, 센서 데이터)를 분석하거나 변환하는 작업을 포함하는 핵심 분야입니다. 파이썬에서는 다양한 라이브러리를 사용하여 신호 처리 작업을 수행할 수 있습니다. 아래는 파이썬을 사용한 간단한 오디오 신호 처리 예제입니다. 이 예제에서는 오디오 파일을 로드하고 신호 처리 기법을 적용하여 푸리에 변환과 필터링을 수행합니다.

import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as signal
import scipy.io.wavfile as wavfile

# 오디오 파일 로드
sample_rate, audio_data = wavfile.read('audio_example.wav')  # 오디오 파일 경로

# 오디오 데이터 정보 출력
print(f'Sample Rate: {sample_rate}')
print(f'Audio Data Type: {audio_data.dtype}')
print(f'Audio Data Shape: {audio_data.shape}')

# 시간 영역에서의 오디오 신호 시각화
plt.figure(figsize=(10, 4))
plt.plot(np.arange(len(audio_data)) / sample_rate, audio_data)
plt.title('오디오 신호 (시간 영역)')
plt.xlabel('시간 (초)')
plt.ylabel('오디오 신호 값')
plt.grid(True)
plt.show()

# 푸리에 변환을 사용한 주파수 영역에서의 오디오 신호 시각화
frequencies, amplitudes = signal.periodogram(audio_data, fs=sample_rate)
plt.figure(figsize=(10, 4))
plt.semilogy(frequencies, amplitudes)
plt.title('오디오 신호 (주파수 영역)')
plt.xlabel('주파수 (Hz)')
plt.ylabel('주파수 영역에서의 에너지')
plt.grid(True)
plt.show()

# 고주파 필터링 예제
cutoff_frequency = 4000  # 고주파 컷오프 주파수 (Hz)
nyquist_frequency = 0.5 * sample_rate
normal_cutoff = cutoff_frequency / nyquist_frequency
b, a = signal.butter(4, normal_cutoff, btype='low', analog=False)
filtered_audio = signal.lfilter(b, a, audio_data)

# 필터링된 오디오 신호 시각화
plt.figure(figsize=(10, 4))
plt.plot(np.arange(len(filtered_audio)) / sample_rate, filtered_audio)
plt.title('필터링된 오디오 신호 (시간 영역)')
plt.xlabel('시간 (초)')
plt.ylabel('오디오 신호 값')
plt.grid(True)
plt.show()

# 필터링된 오디오 데이터 저장
wavfile.write('filtered_audio.wav', sample_rate, filtered_audio)  # 저장 경로

이 코드는 주파수 도메인에서 오디오 신호를 분석하고, 고주파 필터링을 통해 오디오를 처리하는 간단한 예제입니다. 다양한 신호 처리 기술을 사용하여 신호를 분석하고 변환하는 방법을 파악할 수 있습니다.