Estoy recopilando datos de temperatura de un refrigerador. Los datos se ven como una ola. Me gustaría determinar el período y la frecuencia de la ola (para poder medir si las modificaciones en el refrigerador tienen algún efecto).
Estoy usando R, y creo que necesito usar una FFT en los datos, pero no estoy seguro de dónde ir desde allí. Soy muy nuevo en R y análisis de señales, por lo que cualquier ayuda sería muy apreciada.
Aquí está la ola que estoy produciendo:
Aquí está mi código R hasta ahora:
require(graphics)
library(DBI)
library(RSQLite)
drv <- dbDriver("SQLite")
conn <- dbConnect(drv, dbname = "s.sqlite3")
query <- function(con, query) {
rs <- dbSendQuery(con, query)
data <- fetch(rs, n = -1)
dbClearResult(rs)
data
}
box <- query(conn, "
SELECT id,
humidity / 10.0 as humidity,
temp / 10.0 as temp,
ambient_temp / 10.0 as ambient_temp,
ambient_humidity / 10.0 as ambient_humidity,
created_at
FROM measurements ORDER BY id DESC LIMIT 3600
")
box$x <- as.POSIXct(box$created_at, tz = "UTC")
box$x_n <- box$temp - mean(box$temp)
png(filename = "normalized.png", height = 750, width = 1000, bg = "white")
plot(box$x, box$x_n, type="l")
# Pad the de-meaned signal so the length is 10 * 3600
N_fft <- 3600 * 10
padded <- c(box$x_n, seq(0, 0, length= (N_fft - length(box$x_n))))
X_f <- fft(padded)
PSD <- 10 * log10(abs(X_f) ** 2)
png(filename = "PSD.png", height = 750, width = 1000, bg = "white")
plot(PSD, type="line")
zoom <- PSD[1:300]
png(filename = "zoom.png", height = 750, width = 1000, bg = "white")
plot(zoom, type="l")
# Find the index with the highest point on the left half
index <- which(PSD == max(PSD[1:length(PSD) / 2]))
# Mark it in green on the zoomed in graph
abline(v = index, col="green")
f_s <- 0.5 # sample rate in Hz
wave_hz <- index * (f_s / N_fft)
print(1 / (wave_hz * 60))
He publicado el código R junto con la base de datos SQLite aquí .
Aquí hay una gráfica del gráfico normalizado (con la media eliminada):
Hasta aquí todo bien. Aquí está la gráfica de densidad espectral:
Luego, ampliamos el lado izquierdo del gráfico y marcamos el índice más alto (que es 70) con una línea verde:
Finalmente calculamos la frecuencia de la onda. Esta onda es muy lenta, por lo que la convertimos a minutos por ciclo e imprimimos ese valor que es 17.14286.
Aquí están mis datos en formato delimitado por tabuladores si alguien más quiere probar.
¡Gracias por la ayuda! ¡Este problema fue difícil (para mí) pero lo pasé muy bien!