Подтвердить что ты не робот

Простые примеры функции фильтра, рекурсивный вариант

Я ищу некоторые простые (т.е. без обозначения математики, длинномерные воспроизводимые коды) примеры для функции filter в R Я думаю, что у меня есть голова вокруг метода свертки, но я зациклился на обобщении рекурсивного варианта. Я читал и сражался с различной документацией, но помощь мне немного непрозрачна.

Вот примеры, которые я догадался до сих пор:

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

И мы идем:

# 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

Теперь, когда я причиняю боль моему маленькому стволу мозга. Мне удалось выяснить самый простой пример, используя информацию на этом посту: qaru.site/info/289957/...

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)?

Ответы должны соответствовать результатам функции:

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

ИЗМЕНИТЬ

Чтобы завершить использование @agstudy аккуратного ответа:

> 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

и...

> 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
4b9b3361

Ответ 1

В рекурсивном случае, я думаю, нет необходимости расширять выражение в терминах 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

Вот пример, который я нашел наиболее полезным для визуализации того, что действительно делает рекурсивная фильтрация:

(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

Ответ 3

С рекурсивной последовательностью ваших "фильтров" является аддитивным коэффициентом для предыдущих сумм или выходных значений последовательности. С помощью filter=c(1,1) вы говорите: "Возьмите i-й компонент в моей последовательности x и добавьте к нему 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

Ответ 4

Я потратил час на чтение этого, ниже мое резюме, по сравнению с 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, то рекурсивный для IIR, свертка для FIR