Je collecte des données de température dans un réfrigérateur. Les données ressemblent à une vague. Je voudrais déterminer la période et la fréquence de l'onde (afin de pouvoir mesurer si les modifications apportées au réfrigérateur ont un effet).
J'utilise R, et je pense que je dois utiliser une FFT sur les données, mais je ne sais pas où aller à partir de là. Je suis très nouveau dans l'analyse R et du signal, donc toute aide serait grandement appréciée!
Voici la vague que je produis:
Voici mon code R jusqu'à présent:
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))
J'ai posté le code R avec la base de données SQLite ici .
Voici un tracé du graphique normalisé (avec la moyenne supprimée):
Jusqu'ici tout va bien. Voici le tracé de densité spectrale:
Ensuite, nous zoomons sur le côté gauche de l'intrigue et marquons l'indice le plus élevé (qui est 70) avec une ligne verte:
Enfin, nous calculons la fréquence de l'onde. Cette vague est très lente, nous la convertissons donc en minutes par cycle et imprimons cette valeur qui est 17,14286.
Voici mes données au format délimité par des tabulations si quelqu'un d'autre veut essayer.
Merci pour l'aide! Ce problème était difficile (pour moi) mais j'ai passé un bon moment!