Ich sammle Temperaturdaten aus einem Kühlschrank. Die Daten sehen aus wie eine Welle. Ich möchte die Periode und Frequenz der Welle bestimmen (damit ich messen kann, ob Änderungen am Kühlschrank Auswirkungen haben).
Ich verwende R und denke, ich muss eine FFT für die Daten verwenden, bin mir aber nicht sicher, wohin ich von dort aus gehen soll. Ich bin sehr neu in der R- und Signalanalyse, daher wäre jede Hilfe sehr dankbar!
Hier ist die Welle, die ich produziere:
Hier ist mein bisheriger R-Code:
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))
Ich habe den R-Code zusammen mit der SQLite-Datenbank hier veröffentlicht .
Hier ist eine grafische Darstellung des normalisierten Graphen (wobei der Mittelwert entfernt wurde):
So weit, ist es gut. Hier ist das Diagramm der spektralen Dichte:
Dann zoomen wir auf die linke Seite des Diagramms und markieren den höchsten Index (70) mit einer grünen Linie:
Schließlich berechnen wir die Frequenz der Welle. Diese Welle ist sehr langsam, daher konvertieren wir sie in Minuten pro Zyklus und drucken den Wert 17,14286 aus.
Hier sind meine Daten im tabulatorgetrennten Format, wenn jemand anderes es versuchen möchte.
Danke für die Hilfe! Dieses Problem war schwer (für mich), aber ich hatte eine tolle Zeit!