matlab では、filtfilt 関数を使用してデータを除外できます。これにより、ゼロ位相になる前方および後方フィルタリング手法が実装されます。ただし、このフィルタは後方フィルタリングを伴うため、リアルタイムで実装するのは困難です。
ゼロ位相の 1 次ハイパスまたはローパス フィルターをリアルタイムで実装したいと考えています。どうすればこれを達成できますか?
私は何日もウェブを検索しましたが、それを始めるための手がかりを得ることができません!
前もって感謝します!
matlab では、filtfilt 関数を使用してデータを除外できます。これにより、ゼロ位相になる前方および後方フィルタリング手法が実装されます。ただし、このフィルタは後方フィルタリングを伴うため、リアルタイムで実装するのは困難です。
ゼロ位相の 1 次ハイパスまたはローパス フィルターをリアルタイムで実装したいと考えています。どうすればこれを達成できますか?
私は何日もウェブを検索しましたが、それを始めるための手がかりを得ることができません!
前もって感謝します!
ゼロ位相フィルターにはゼロを中心に対称なフィルター係数が必要なため、ゼロ位相フィルターをリアルタイムで実行することはできません。これは、フィルターが非因果的であるか、現在の出力が将来の入力に依存することを意味します。もちろん、これはリアルタイムの場合には不可能であり、filtfilt
後処理中の場合のように偽造することができます。
おそらくあなたが探しているのは線形位相フィルターです。名前があなたを混乱させないでください。これは、フィルターが位相歪みを生成することを意味するものではありません。これは、タイムシフトが出力に適用されることを意味するだけです。周波数に関して線形の位相シフトは、時間に関して一定のシフトをもたらします。したがって、基本的に、出力は入力から一定数のサンプル(群遅延)だけ遅延します。
したがって、ゼロ位相フィルターと線形位相フィルターの唯一の違いは、線形位相フィルターの出力がゼロ位相出力の遅延バージョンであるということです。この遅延は、出力を入力に合わせて調整する必要がある場合に、群遅延を追跡することで説明できます。
コメントへの回答:
FIRフィルターは、係数が中心に対して対称である場合、線形位相であることが保証されます。MATLABは、 fir1やfirpmなどの関数を使用してこれらのタイプのフィルターを簡単に作成できます。これらの関数のドキュメントの例は、それらの使用方法を示しているはずです。
線形位相FIRフィルターの群遅延は次のとおりです(L-1)/2
。ここL
で、はフィルターの長さです。これと他のいくつかの理由から、私は通常、奇数のフィルター長を選択して、遅延がサンプル間ではなくサンプルに合わせられるようにします。これは基本的に、出力信号が入力から(L-1)/2
サンプルによって遅延されることを意味します。
実際のフィルタリングプロセスの実装は、基本的に、入力とフィルターの離散畳み込みです。これには、フィルター係数を逆にし、それらに最新のL
入力サンプルを乗算し、それらの結果を加算して単一の出力サンプルを生成することが含まれます。次に、新しい入力サンプルが取り込まれ、プロセス全体が再度実行されて、別のサンプルが生成されます(スライディングウィンドウでの多重化と合計)。Web上で畳み込みのサンプルコードを見つけることができるはずです。
これはFIRフィルタリングを実行する直接的な方法ですが、フィルターが長い場合は、FFTを使用して高速畳み込みを実行する方が効率的です。これを正しく行うのははるかに難しいので、高いサンプルレートと長いフィルターについて話しているのでない限り、私は直接的なアプローチを採用します。
「因果関係のない」ゼロ位相フィルターに十分な量の追加遅延を加えたものは、因果関係のある線形位相 FIR フィルターで近似できます。これは、いくらかの遅延を追加することがシステム要件に適合することを前提としています。
あなたの場合、前方+後方非対称(または非線形位相)フィルタリングプロセスのインパルス応答を取得し、そのインパルス応答をウィンドウ化して応答の長さを有限にし、有限長のカーネルを遅延させて、必要としないようにすることができます「将来の」サンプルを取得し、それを FIR フィルター カーネルとして使用します。結果をチェックして、選択したウィンドウの長さと形状が適切かどうかを確認する必要があります。遅延に必要な有限の長さのウィンドウ処理により、フィルターの品質と遅延の選択にはトレードオフが生じる場合があります。