【问题标题】:R's signal package's filter not matching with Matlab's filter functionR的信号包的过滤器与Matlab的过滤器功能不匹配
【发布时间】:2014-03-18 02:52:25
【问题描述】:

在 Matlab 中,有一维 filter 函数 http://www.mathworks.com/help/matlab/ref/filter.html

在 R 的 signal 包中,其 filter 函数的描述为:Generic filtering function. The default is to filter with an ARMA filter of given coefficients. The default filtering operation follows Matlab/Octave conventions.

但是,如果我给出相同的说明,答案就会不匹配。

在 MATLAB 中(正确答案):

x=[4 3 5 2 7 3]
filter(2/3,[1 -1/3],x,x(1)*1/3)
ans =
4.0000    3.3333    4.4444    2.8148    5.6049    3.8683

在 R 中,如果我遵循 Matlab/Octave 的约定(错误答案):

library(signal)
x<-c(4,3,5,2,7,3)
filter(2/3,c(1,-1/3),x,x[1]*1/3)

Time Series:
Start = 1
End = 6
Frequency = 1
[1] 3.111111 3.037037 4.345679 2.781893 5.593964 3.864655

我也尝试了很多其他示例。 R 的 signal 包的 filter 函数似乎没有遵循 Matlab/Octave 约定,即使文档说明了这一点。也许,我在 R 中错误地使用了 filter 函数。有人可以帮助我吗?

【问题讨论】:

  • 您最好的选择可能是向包维护者发送电子邮件。在大多数情况下,维护者会在 CRAN 包页面或参考手册中列出他们的电子邮件地址。

标签: r matlab


【解决方案1】:

我相信答案在文档中(震惊!!!!)

matlab:

过滤器是“直接形式 II 转置” 标准差分方程的实现:

a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
                      - a(2)*y(n-1) - ... - a(na+1)*y(n-na)

如果 a(1) 不等于 1,filter 通过 a(1) 对滤波器系数进行归一化。

[强调我的]

R:

a[1]*y[n] + a[2]*y[n-1] + … + a[n]*y[1] = b[1]*x[n] + b[2]*x[m-1] + … + b[m]*x[1]   

【讨论】:

  • 不确定我是否理解你的答案,对我来说两者看起来像同一个等式,na=n-1nb=m-1
  • @uday 但我认为 R 不会被 a[1] 标准化。如果我浏览得太快,我很高兴得到纠正。
  • 我相信这意味着aa(1) != 1的情况下通过计算a/a(1)被归一化。但是,这里我们确实有a(1) == 1
【解决方案2】:

感谢您在几年前提出这个问题......我也遇到了它,并认为我得到了答案。本质上,我认为 R 和 Matlab 的优化算法是不同的。

如果没有提供猜测(即,将初始值设置为默认值,R 和 Matlab 都为零),结果非常相似。

R

库(信号)

x

过滤器(2/3,cbind(1,-1/3),x, 0.00)

2.666667 2.888889 4.296296 2.765432 5.588477 3.862826

Matlab

x=[4 3 5 2 7 3]

过滤器(2/3,[1 -1/3],x,0.00)

2.6667 2.8889 4.2963 2.7654 5.5885 3.8628

现在,如果我们开始调整参数的初始猜测,那么结果就会出现分歧。

R

库(信号)

x

过滤器(2/3,cbind(1,-1/3),x, 0.05)

2.683333 2.894444 4.298148 2.766049 5.588683 3.862894

Matlab

x=[4 3 5 2 7 3]

过滤器(2/3,[1 -1/3],x,0.05)

2.7167 2.9056 4.3019 2.7673 5.5891 3.8630

希望对你有帮助!

【讨论】:

  • 谢谢,但从那以后我转向了 python 和 C# 作为首选语言,主要分别是为了速度和更快的速度。我希望其他使用 R 和 Matlab 的人能从中受益。
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 2014-11-25
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
相关资源
最近更新 更多