前方および後方フィルタリング

enter image description hereI have an input sequence $x(n)$ and impulse sequence

\begin{equation} h(n) = \begin{cases} 0 & \quad \text{when } n = 0 \\ .239052 & \quad \text{when } n = 1 \\1.3357\exp(-0.650286n) & \quad \text{when } n > 1\\ \end{cases} \end{equation}

私は畳み込みを行い、$ y(n)= x(n)* h(n)$を得た。 $ y(n)$から$ n(n)$を逆にして、$ w(n)= y(n)* h(-n)$を逆フィルタリングしました。 これについて調査したところ、matlabの filtfilt が簡単なオプションだが、これをCで実装しようとしている だから私の質問は、最初の出力シーケンスをトリミングせずに$ y(n)$私は結果の漂流バージョンを取得しています(遅延があります)。

それは本当に必要なトリミングですか、私はここで何か間違っていますか?
もう1つの質問は、私が filtfilt を使ったときに$ w(n)$シーケンスの開始と終了の両方にトランジェントがいくつか見えるということです。トランジェントが見えません。理由は、トランジェントを取り除くために、以下の論文に基づいて状態を調整します。

Gustafsson, F. "Determining the initial states in forward-backward filtering." IEEE® Transactions on Signal Processing. Vol. 44, April 1996, pp. 988–992.

要約する :

  1. トリミングは本当に必要ですか? PS結果のデータをトリミングせずに添付された図は遅れがあります。後方フィルタリングの前に$ y(n)$シーケンスを調整すると結果が整列します。
  2. 過渡状態を解消するための初期状態を判断する方法。
1
SE.DSPはあなたの質問やその答えがあなたから何らかのアクション(編集、更新、票、受諾など)を必要とするかもしれないという思い出させる信号を付けて、幸せな新年2017を願っています。
追加された 著者 Laurent Duval,

2 答え

トリミングは必要ないと私の意見である。

この論文の方法は簡単な考え方に基づいています。信号$ x [n] $を前方と後方にフィルタリングすると、その結果は後方に移動してから前方に移動した結果と等しくなります。

この論文では、異なる手法間の$ {\ ell} _ {2} $ノルムを最小にする初期条件を選択する方法を示しています。

1
追加された

最初の質問については、何が起きているのかを知るのに役立つ非常に基本的な方法を提案したいと思います。 1つの理由は、実装に関する詳細をあまりにも多く提供していないということです。この方法は実際にはフィルタ遅延を容易に推定できない場合にも使用することができる。

あなたの2パスフィルタは対称であり、単峰性(両側の指数関数に似ています)なので、計算遅延(全ウィンドウ、パディング、トリミング、割り当て不良、サブサンプリングなど)をDirac-delta関数の形で入力を与えます。与えられた位置$ k $で最大1、例えばエッジから離れています。それは似ているかもしれない $$ 0 \、0 \、0 \、0 \、1 \、0 \、0 \、0 \、0 $$  次に、それをあなたの双方向にフィルタリングし、出力フィルタリングされた信号の最大値のインデックス$ l $を見つけます。元のものよりも長くなる可能性があります: \ epsilon_3 \、\ epsilon_4 \、\ epsilon_5 \、\ epsilon_6 \、\ epsilon_7 \、\ textrm {max} \、\ epsilon_7 \、\ epsilon_6 \、\ epsilon_5 \、\ epsilon_4 \、\ epsilon_3 \、\ epsilon_2 \、\ epsilon_1 \、$$ その$ l-k $(ここで$(8-5))$は、LTI(線形、時不変式)フィルタを使用しているため、整数量、システム遅延を与えます。次に、この遅延がフィルタ処理のどこから来ているのかを調べ、「実際の信号」をトリミングまたは(循環)シフトする方法を決定できます。

2番目の部分については、フィルタが部分的に指数関数的であるため、私はまず、指数関数フィルタの再帰的な実装を見てみることをお勧めします。フィルター$ h $を$ h = h_1 + h_2 $に分割することができます $$ h_1 = \ {0 \、0.239052 \、0 \、0 \、0 \、\ dots \} $$ 指数関数的な部分は$ h_2 $です。後者は、指数移動平均といった簡単な再帰式で実装できます。それらはあなたに時間を節約することができ、少ない苦痛で国境を扱うことができます。

1
追加された