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!
Antworten:
Interessantes Projekt, das Sie dort laufen! :-)
Ausgehend von einer Signalanalyse-POV ist dies eigentlich eine einfache Frage - und ja, Sie haben Recht, dass Sie die FFT für dieses Frequenzschätzungsproblem verwenden würden.
Dann finden Sie ganz einfach das Maximum, wo sich Ihre PSD befindet. Die Abszisse dieses Maximums entspricht Ihrer Frequenz.
Vorbehalt Emptor, ich gebe Ihnen einen allgemeinen Ausblick, und ich vermute, dass das Ergebnis der FFT in R eine normalisierte Frequenz sein wird. In diesem Fall müssten Sie Ihre Abtastrate kennen (was Sie tun), um sie zurück zu konvertieren in Hz. Es gibt viele andere wichtige Details, die ich weglasse, wie z. B. Ihre Frequenzauflösung, FFT-Größe und die Tatsache, dass Sie Ihr Signal wahrscheinlich zuerst de-bedeuten möchten, aber es ist gut, zuerst einen Plot zu sehen.
BEARBEITEN:
Lassen Sie uns Ihr Signal berücksichtigen. Nachdem ich es gemeint habe, sieht es so aus:
Sie können sehen, wie symmetrisch es ist. Wenn Sie die letzte Hälfte ignorieren und nur die erste Hälfte betrachten und Sie vergrößern, können Sie Folgendes sehen:
quelle
Für eine Wellenform erhalten Sie durch diese glatte und stationäre Zählung der Abtastpunkte zwischen positiven Übergängen eines durchschnittlichen Schwellenwerts eine Periodenschätzung. Sehen Sie sich mehrere Schwellenwertüberschreitungsperioden an, um eine durchschnittlichere Schätzung zu erhalten oder einen Trend zu erkennen.
quelle
Es ist nicht erforderlich, etwas Kompliziertes zu tun: Messen Sie einfach die Dauer zwischen den Spitzen der Wellenform. Dies ist die Zeit. Die Frequenz ist nur 1 geteilt durch die Periode.
Bei ungefähr 8 Zyklen über 2 Stunden beträgt die Frequenz 4 Zyklen pro Stunde oder ungefähr 1 MHz.
quelle