2013-01-17 8 views
18

filter関数のいくつかの単純な(つまり、数式表記法、長い形式の再現可能なコードの)例を探しています。再帰的オプションを一般化する際に立ち往生しています。私は様々な文書を読んで戦いましたが、助けは私には少し不透明です。私は私のかわいそうな脳幹を傷つけていたときに今だフィルター関数、再帰オプションの簡単な例は具体的には

# basic convolution filter 
filter(1:5,f1,method="convolution") 
[1] 1 2 3 4 5 

#equivalent to: 
x[1] * f1 
x[2] * f1 
x[3] * f1 
x[4] * f1 
x[5] * f1 

# convolution with 2 coefficients in filter 
filter(1:5,c(f1,f2),method="convolution") 
[1] 3 5 7 9 NA 

#equivalent to: 
x[1] * f2 + x[2] * f1 
x[2] * f2 + x[3] * f1 
x[3] * f2 + x[4] * f1 
x[4] * f2 + x[5] * f1 
x[5] * f2 + x[6] * f1 

# convolution with 3 coefficients in filter 
filter(1:5,c(f1,f2,f3),method="convolution") 
[1] NA 6 9 12 NA 

#equivalent to: 
NA * f3 + x[1] * f2 + x[2] * f1 #x[0] = doesn't exist/NA 
x[1] * f3 + x[2] * f2 + x[3] * f1 
x[2] * f3 + x[3] * f2 + x[4] * f1 
x[3] * f3 + x[4] * f2 + x[5] * f1 
x[4] * f3 + x[5] * f2 + x[6] * f1 

# Set some values for filter components 
f1 <- 1; f2 <- 1; f3 <- 1; 

そして、私たちが行く上:

は、ここで私はこれまで考え出した例です。 私はこの記事で情報を使用して、最も基本的な例を把握するために管理:https://stackoverflow.com/a/11552765/496803

filter(1:5, f1, method="recursive") 
[1] 1 3 6 10 15 

#equivalent to: 

x[1] 
x[2] + f1*x[1] 
x[3] + f1*x[2] + f1^2*x[1] 
x[4] + f1*x[3] + f1^2*x[2] + f1^3*x[1] 
x[5] + f1*x[4] + f1^2*x[3] + f1^3*x[2] + f1^4*x[1] 

誰かが私がfilter = c(f1,f2)filter = c(f1,f2,f3)と再帰バージョンのための畳み込み例については上記の持っているものに類似したコードを提供することはできますか?

回答は、関数からの結果と一致する必要があります:@のagstudyのきちんとした答えを使用して完了させるには

filter(1:5, c(f1,f2), method="recursive") 
[1] 1 3 7 14 26 

filter(1:5, c(f1,f2,f3), method="recursive") 
[1] 1 3 7 15 30 

EDIT

> filter(1:5, f1, method="recursive") 
Time Series: 
Start = 1 
End = 5 
Frequency = 1 
[1] 1 3 6 10 15 
> y1 <- x[1]            
> y2 <- x[2] + f1*y1  
> y3 <- x[3] + f1*y2 
> y4 <- x[4] + f1*y3 
> y5 <- x[5] + f1*y4 
> c(y1,y2,y3,y4,y5) 
[1] 1 3 6 10 15 

と...

> filter(1:5, c(f1,f2), method="recursive") 
Time Series: 
Start = 1 
End = 5 
Frequency = 1 
[1] 1 3 7 14 26 
> y1 <- x[1]            
> y2 <- x[2] + f1*y1  
> y3 <- x[3] + f1*y2 + f2*y1 
> y4 <- x[4] + f1*y3 + f2*y2 
> y5 <- x[5] + f1*y4 + f2*y3 
> c(y1,y2,y3,y4,y5) 
[1] 1 3 7 14 26 

D ...

> filter(1:5, c(f1,f2,f3), method="recursive") 
Time Series: 
Start = 1 
End = 5 
Frequency = 1 
[1] 1 3 7 15 30 
> y1 <- x[1]            
> y2 <- x[2] + f1*y1  
> y3 <- x[3] + f1*y2 + f2*y1 
> y4 <- x[4] + f1*y3 + f2*y2 + f3*y1 
> y5 <- x[5] + f1*y4 + f2*y3 + f3*y2 
> c(y1,y2,y3,y4,y5) 
[1] 1 3 7 15 30 
+2

と思うで、IIRのためです。再帰的フィルタは、重みf1、...、fnが自動的にc(1、f1、...、fn)になることを除いて、畳み込みフィルタと同様であり、各ステップ1で現在の値に適用され、 ...、fnは、元の値の代わりに、作成されている新しい修正ベクトルから最後のn個の値に適用されます。畳み込みでは(デフォルトの辺が2の場合)、ウェイトは次のn/2の元の値と前のn/2の元の値で他方の値にまたがります。 –

答えて

14

、私はXIの用語で表現を拡大する必要性を全く考えていません。 "再帰的"のキーは、前のyの点で右手の表現を表現することです。

私はフィルターのサイズに関して考えるのが好きです。

フィルタサイズ= 1

y1 <- x1            
y2 <- x2 + f1*y1  
y3 <- x3 + f1*y2 
y4 <- x4 + f1*y3 
y5 <- x5 + f1*y4 

フィルタサイズ= 2

y1 <- x1            
y2 <- x2 + f1*y1  
y3 <- x3 + f1*y2 + f2*y1 # apply the filter for the past value and add current input 
y4 <- x4 + f1*y3 + f2*y2 
y5 <- x5 + f1*y4 + f2*y3 
+2

+1これはこれまでの最も明白な例です。 –

+0

うまくいっている:「再帰的」なキー(「畳み込み」とは対照的に)は、yの観点からRHSを表現することです。 –

+0

この回答に感謝します。あなたは一見複雑なコンセプトをどれだけシンプルに作ったのか分かりません! – thelatemail

2

は、ここで私は、再帰的なフィルタリングが本当に何をしているか視覚化に最も有用見つけた例です:再帰的で

(x <- rep(1, 10)) 
# [1] 1 1 1 1 1 1 1 1 1 1 

as.vector(filter(x, c(1), method="recursive")) ## Equivalent to cumsum() 
# [1] 1 2 3 4 5 6 7 8 9 10 
as.vector(filter(x, c(0,1), method="recursive")) 
# [1] 1 1 2 2 3 3 4 4 5 5 
as.vector(filter(x, c(0,0,1), method="recursive")) 
# [1] 1 1 1 2 2 2 3 3 3 4 
as.vector(filter(x, c(0,0,0,1), method="recursive")) 
# [1] 1 1 1 1 2 2 2 2 3 3 
as.vector(filter(x, c(0,0,0,0,1), method="recursive")) 
# [1] 1 1 1 1 1 2 2 2 2 2 
2

を、あなたの「フィルタ」のシーケンスは、添加剤でありますシーケンスの前の合計値または出力値に対する係数。 filter=c(1,1)では、「シーケンスxのi番目のコンポーネントを取り出し、前のステップの結果の1倍とその前のステップの結果の1倍」を追加します。ここで私は遅れ効果の表記は次のようになります考えて

を説明するためのカップルの例があります:

## only one filter, so autoregressive cumsum only looks "one sequence behind" 
> filter(1:5, c(2), method='recursive') 
Time Series: 
Start = 1 
End = 5 
Frequency = 1 
[1] 1 4 11 26 57 

1 = 1 
2*1 + 2 = 4 
2*(2*1 + 2) + 3 = 11 
... 

## filter with lag in it, looks two sequences back 
> filter(1:5, c(0, 2), method='recursive') 
Time Series: 
Start = 1 
End = 5 
Frequency = 1 
[1] 1 2 5 8 15 

1= 1 
0*1 + 2 = 2 
2*1 + 0*(0*1 + 2) + 3 = 5 
2*(0*1 + 2) + 0 * (2*1 + 0*(0*1 + 2) + 3) + 4 = 8 
2*(2*1 + 0*(0*1 + 2) + 3) + 0*(2*(0*1 + 2) + 0 * (2*1 + 0*(0*1 + 2) + 3) + 4) + 5 = 15 

は、あなたがそこに累積パターンを参照していますか?別の言い方をする。再帰的な場合には

1 = 1 
0*1 + 2 = 2 
2*1 + 0*2 + 3 = 5 
2*2 + 0*5 + 4 = 8 
2*5 + 0*8 + 5 = 15 
0

私はMatlabの

NOTATIONと比較して、私の要約であり、以下に、これを読んで一時間を過ごしました:Matlabのコマンド= Rのコマンド

filter([1,1,1], 1, data) = filter(data, [1,1,1], method = "convolution") ; but the difference is that the first 2 elements are NA 


filter(1, [1,-1,-1,-1], data) = filter(data, [1,1,1], method = "recursive") 

あなたはDSPからのいくつかを知っている場合は、再帰的には、コンボリューションは、あなたの元のベクトルをステップスルー重みを適用し、各ステップで合計するとFIRのためfilter` `の