Numpy入門:信号処理

NumpyはPython数値計算を効率的に行うためのライブラリで、信号処理においてもその強力な機能が活かされます。この記事では、Numpyを使った基本的な信号処理について解説します。

目次

  1. Numpyとは
  2. 基本的な信号処理
    1. 波形生成
    2. フーリエ変換と逆フーリエ変換
  3. 高度な信号処理
    1. 畳み込み
    2. 相関関数

1. Numpyとは

Numpy(Numerical Python)は、Pythonで高性能な科学計算を行うためのパッケージです。多次元配列オブジェクトやこれら配列を操作するツールが提供されています。特に線形代数フーリエ変換、乱数生成といった機能が強力であり、これらを使って信号処理も行えます。


2. 基本的な信号処理

A. 波形生成

まず最初に、サイン波やコサイン波といった基本的な波形の生成方法から始めましょう。

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 1, 500, endpoint=False) # 時間軸
freq = 5 # 周波数 (Hz)

sin_wave = np.sin(2 * np.pi * freq * t) # サイン波
cos_wave = np.cos(2 * np.pi * freq * t) # コサイン波

plt.figure(figsize=(10,4))
plt.plot(t, sin_wave,label="sin wave")
plt.plot(t, cos_wave,label="cos wave")
plt.legend()
plt.show()

B. フーリエ変換と逆フーリエ変換

次に、フーリエ変換FFT)および逆フーリエ変換(IFFT)を見てみましょう。

# フーリエ変換
F = np.fft.fft(sin_wave)

# スペクトルを計算(絶対値)
absF = np.abs(F)

# 周波数軸の作成
freq = np.fft.fftfreq(t.shape[0], d=1/500.0)

plt.figure(figsize=(10,4))
plt.plot(freq, absF)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Amplitude Spectrum')
plt.show()

# 逆フーリエ変換
rec_wave = np.fft.ifft(F).real

plt.figure(figsize=(10,4))
plt.plot(t, rec_wave)
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.show()

3. 高度な信号処理

A. 畳み込み

畳み込みは、信号処理において非常に重要な演算であり、フィルタリングや画像処理などに使われます。

h = np.array([1/3, 1/3, 1/3]) # 平均化フィルタ(移動平均)
conv_result = np.convolve(sin_wave, h, mode='same')

plt.figure(figsize=(10,4))
plt.plot(t,sin_wave,label="original")
plt.plot(t,conv_result,label="convoluted")
plt.legend()

B. 相関関数

相関関数は二つの信号間の類似性を計測するためのツールです。

corr_result=np.correlate(sin_wave,sin_wave,"full")

lag=np.arange(-(len(sin_wave)-1),len(sin_wave))

# plot the result:
fig=plt.figure(figsize=(10,5))
ax=fig.add_subplot(111)
ax.plot(lag,np.abs(corr_result),color="blue",label="auto-correlation")
ax.legend(loc='upper right',fontsize=12)
ax.set_xlabel("Lags",fontsize=12)
ax.set_ylabel("Auto-correlation",fontsize=12)

以上がNumpyを用いた基本的な信号処理方法となります。これらの基本的な操作を組み合わせることで、より高度な信号分析が可能となります。