Frequenz und Periode einer Welle bestimmen


11

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:

Meine Welle

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):

normalisierter Graph

So weit, ist es gut. Hier ist das Diagramm der spektralen Dichte:

spektrale Dichte

Dann zoomen wir auf die linke Seite des Diagramms und markieren den höchsten Index (70) mit einer grünen Linie:

Vergrößern Sie das Spektraldiagramm

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!


Aaron, ich denke, das Beste hier ist, dass Sie einen Link zu Ihrer Datendatei (als Text oder so etwas) in eine Dropbox einfügen, damit ich sie herunterladen und Ihnen die Antwort geben kann. Sonst wird es viel hin und her gehen. Ich kann die Zahlen ganz links nicht erkennen. :-) (Geben Sie auch die Abtastrate an - das heißt, wie oft Sie eine Temperaturmessung durchführen).
Spacey

Oh, tut mir leid. Die Daten enthalten die Temperatur in Grad C, die ich für das Diagramm in Grad F umgerechnet habe. Es sind jedoch die richtigen Daten (es ist die Spalte "temp").
Aaron Patterson

Das Problem bei der Messung der Frequenz auf diese Weise besteht darin, dass es viel schwieriger ist, die durchschnittliche Frequenz zu bestimmen, wenn Sie von Zyklus zu Zyklus erhebliche Schwankungen feststellen - die Spitzen verschmieren -, während Sie durch einfaches Zählen der Zeit zwischen den Ausflügen die Durchschnittswerte gut bestimmen können (und auch std dev usw. berechnen). Die Verwendung des FFT-Ansatzes wäre bei viel Rauschen eher erforderlich, aber dies scheint hier nicht der Fall zu sein.
Daniel R Hicks

+1 für Posting, Code, Daten, Plots und einen Link zu Github.
Nibot

@DanielRHicks In diesem speziellen Fall denke ich nicht, dass es wichtig ist, aber ja, die FFT gibt Ihnen den Durchschnitt von allen, während wir, wenn wir so etwas wie einen Nulldurchgang machen würden, die Dauer (Häufigkeit) jedes Zyklus messen würden. und dann können wir bestimmen, ob wir Mittelwert, Median, Modus usw. nehmen wollen. Guter Punkt!
Spacey

Antworten:


7

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.

reeinl2+ichmeinG2

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:

Geben Sie hier die Bildbeschreibung ein

x[n]]

N.fft=103600=36000.

fs=0,5H.z

x[n]]X.(f)10lÖG10(|X.(f)|2)

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein

F.sN.fft=1,3889e- -005H.z01,3889e- -005=0H.z11,3889e- -005=1,3889e- -005H.z701,3889e- -005=9.7222e- -004H.z

1(9.7222e- -004)60=17.14


@ AaronPatterson Ich habe den Beitrag bearbeitet, siehe. Sie können Ihre Bilder auch direkt zu Ihrem ursprünglichen Beitrag hinzufügen. :-). Bitte fügen Sie ein Bild des PSD-Ergebnisses hinzu, das Sie erhalten.
Spacey

1
Nicht genau korrekt, wenn sich herausstellt, dass die Frequenz zwischen den FFT-Ergebnisbereichen liegt.
hotpaw2

@ hotpaw2 Deshalb habe ich OP gewarnt, dass ich einen allgemeinen Ausblick gebe und warum ich die Handlung sehen muss. Trotzdem habe ich bearbeitet, um die zusätzlichen Einschränkungen hinzuzufügen.
Spacey

1
@ AaronPatterson Kein Problem, gerne helfen. Was Bücher betrifft, schauen Sie sich Richard Lyons "DSP verstehen" an - das ist ein schnelles Buch, mit dem Sie beginnen können.
Spacey

1
1.3x10- -5

4

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.


3

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.


3
Wie kann ich das programmgesteuert machen?
Aaron Patterson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.