我有一个采样频率为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的频率。

关于r - 使用fft的带通滤波器R,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40785142/

10-12 21:39