在R中设置50 Hz无相位失真的低通滤波器?

在R中设置50 Hz无相位失真的低通滤波器?,r,lowpass-filter,R,Lowpass Filter,我收集了500 Hz采样频率的眼球跟踪数据。我已经计算了眼球运动的速度,现在我想对速度剖面应用50 Hz低通滤波器(其他研究人员如Jainta、Hoormann和Jaschinski(2007)) 我正在努力在R中设置一个50 Hz的低通滤波器。我试着使用封装信号 据我所知,当使用采样频率为500 Hz的巴特沃斯滤波器时,我必须使用W=0.2来实现50 Hz低通滤波器。以下是正确的吗 bf <- butter(n = 1, w = 0.2, type = "low", plane = "z

我收集了500 Hz采样频率的眼球跟踪数据。我已经计算了眼球运动的速度,现在我想对速度剖面应用50 Hz低通滤波器(其他研究人员如Jainta、Hoormann和Jaschinski(2007))

我正在努力在R中设置一个50 Hz的低通滤波器。我试着使用封装信号

据我所知,当使用采样频率为500 Hz的巴特沃斯滤波器时,我必须使用W=0.2来实现50 Hz低通滤波器。以下是正确的吗

bf <- butter(n = 1, w = 0.2, type = "low", plane = "z") 
y_filtered <- filter(bf, y)

bf如果不是超长信号(比如说数百万个样本),一个简单的FFT滤波器应该可以很好地完成这项工作

首先是一些示例数据

set.seed(1)

sf <- 500   # sampling frequency
ns <- 2000  # number of samples
cf <- 50    # cut-off frequency

f1 <- 43
f2 <- 50
f3 <- 55
f4 <- 81

s1 <- sin(seq(0, pi*2*(ns/sf)*f1, length.out=ns))
s2 <- sin(seq(0, pi*2*(ns/sf)*f2, length.out=ns) + pi/4)
s3 <- sin(seq(0, pi*2*(ns/sf)*f3, length.out=ns) + pi/3)
s4 <- sin(seq(0, pi*2*(ns/sf)*f4, length.out=ns))
n1 <- runif(ns, -0.2, 0.2) + runif(ns, -0.2, 0.2)

xx.o <- ts(s1 + s2, frequency=sf)
xx <- ts((xx.o + s3 + s4 + n1/10)/4, frequency=sf)

xx.o <- (xx.o - mean(xx.o))/2
xx <- xx - mean(xx)

ft <- fft(xx)
lft <- length(ft)
b <- ns/(sf/cf)
ft[-c(1:b, (lft-b):lft)] <- 0

xx.lp <- Re(fft(ft, inv=TRUE))/lft

par(mfrow=c(2, 1), mar=c(3, 3, 0.2, 0.1), mgp=c(2, 0.6, 0), xpd=FALSE)
spectrum(xx, main="", ylim=c(1e-15, 0.1), sub="")
spectrum(xx.lp, main="", ylim=c(1e-15, 0.1), sub="")
par(mfrow=c(3, 1), mar=c(3, 3, 0.2, 0.1), mgp=c(2, 0.6, 0), xpd=FALSE)
plot(xx[1:(sf/2)], type="l", ylim=c(-1, 1))
plot(xx.lp[1:(sf/2)], type="l", ylim=c(-1, 1))
plot(xx.o[1:(sf/2)], type="l", ylim=c(-1, 1))