元の信号からローパスフィルター処理された信号を差し引き、その結果を「ハイパス」として使用することは正しいですか?


8

python / scipy / numpyでバンドパスまたはハイパスフィルターを実装するためのドキュメントを見つけるのに苦労しています。

ただし、ローパスフィルターを簡単に作成して適用できるので、次のように質問します。

信号をローパスフィルター処理し、元の信号から結果を差し引くことで、高周波のみを取得することは概念的に正しいでしょうか?

また、Pythonの単純なバンドパスフィルターの単純な例(できればnumpyおよびscipyライブラリーを使用している人)がいるなら、私は非常に感謝します。

私が探しているのは次のようなものです:

filtered_signal = band_pass(original_signal, rate, low=20, high=500)

助けてくれてありがとう!

編集:scipyでは、これをローパスとして使用していますが、良い結果が得られます。

import numpy, scipy.signal

def firfilt(interval, freq, sampling_rate):
    nfreq = freq/(0.5*sampling_rate)
    taps =  sampling_rate + 1
    a = 1
    b = scipy.signal.firwin(taps, cutoff=nfreq)
    firstpass = scipy.signal.lfilter(b, a, interval)
    ## second pass to compensate phase delay
    secondpass = scipy.signal.lfilter(b, a, firstpass[::-1])[::-1]
    return secondpass

のドキュメントscipy.signal.firwinは、ローパス、ハイパス、バンドパス、バンドストップ、およびマルチバンドフィルターの作成方法が記載されています。やってみましたfirwin(taps, cutoff=nfreq, pass_zero=False)か?
内部石

参照してくださいsound.whsites.net/articles/derived-xovers.htmスピーカーにこの技術の使用のために
endolith

回答:


7

理論的にはこれを行うことができますが、実際には時間と位相のアライメントがうまく機能するため、実行は困難です。調整が適切な場合、求めている破壊的な干渉が発生します。そうでない場合は、建設的な干渉が発生します。さらに悪いことに、それらが破壊的または建設的に干渉しているかどうかは、周波数に依存します。つまり、建設的干渉と破壊的干渉の両方を同時に得ることができます。ただし、かなり低い周波数のみをフィルターで除去する場合は、タイミングの要件が最も緩やかに変化するため、最も緩やかであるため、機能します。

簡単な話-実行は可能ですが、ハイパスフィルターを実行するだけで十分なほど難しいためです。

バンドパスフィルターを作成する比較的簡単な方法は、ローパスフィルターを作成し、それを目的の中心周波数に正弦波で乗算して変調することです。


位相シフトを補正するために、フィルターを2回通過させる傾向があります。
heltonbiker

@heltonbikerそして、あなたがそのように行うことができるはず、あなたはタイミングが右に並んで取得してくださいローパスフィルタのゲインが1であることを確認提供
ジム・クレイ

4

scipy.signal関数を使用して、さまざまなフィルタータイプを直接設計できます。scipy.signalパッケージで有限インパルス応答フィルターを作成するための3つの主要な関数があります。

  1. signal.remez
  2. signal.firwin
  3. signal.firwin2

レメズの関数は、引数として、タップ数(次数+ 1)、「バンド」、および「所望の」ゲインをとります。「バンド」の単位はHzです。この機能は、「Hz」パラメータがサンプルレートをHzで定義することは少し奇妙です。例は次のとおりです。

from scipy import signal
b = signal.remez(64, [0, 80, 100, 200, 220, 500], [0, 1, 0], Hz=1000)
plot(20*log10(abs(fft.fft(b, 4096).)))

周波数応答

注:少し浮気し、高次のFFTを使用して、プロットを少し見栄えよくしました(視覚化のために点を補間しただけです)。

ローパスとハイパスの例:

bl = signal.remez(64, [0, 248, 252, 500], [1, 0], Hz=1000) #lowpass
bh = signal.remez(64, [0, 248, 252, 500], [0, 1], Hz=1000) #highpass

firwin機能は再びタップ数と引数としてカットオフを取ります。カットオフは、バンドパスフィルターとストップバンドフィルターを定義するリストとして複数の値にすることができます。カットオフのデフォルトの単位は、ナイキストカットオフが1でサンプルレートが2の正規化された周波数です。これは、/ nyq /を設定することで変更できます。上記の例を使用すると、firwinは次のように呼び出されます。

b = signal.firwin(64, [100, 200], pass_zero=False, nyq=500)

firwin2はレメズのfuncionに近いです。ただし、バンドのゲインを渡す代わりに、カットオフでゲインを渡します。

b = signal.firwin2(64, [0, 100, 200, 500], [0, 1, 1, 0], nyq=500)

ここで利用可能な他の例


firwin、およびそのラッパーbutterは私が現在使用しているものです。ありがとう!
heltonbiker 2012

2
バターはファーウィンのラッパーではありません。バターはIIRフィルター設計法です。iirdesign関数は、汎用のIIRフィルター設計ツールです。バター、チェビーなどはMatlab'ishの機能です。IIRフィルター関数の詳細については、bit.ly / JPS4Zs
Christopher Felton

何をしていたのか誤解していたと思います。ぜひチェックしてみてください(間違いなくFIRフィルターが必要なので)。
heltonbiker 2012

3

適切なハイパスフィルターの設計方法を理解するのに苦労しているとのことですが、1つの方法は、最初にローパスフィルターのプロトタイプを設計し、次にフィルターの応答を別のタイプのフィルター(ハイパスフィルターやバンドパスフィルターなど)に変換する変換を適用することです。これは、式をプロトタイプローパスフィルターの伝達関数に代入することで行われます。このトピックに関する情報へのリンクは次のとおりです。z1

具体的には、ローパスからハイパスへの変換では、次の置換を適用できます。

z1=α+z11+αz1,
α=cos(12(ωcωc))cos(12(ωc+ωc))

ωcωc


ご清聴ありがとうございましたが、あなたが投稿した過度に技術的/数学的な情報を消化するのに十分な経歴がないことを認めざるを得ません。私は生物科学分野の出身であり、より簡単な答えを期待していました。ハイパスを作成する労力が比較的少ない場合、いくつかの小さな作業コードを投稿したり、例にリンクしたりすることは可能ですか?
heltonbiker 2012

どのタイプのフィルターを使用していますか?SciPyライブラリ関数を使用して設計しましたか?
Jason R

私が使用しているローパスで質問を編集します
heltonbiker

1
質問については、上記のendolithのコメントをご覧ください。彼が指摘したように、フィルターを作成するために使用している関数は、ハイパスフィルターも設計できるようです。
Jason R
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.