web-dev-qa-db-ja.com

MATLABでのハイパスフィルタリング

誰もがMATLABでフィルターを使用する方法を知っていますか?私は愛好家ではないので、ロールオフ特性などには関係ありません— 100 kHzでサンプリングされた1次元の信号ベクトルxがあり、その上でハイパスフィルタリングを実行します(たとえば、10 Hz以下のものを拒否します) )ベースラインドリフトを削除します。

ヘルプには、バターワース、エリプティカル、およびチェビシェフのフィルターが記載されていますが、実装方法に関する簡単な説明はありません。

25
user391339

使用できるフィルターはいくつかあり、実際のフィルターの選択は、何を達成しようとしているかによって異なります。 Butterworth、Chebyschev、およびEllipticalフィルターについて言及したので、IIRフィルター全般を探していると思います。

ウィキペディアは、さまざまなフィルターとその機能について理解を始めるのに適した場所です。たとえば、 Butterworth は通過帯域で最大限平坦であり、応答は阻止帯域でロールオフします。 Chebyschev では、通過帯域(タイプ2)またはストップバンド(タイプ1)のいずれかで滑らかな応答があり、もう一方では最後に 楕円 =フィルタ、両方の帯域にリップルがあります。次の画像 ウィキペディアから取得

enter image description here

したがって、3つの場合すべてで、何かを何かと交換する必要があります。バターワースでは、リップルは発生しませんが、周波数応答のロールオフは遅くなります。上記の図では、_0.4_から約_0.55_になり、半分の電力になります。チェビシェフでは、ロールオフが急になりますが、いずれかのバンドで不規則で大きな波紋を許容する必要があり、楕円では、ほぼ瞬時にカットオフになりますが、両方のバンドで波紋があります。

フィルタの選択は、アプリケーションに完全に依存します。損失がほとんどないかまったくないクリーンな信号を取得しようとしていますか?次に、通過帯域(Butterworth/Cheby2)でスムーズな応答が得られるものが必要です。遮断帯域の周波数を消そうとしていますが、通過帯域の応答がわずかに低下してもかまいませんか?次に、ストップバンド(Cheby1)で滑らかなものが必要になります。非常に鋭いカットオフコーナーが必要ですか?つまり、通過帯域を少し超えたものは分析に有害ですか?その場合、楕円フィルターを使用する必要があります。

IIRフィルターについて覚えておくべきことは、ポールがあることです。フィルター遅延のみである分岐を使用してフィルターの次数を増やすことができるFIRフィルターとは異なり、IIRフィルターの次数を増やすとフィルターが不安定になります。不安定であるということは、単位円の外側に極があることを意味します。これがなぜそうなのかを見るために、あなたは IIR filters のwiki記事、特に安定性に関する部分を読むことができます。

私のポイントをさらに説明するために、次のバンドパスフィルターを検討します。

_fpass=[0.05 0.2];%# passband
fstop=[0.045 0.205]; %# frequency where it rolls off to half power
Rpass=1;%# max permissible ripples in stopband (dB)
Astop=40;%# min 40dB attenuation
n=cheb2ord(fpass,fstop,Rpass,Astop);%# calculate minimum filter order to achieve these design requirements

[b,a]=cheby2(n,Astop,fstop);
_

zplane(b,a)を使用して零点-極図を見ると、単位円の外側にいくつかの極(x)があり、このアプローチが不安定になっていることがわかります。

enter image description here

そして、これは、周波数応答がすべて厄介であるという事実から明らかです。 freqz(b,a)を使用して以下を取得します

enter image description here

正確な設計要件でより安定したフィルターを取得するには、MATLABで_z-p-k_の代わりに_b-a_メソッドを使用する2次フィルターを使用する必要があります。上記と同じフィルターを使用する方法は次のとおりです。

_[z,p,k]=cheby2(n,Astop,fstop);
[s,g]=zp2sos(z,p,k);%# create second order sections
Hd=dfilt.df2sos(s,g);%# create a dfilt object.
_

このフィルターの特性を見ると、すべての極が単位円内にあり(したがって安定している)、設計要件に一致していることがわかります。

enter image description here

enter image description here

アプローチはbutterellipについても同様で、同等のbuttordellipordを使用します。 MATLABドキュメントには、フィルターの設計に関する良い例もあります。これらの例に基づいてビルドし、必要に応じてフィルターを設計できます。

データにフィルターを使用するには、最終的に使用するフィルターに応じて、filter(b,a,data)またはfilter(Hd,data)を実行します。位相歪みをゼロにする場合は、filtfiltを使用します。ただし、これはdfiltオブジェクトを受け入れません。したがって、Hdでゼロ位相フィルターを使用するには、Mathworksファイル交換サイトで利用可能な filtfilthd ファイルを使用します

[〜#〜] edit [〜#〜]

これは@DarenWのコメントへの応答です。スムージングとフィルタリングは2つの異なる操作であり、いくつかの点では類似しています(移動平均はローパスフィルターです)特定のアプリケーションの懸念。

たとえば、100kHzでサンプリングされた0-25kHzの線形チャープ信号にDarenの提案を実装します。これは、ガウスフィルターで平滑化した後の周波数スペクトルです。

enter image description here

確かに、10Hzに近いドリフトはほとんどありません。ただし、この操作により、元の信号の周波数成分の性質が完全に変わりました。この不一致は、スムージング操作のロールオフを完全に無視し(赤い線を参照)、フラットゼロであると仮定したために発生します。それが本当なら、引き算はうまくいったでしょう。しかし、残念ながらそうではないため、フィルター設計の分野全体が存在します。

48
abcd

フィルターを作成します。たとえば、[B,A] = butter(N,Wn,'high')を使用します。Nはフィルターの次数です。これが不明な場合は、10に設定してください。Wnは、0〜1で正規化されたカットオフ周波数です。信号のサンプルレートの半分に相当します。サンプルレートがfsで、10 Hzのカットオフ周波数が必要な場合は、Wn = (10/(fs/2))を設定する必要があります。

その後、Y = filter(B,A,X)を使用してフィルターを適用できます(Xは信号です)。 filtfilt関数を調べることもできます。

7
Andreass

この種のフィルタリングを行う安価な方法は、設計、零点、極、リップルなどに脳細胞に負担をかけないことです:

* Make a copy of the signal
* Smooth it.   For a 100KHz signal and wanting to eliminate about 10Hz on down, you'll need to smooth over about 10,000 points.   Use a Gaussian smoother, or a box smoother maybe 1/2 that width twice, or whatever is handy.  (A simple box smoother of total width 10,000 used once may produce unwanted Edge effects)
* Subtract the smoothed version from the original.  Baseline drift will be gone.

元の信号がスパイク状の場合、大きなスムーザーの前に短いメディアンフィルターを使用することができます。

これは、2D画像、3Dボリュームデータなどに簡単に一般化できます。

0
DarenW