Python でローパスフィルターを実装する

Vaibhhav Khetarpal 2022年12月21日
Python でローパスフィルターを実装する

ローパスフィルターは、信号処理の基本の 1つであり、より正確な結果を得るために信号をフィルター処理するために頻繁に使用される用語です。

このチュートリアルでは、ローパスフィルターと、それを Python で作成および実装する方法について説明します。

ローパスフィルターは、ユーザーが指定した特定の値を保持するカットオフ周波数よりも低い周波数の信号を通過させるために使用されます。カットオフ周波数を超える周波数のすべての信号がオンになります。

Python で Scipy を使用してローパスバターワースフィルターを作成する

Python では、SciPy ライブラリの関数を利用してローパスフィルターを作成できます。Scientific Python の略語である SciPy は、信号処理、最適化、および統計を実行する関数を提供するために使用されるライブラリです。このライブラリは、その下にある NumPy ライブラリも使用します。

実世界にはいくつかのローパスフィルターが存在します。ただし、Python でバターワースローパスフィルターを作成します。これは、周波数が最大にフラットであり、通過帯域にリップルがないことを意味します。これにより、最も人気があり、使用されているローパスフィルターの 1つになります。

このメソッドを Python で正常に実装するには、最初に NumPySciPy、および 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()

Python ローパスフィルター

Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

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