使用FFT的带通滤波器R [英] Bandpassfilter R using fft

查看:15
本文介绍了使用FFT的带通滤波器R的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个时间序列z,采样频率fs = 12(月度数据),我想在10个月和15个月使用fft执行带通滤波。我会这样做:

y <- as.data.frame(fft(z))
y$freq <- ..
y$y <-  ifelse(y$freq>= 1/10 & y$freq<= 1/15,y$y,0)
zz <- fft(y$y, inverse = TRUE)/length(z)
plot zz in the time domain...

然而,我不知道如何推导FFT的频率,也不知道如何在时间域中绘制ZZ。有人能帮帮我吗?

推荐答案

我有一个函数,它概括了fft()

    function(y, samp.freq, ...){
      N <- length(y)
      fk <- fft(y)
      fk <- fk[2:length(fk)/2+1]
      fk <- 2*fk[seq(1, length(fk), by = 2)]/N
      freq <- (1:(length(fk)))* samp.freq/(2*length(fk))
      return(data.frame(fur = fk, freq = freq))
    }

y是您的信号值,samp.freq是它的采样频率。它的输出是data.frame两列--fur是我们经过快速傅立叶变换后得到的复数(Mod(fur)是一个幅度,Arg(fur)是一个相位),freq是对应频率的矢量。

但对于频率滤波,我强烈建议使用信号包。

例如使用巴特沃斯过滤器:

     library('signal')
     bf <- butter(2, c(low, high), type = "pass")
     signal.filtered <- filtfilt(bf, signal.noisy)
在这种情况下,间隔应定义为c(Low.freq,High.freq)*(2/samp.freq),其中Low.freq和High.freq-频率间隔的边界。有关详细信息,请参阅程序包文档和octave reference guide

还请注意,使用FFT只能获得最高(采样频率)/2的频率。

这篇关于使用FFT的带通滤波器R的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆