Почему константы, возвращаемые функцией fft из пакета статистики в R, не возвращают приблизительное значение сигнала при оценке? - PullRequest
0 голосов
/ 27 мая 2020

Я пытался получить частоту и амплитуду всех значений сигнала, применяя функцию stats.:fft (). Мой реальный сигнал показан на следующем рисунке: enter image description here

Сигнал измеряется каждый час.

Это код, используемый для создания индекса сигнала, Я не уверен, почему мне всегда нужно выполнять интеграцию от 0 до 1, но я читал, что это работает, поэтому я использую его здесь.

samp_freq <- 168

time_interval <- 1/samp_freq

signal_index <- seq(0, 1, by=time_interval)

plot(x = signal_index,y = dt$train.sensores_sum_entrada[1:169], type = "l")

После применения преобразования функции и оценки константы для каждой частотной составляющей при построении результатов я получаю примерно следующее: enter image description here

Код для генерации этого результата выглядит следующим образом:

f_component <- stats::fft(z = dt$train.sensores_sum_entrada[1:169])

f_coef <- abs(f_component)

plot(f_coef)
main_coef <- (abs(stats::fft(dt$train.sensores_sum_entrada))/(6966/2))[1:500]
normal_f_compon <- f_coef/ (168/2)
main_coef <- normal_f_compon[1:(168/2)]
coef_table <- data.table(frequency = 1:length(main_coef),amplitude = main_coef)
model_evaluated <- lapply(X = 1:length(coef_table$frequency),FUN = function(i) coef_table$amplitude[i]*sin(2*pi*coef_table$frequency[i]*signal_index))
plot(Reduce(f = `+`,model_evaluated),type = "l")

I был бы признателен, если бы кто-нибудь знал, как я могу это исправить.

Спасибо.

1 Ответ

1 голос
/ 28 мая 2020

Похоже, вы пытаетесь восстановить сигнал по его fft. Для этого вы можете использовать fft(f_component, inverse = TRUE), хотя, если вы хотите сделать это вручную, вы можете попробовать этот подход.

Сначала я создам некоторые фиктивные данные:

f <- function(x)
{
  (sin(x * pi * 12) + 1) * 2000 +
  cos(x * pi * 54) * 200 -
  sin(x * pi * 3.6) * 250
}

x <- seq(0, 1, length.out = 168)

plot(x, f(x), type = "l")

enter image description here

И я получаю преобразование Фурье:

f_components <- fft(f(x))

И я могу его перевернуть следующим образом:

freqs   <- seq_along(f_components) - 1
fourier <- pi * -2 * complex(imaginary = 1) * freqs/length(f_components)
y <- sapply(freqs, function(i) sum(f_components * exp(fourier * i)))
y <- c(y[1], rev(y[-1])) / length(f_components)

lines(x, y, col = "red")

Создано 28.05.2020 с помощью пакета . (v0.3.0)

...