Как удалить отдельные гармоники во временных рядах? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть временной ряд с почасовыми (скользящими средними) данными с 2014 по 2019 год.

Я использовал функцию fft(), чтобы найти гармоники, и quantmod::findPeaks(), чтобы найти позиции с наибольшим значением те, которые дали мне в результате следующие позиции: 8 56 2193 4384 6575 8766 306737 308928 311119 313310 315447 315495 (315499 элементов во временном ряду).

Теперь мне нужно преобразовать это обратно во временную область, но заменив ноль на значение данные в тех позициях. Как я могу это сделать?

Кроме того, я заметил, что когда я построил функцию fft() (абсолютные значения БПФ), по оси x все еще были показаны периоды с 2014 по 2019 год. он превращается в ось Гц (частота)?

z - это мой временной ряд

FFT <- fft(z)
FFT <- abs(FFT/FFT[1])
plot(FFT)

PK <- findPeaks(FFT, thresh = T)
PK

Результаты PK - это 12 пиков, которые я упомянул, представляющие высшие гармонии c искажения . Мне нужно их удалить. Я считаю, что могу просто сделать FFT[8]=0 до 12 пиков, но я не уверен. (Я пробовал это, но это не позволяет мне вернуться во временную область)

Мне также нужно доказать, что полученный график БПФ действительно является спектром Фурье, но ось x не является частотой. Есть идеи, как сделать это исправление?

1 Ответ

0 голосов
/ 28 мая 2020

Имитация прямоугольной волны + (низкий) шум

set.seed(101)
ncycles <- 20
len <- 50
z <- rep(rep(0:1,each=len),ncycles) + rnorm(len*ncycles,mean=0, sd=0.02)
plot(z,type="l")

БПФ и поиск пиков

f <- fft(z)
F <- abs(f/f[1])
PK <- quantmod::findPeaks(F,thresh=0.01)

График sqrt (спектр мощности):

plot(F,type="l")
abline(v=PK,col=2)

Ноль out peaks:

fz <- f
## position of 'peaks' is actually *one before* PK (not sure why?)
fz[PK-1] <- 0

Обратное преобразование, сравнить с оригиналом:

zz <- Re(fft(fz,inverse=TRUE))/length(f)
plot(z,type="l")
lines(zz,type="l",col=2)
...