2016-11-24 113 views
1

我有一个时间系列z与采样频率fs = 12(月度数据),我想在10个月和15个月使用fft执行带通滤波器。这是我会怎样着手:带通滤波器R使用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。有人能帮我吗?

回答

1

我有一个函数,它包装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和高.freq - 频率间隔的边界。有关更多信息,请参阅软件包文档和octave reference guide

此外,请注意,使用fft,您只能得到频率高达(采样频率)/ 2的频率。

+0

谢谢,但这些频率如何与我的带通窗口(10和15)相关?我怎样才能将fft的值设置为与这个间隔不相对应的值? – user3910073

+0

用适合您的值更新答案。 –