2016-11-24 109 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

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