Python でローパスフィルターを実装する
ローパスフィルターは、信号処理の基本の 1つであり、より正確な結果を得るために信号をフィルター処理するために頻繁に使用される用語です。
このチュートリアルでは、ローパスフィルターと、それを Python で作成および実装する方法について説明します。
ローパスフィルターは、ユーザーが指定した特定の値を保持するカットオフ周波数よりも低い周波数の信号を通過させるために使用されます。カットオフ周波数を超える周波数のすべての信号がオンになります。
Python で Scipy
を使用してローパスバターワースフィルターを作成する
Python では、SciPy
ライブラリの関数を利用してローパスフィルターを作成できます。Scientific Python の略語である SciPy
は、信号処理、最適化、および統計を実行する関数を提供するために使用されるライブラリです。このライブラリは、その下にある NumPy
ライブラリも使用します。
実世界にはいくつかのローパスフィルターが存在します。ただし、Python でバターワースローパスフィルターを作成します。これは、周波数が最大にフラットであり、通過帯域にリップルがないことを意味します。これにより、最も人気があり、使用されているローパスフィルターの 1つになります。
このメソッドを Python で正常に実装するには、最初に NumPy
、SciPy
、および Matplotlib
モジュールを Python コードにインポートする必要があります。
次のコードは、SciPy
モジュールを使用して、Python でローパスバターワースフィルターを作成します。
import numpy as np
from scipy.signal import butter, lfilter, freqz
import matplotlib.pyplot as plt
def butter_lowpass(cutoff, fs, order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = butter(order, normal_cutoff, btype="low", analog=False)
return b, a
def butter_lowpass_filter(data, cutoff, fs, order=5):
b, a = butter_lowpass(cutoff, fs, order=order)
y = lfilter(b, a, data)
return y
# Setting standard filter requirements.
order = 6
fs = 30.0
cutoff = 3.667
b, a = butter_lowpass(cutoff, fs, order)
# Plotting the frequency response.
w, h = freqz(b, a, worN=8000)
plt.subplot(2, 1, 1)
plt.plot(0.5 * fs * w / np.pi, np.abs(h), "b")
plt.plot(cutoff, 0.5 * np.sqrt(2), "ko")
plt.axvline(cutoff, color="k")
plt.xlim(0, 0.5 * fs)
plt.title("Lowpass Filter Frequency Response")
plt.xlabel("Frequency [Hz]")
plt.grid()
# Creating the data for filteration
T = 5.0 # value taken in seconds
n = int(T * fs) # indicates total samples
t = np.linspace(0, T, n, endpoint=False)
data = (
np.sin(1.2 * 2 * np.pi * t)
+ 1.5 * np.cos(9 * 2 * np.pi * t)
+ 0.5 * np.sin(12.0 * 2 * np.pi * t)
)
# Filtering and plotting
y = butter_lowpass_filter(data, cutoff, fs, order)
plt.subplot(2, 1, 2)
plt.plot(t, data, "b-", label="data")
plt.plot(t, y, "g-", linewidth=2, label="filtered data")
plt.xlabel("Time [sec]")
plt.grid()
plt.legend()
plt.subplots_adjust(hspace=0.35)
plt.show()
Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.
LinkedIn