[解決済み] Scipy.signal.butterを用いたバンドパスバターワースフィルタの実装方法
質問
アップデートをお願いします。
この質問に基づいたScipyのレシピを見つけました! ということで、興味のある方は、そのままアクセスしてみてください。 コンテンツ " 信号処理 " バターワースバンドパス
1次元のnumpy配列(時系列)に対してバターワースバンドパスフィルターを実装するという、最初は簡単そうに見えたことを達成するのに苦労しています。
私が含まなければならないパラメータは、sample_rate、カットオフ周波数IN HERTZ、そしておそらく順序です(減衰、固有周波数などの他のパラメータは、私にとってより不明瞭なので、任意の"default"値で十分です)。
これはハイパスフィルターとして動作するように見えますが、私がそれを正しく行っているかどうか、確かではありません。
def butter_highpass(interval, sampling_rate, cutoff, order=5):
nyq = sampling_rate * 0.5
stopfreq = float(cutoff)
cornerfreq = 0.4 * stopfreq # (?)
ws = cornerfreq/nyq
wp = stopfreq/nyq
# for bandpass:
# wp = [0.2, 0.5], ws = [0.1, 0.6]
N, wn = scipy.signal.buttord(wp, ws, 3, 16) # (?)
# for hardcoded order:
# N = order
b, a = scipy.signal.butter(N, wn, btype='high') # should 'high' be here for bandpass?
sf = scipy.signal.lfilter(b, a, interval)
return sf
<イグ
ドキュメントや例が分かりにくく曖昧なのですが、"for bandpass"と書かれたcommendで紹介されているフォームを実装してみたいと思います。コメント中のクエスチョンマークは、私が何が起こっているのか理解せずに、ただいくつかの例をコピーペーストしたことを示しています。
私は電気工学者でも科学者でもありませんが、EMG 信号にいくつかの簡単なバンドパス フィルタリングを実行する必要がある医療機器設計者です。
どのように解決するのですか?
buttordの使用を省略し、代わりにフィルタの次数を選び、それがあなたのフィルタリングの基準を満たすかどうかを見ることができます。 バンドパスフィルタの係数を生成するには、butter() にフィルタの次数、カットオフ周波数
Wn=[low, high]
(サンプリング周波数の半分であるナイキスト周波数の割合で表されます) とバンドタイプ
btype="band"
.
バターワースバンドパスフィルターを扱うための便利な関数を定義したスクリプトです。 スクリプトとして実行すると、2つのプロットを作成します。1つは、同じサンプリングレートとカットオフ周波数で、いくつかのフィルタの次数での周波数応答を示しています。 もう1つのプロットは、サンプル時系列でのフィルター(次数6)の効果を示しています。
from scipy.signal import butter, lfilter
def butter_bandpass(lowcut, highcut, fs, order=5):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band')
return b, a
def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
y = lfilter(b, a, data)
return y
if __name__ == "__main__":
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz
# Sample rate and desired cutoff frequencies (in Hz).
fs = 5000.0
lowcut = 500.0
highcut = 1250.0
# Plot the frequency response for a few different orders.
plt.figure(1)
plt.clf()
for order in [3, 6, 9]:
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
w, h = freqz(b, a, worN=2000)
plt.plot((fs * 0.5 / np.pi) * w, abs(h), label="order = %d" % order)
plt.plot([0, 0.5 * fs], [np.sqrt(0.5), np.sqrt(0.5)],
'--', label='sqrt(0.5)')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Gain')
plt.grid(True)
plt.legend(loc='best')
# Filter a noisy signal.
T = 0.05
nsamples = T * fs
t = np.linspace(0, T, nsamples, endpoint=False)
a = 0.02
f0 = 600.0
x = 0.1 * np.sin(2 * np.pi * 1.2 * np.sqrt(t))
x += 0.01 * np.cos(2 * np.pi * 312 * t + 0.1)
x += a * np.cos(2 * np.pi * f0 * t + .11)
x += 0.03 * np.cos(2 * np.pi * 2000 * t)
plt.figure(2)
plt.clf()
plt.plot(t, x, label='Noisy signal')
y = butter_bandpass_filter(x, lowcut, highcut, fs, order=6)
plt.plot(t, y, label='Filtered signal (%g Hz)' % f0)
plt.xlabel('time (seconds)')
plt.hlines([-a, a], 0, T, linestyles='--')
plt.grid(True)
plt.axis('tight')
plt.legend(loc='upper left')
plt.show()
このスクリプトによって生成されるプロットは以下の通りです。
関連
-
[解決済み] 変数を参照渡しする方法を教えてください。
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] コンマを桁区切りとして数字を印刷するには?
-
[解決済み] argparseでコマンドラインの引数としてリストを渡すにはどうしたらいいですか?
-
[解決済み】PandasでSettingWithCopyWarningに対処する方法
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] pipの依存性/必要条件をリストアップする方法はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] バブルソートの宿題
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?