メインコンテンツまでスキップ

SciPyを使用した信号処理の方法

SciPyを使用して信号処理を行う方法について、ステップバイステップのチュートリアルをご紹介します。

ステップ1:必要なライブラリのインポート

まず、必要なライブラリをインポートする必要があります。この場合、信号処理操作にはscipy.signalを、配列操作にはnumpyを使用します。

import numpy as np
from scipy import signal

ステップ2:信号の作成

次に、作業するための簡単な信号を作成しましょう。このチュートリアルでは、正弦波の信号を生成します。

# 信号のパラメータを定義する
frequency = 10 # 信号の周波数(Hz)
amplitude = 1 # 信号の振幅
sampling_rate = 100 # 1秒あたりのサンプル数
duration = 1 # 信号の持続時間(秒)

# 時間軸を生成する
t = np.linspace(0, duration, int(sampling_rate * duration), endpoint=False)

# 正弦波の信号を生成する
signal_data = amplitude * np.sin(2 * np.pi * frequency * t)

ステップ3:信号のプロット

信号を処理する前に、matplotlibを使用して可視化してみましょう。

import matplotlib.pyplot as plt

plt.plot(t, signal_data)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Signal')
plt.show()

ステップ4:フィルタの適用

次に、scipy.signalライブラリを使用して、信号にローパスフィルタを適用しましょう。ここではButterworthフィルタを例にします。

# フィルタのパラメータを定義する
cutoff_frequency = 5 # カットオフ周波数(Hz)
filter_order = 4 # フィルタ次数

# Butterworthフィルタを作成する
b, a = signal.butter(filter_order, cutoff_frequency / (sampling_rate / 2), 'low')

# フィルタを信号に適用する
filtered_signal = signal.lfilter(b, a, signal_data)

ステップ5:フィルタされた信号のプロット

ローパスフィルタの効果を可視化するため、フィルタされた信号をプロットしましょう。

plt.plot(t, signal_data, label='Original Signal')
plt.plot(t, filtered_signal, label='Filtered Signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Signal with Low-pass Filter')
plt.legend()
plt.show()

ステップ6:フーリエ変換の実行

信号の周波数内容を分析するために、scipy.fftモジュールを使用してフーリエ変換を実行できます。

# フーリエ変換を実行する
signal_spectrum = np.fft.fft(signal_data)

# 周波数軸を生成する
frequencies = np.fft.fftfreq(len(signal_data), 1 / sampling_rate)

# スペクトルをプロットする
plt.plot(frequencies, np.abs(signal_spectrum))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.title('Signal Spectrum')
plt.show()

ステップ7:スペクトログラムの作成

最後に、scipy.signalモジュールを使用して信号のスペクトログラムを生成しましょう。

# スペクトログラムのパラメータを定義する
window_size = 256
overlap = int(window_size * 0.75)

# スペクトログラムを計算する
frequencies, times, spectrogram = signal.spectrogram(signal_data, fs=sampling_rate, window='hann',
nperseg=window_size, noverlap=overlap)

# スペクトログラムをプロットする
plt.pcolormesh(times, frequencies, 10 * np.log10(spectrogram), shading='auto')
plt.colorbar(label='Power Spectral Density (dB/Hz)')
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
plt.title('Spectrogram')
plt.show()

以上です!SciPyを使用して信号処理を成功裏に行いました。特定の信号処理のニーズに応じて、SciPyライブラリが提供するさらなる関数やテクニックを自由に探索してください。