时间序列分析 - 提取和提取周期性成分

时间:2014-11-11 13:18:34

标签: r

我的数据集的频谱显示了时间序列中的3个周期性组件。我想减去周期性组件以保持数据没有这些周期性。 它指出了周期性为(1/144 =每日),(1/72 = 1/2每日)和(1/6 =每小时)的周期性事件。 我的想法是找出我的数据集的傅里叶分量(磁场和相位),并为这3个特定频率提取傅里叶分量,并创建一个新的信号: 数据 - PeriodicSignal_1h - PeriodicSignal_1 / 2day - PeriodicSignal_1day 我尝试使用fft,但我不知道如何在这些特定频率下提取信号。

我的数据集很复杂,但我正在研究一个例子来理解这个过程。这是一个例子:

samplingFrequency = 1000;
timeInterval = 1/samplingFrequency;
signalIndex = seq(0, 1, by=timeInterval);
N = 1000
a1 = 2;  
a2 = 3;  
f1 = 10; 
f2 = 20; 
signal1 = a1 * sin(2 * pi * f1 * signalIndex);
signal2 = a2 * sin(2 * pi * f2 * signalIndex);
inputSignal = signal1 + signal2;
  

Y< - fft(inputSignal)
  mag< -sqrt(Re(Y)^ 2 + Im(Y)^ 2)* 2 / length(inputSignal)
  阶段< -atan(Im(Y)/ Re(Y))Yr< -Re(Y)Yi< -Im(Y)

我正在尝试以频率f1提取信号的mag和相位。我想用is:

生成一个新信号
  

ImputSignal - Signal_f1

1 个答案:

答案 0 :(得分:3)

我相信以下是您正在寻找的...我改变了一些变量名称。在底部是您询问的频率选择。

设置时间和频率参数

samplingFrequency = 1000;
f_Hz = samplingFrequency
N = 1000
df_Hz = f_Hz / N
T = 1 / df_Hz
dt=T/N
t = dt*(seq(1,N)-1)

生成假信号,无噪音

a1 = 2;  
a2 = 3;  
f1 = 10; 
f2 = 20; 
signal1 = a1 * sin(2 * pi * f1 * t);
signal2 = a2 * sin(2 * pi * f2 * t);
inputSignal = signal1 + signal2;

绘制假信号

plot(t, signal1,type='l',col='green',ylim=c(-6,6))
lines(t, signal2,col='red')
lines(t, inputSignal,col='black')

获取fft,并绘制正频率部分

Y <- fft(inputSignal)
m <- floor(N/2)-1
posFreqIndices <- 2:(m+1)
negFreqIndices <- N:(m+3)
mag <-sqrt(Re(Y)^2+Im(Y)^2)*2/length(inputSignal)
phase <-atan(Im(Y)/Re(Y))
Yr <- Re(Y) 
Yi <- Im(Y)
freq <- seq(df_Hz,f_Hz/2-df_Hz,df_Hz)
plot(freq,mag[posFreqIndices],type='l',xlab='Freq (Hz)', ylab='Magnitude',xlim=c(0,30))
# plot(freq,10*log10(mag[posFreqIndices]),type='l',xlab='Freq (Hz)', ylab='Magnitude (db)',xlim=c(0,30))
# plot(freq,phase[posFreqIndices]*180/pi,type='l',xlab='Freq (Hz)', ylab='Phase (deg)',xlim=c(0,30))

根据幅度

识别滤波信号的频率
ampSelectIndices <- which(mag>1.9 & mag < 2.1)

为所选频率生成滤波后的fft

YAmpSelect <- Y*0
YAmpSelect[ampSelectIndices] = Y[ampSelectIndices]

计算逆fft

yAmpSelect = Re(fft(YAmpSelect, inverse = TRUE))/length(YAmpSelect)

绘制滤波后的信号

plot(t,yAmpSelect,t='l',xlab='t (sec)',ylab='Filtered for mag ~ 2')

绘制原始信号减去滤波后的信号

plot(t,inputSignal-yAmpSelect,type='l')

fft是在折叠频率的情况下计算的。下面检查展开过程,该检查适用于实值信号(不是复值时间信号)。该过程对于复值时间信号是正确的。

checkFreqWrapping = all.equal(mag[posFreqIndices], mag[negFreqIndices])
stopifnot(checkFreqWrapping)

按频率选择fft值

freqSelectIndices_a <- which(9.95 < freq & freq < 10.05)
freqSelectIndices = union(posFreqIndices[freqSelectIndices_a],negFreqIndices[freqSelectIndices_a])

为所选频率创建fft

YFreqSelect <- Y*0
YFreqSelect[freqSelectIndices ] = Y[freqSelectIndices ]

计算时间信号,绘制它。

yFreqSelect = Re(fft(YFreqSelect, inverse = TRUE))/length(YFreqSelect)
plot(t,yFreqSelect,t='l',xlab='t (sec)',ylab='Filtered for mag ~ 2')
plot(t,inputSignal-yFreqSelect,type='l')

好的,我认为这解释了如何根据频率选择fft值...祝你好运......