Python を使用してハイパスフィルターを実装する
ハイパスフィルターは、事前定義されたしきい値周波数またはカットオフよりも低い信号の移動を制限するフィルターです。しきい値以上の周波数の信号は、遮るものがない状態でフィルターを通過します。このアクションは、低周波数の信号を減衰させます。ハイパスフィルターは、音などの不要なノイズを除去します。
この記事では、Python を使用してハイパスフィルターを実装する方法を学習します。
Python を使用してハイパスフィルターを実装する
ハイパスフィルターの実装では、4
Python モジュール、つまり、numpy
、pandas
、scipy
、および matplotlib
を使用します。
numpy
モジュールは、大規模な多次元行列や配列を操作するためのユーティリティが豊富な堅牢な Python モジュールです。これらのユーティリティは、行列に対して複雑で単純な数学演算をシームレスに実行するのに役立ちます。これらのユーティリティは最適化されており、入力に対して非常に動的です。
numpy
モジュールの最新バージョンをインストールするには、次の pip
コマンドのいずれかを使用します。
pip install numpy
pip3 install numpy
pandas
モジュールは、Python で記述された強力で柔軟なオープンソースのデータ分析およびデータ操作モジュールです。
pandas
モジュールをインストールするには、次の pip
コマンドのいずれかを使用します。
pip install pandas
pip3 install pandas
scipy
モジュールは、科学技術コンピューティング用のオープンソースの Python モジュールです。
scipy
モジュールをインストールするには、次の pip
コマンドのいずれかを使用します。
pip install scipy
pip3 install scipy
また、matplotlib
モジュールは、データをグラフィカルに視覚化するための包括的で最適化された Python ライブラリです。
matplotlib
モジュールの最新バージョンをインストールするには、次の pip
コマンドのいずれかを使用します。
pip install matplotlib
pip3 install matplotlib
ライブラリについての簡単な紹介が終わったので、ハイパスフィルターの Python コードを見てみましょう。
import numpy as np
import pandas as pd
from scipy import signal
import matplotlib.pyplot as plt
def sine_generator(fs, sinefreq, duration):
T = duration
n = fs * T
w = 2.0 * np.pi * sinefreq
t_sine = np.linspace(0, T, n, endpoint=False)
y_sine = np.sin(w * t_sine)
result = pd.DataFrame({"data": y_sine}, index=t_sine)
return result
def butter_highpass(cutoff, fs, order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = signal.butter(order, normal_cutoff, btype="high", analog=False)
return b, a
def butter_highpass_filter(data, cutoff, fs, order=5):
b, a = butter_highpass(cutoff, fs, order=order)
y = signal.filtfilt(b, a, data)
return y
fps = 30
sine_fq = 10
duration = 10
sine_5Hz = sine_generator(fps, sine_fq, duration)
sine_fq = 1
duration = 10
sine_1Hz = sine_generator(fps, sine_fq, duration)
sine = sine_5Hz + sine_1Hz
filtered_sine = butter_highpass_filter(sine.data, 10, fps)
plt.figure(figsize=(20, 10))
plt.subplot(211)
plt.plot(range(len(sine)), sine)
plt.title("Generated Signal")
plt.subplot(212)
plt.plot(range(len(filtered_sine)), filtered_sine)
plt.title("Filtered Signal")
plt.show()
上記のコードでは、正弦周波数または sine_fq
値はヘルツまたは Hz
であり、持続時間または duration
は秒または sec
である必要があります。生成された信号は元の信号であり、フィルタリングされた信号はハイパスフィルターによって形成された信号です。生成されたグラフは、2つの違いを示しています。