誰もがMATLABでフィルターを使用する方法を知っていますか?私は愛好家ではないので、ロールオフ特性などには関係ありません— 100 kHzでサンプリングされた1次元の信号ベクトルxがあり、その上でハイパスフィルタリングを実行します(たとえば、10 Hz以下のものを拒否します) )ベースラインドリフトを削除します。
ヘルプには、バターワース、エリプティカル、およびチェビシェフのフィルターが記載されていますが、実装方法に関する簡単な説明はありません。
使用できるフィルターはいくつかあり、実際のフィルターの選択は、何を達成しようとしているかによって異なります。 Butterworth、Chebyschev、およびEllipticalフィルターについて言及したので、IIRフィルター全般を探していると思います。
ウィキペディアは、さまざまなフィルターとその機能について理解を始めるのに適した場所です。たとえば、 Butterworth は通過帯域で最大限平坦であり、応答は阻止帯域でロールオフします。 Chebyschev では、通過帯域(タイプ2)またはストップバンド(タイプ1)のいずれかで滑らかな応答があり、もう一方では最後に 楕円 =フィルタ、両方の帯域にリップルがあります。次の画像 ウィキペディアから取得 。
したがって、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
)があり、このアプローチが不安定になっていることがわかります。
そして、これは、周波数応答がすべて厄介であるという事実から明らかです。 freqz(b,a)
を使用して以下を取得します
正確な設計要件でより安定したフィルターを取得するには、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.
_
このフィルターの特性を見ると、すべての極が単位円内にあり(したがって安定している)、設計要件に一致していることがわかります。
アプローチはbutter
とellip
についても同様で、同等のbuttord
とellipord
を使用します。 MATLABドキュメントには、フィルターの設計に関する良い例もあります。これらの例に基づいてビルドし、必要に応じてフィルターを設計できます。
データにフィルターを使用するには、最終的に使用するフィルターに応じて、filter(b,a,data)
またはfilter(Hd,data)
を実行します。位相歪みをゼロにする場合は、filtfilt
を使用します。ただし、これはdfilt
オブジェクトを受け入れません。したがって、Hd
でゼロ位相フィルターを使用するには、Mathworksファイル交換サイトで利用可能な filtfilthd
ファイルを使用します
[〜#〜] edit [〜#〜]
これは@DarenWのコメントへの応答です。スムージングとフィルタリングは2つの異なる操作であり、いくつかの点では類似しています(移動平均はローパスフィルターです)特定のアプリケーションの懸念。
たとえば、100kHzでサンプリングされた0-25kHzの線形チャープ信号にDarenの提案を実装します。これは、ガウスフィルターで平滑化した後の周波数スペクトルです。
確かに、10Hzに近いドリフトはほとんどありません。ただし、この操作により、元の信号の周波数成分の性質が完全に変わりました。この不一致は、スムージング操作のロールオフを完全に無視し(赤い線を参照)、フラットゼロであると仮定したために発生します。それが本当なら、引き算はうまくいったでしょう。しかし、残念ながらそうではないため、フィルター設計の分野全体が存在します。
フィルターを作成します。たとえば、[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
関数を調べることもできます。
この種のフィルタリングを行う安価な方法は、設計、零点、極、リップルなどに脳細胞に負担をかけないことです:
* 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ボリュームデータなどに簡単に一般化できます。