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!
Réponses:
Projet intéressant que vous avez en cours! :-)
D'un POV d'analyse de signal, c'est en fait une question simple - et oui, vous avez raison d'utiliser la FFT pour ce problème d'estimation de fréquence.
Ensuite, très simplement, trouvez le maximum de l'emplacement de votre PSD. L'abscisse de ce max correspondra à votre fréquence.
Caveat Emptor, je vous donne un aperçu général, et je soupçonne que le résultat de la FFT en R sera une fréquence normalisée, auquel cas vous devrez connaître votre taux d'échantillonnage, (ce que vous faites), afin de le reconvertir en Hz. Il y a de nombreux autres détails importants que je laisse de côté, tels que votre résolution de fréquence, la taille de la FFT et le fait que vous souhaitiez probablement réduire le signal en premier, mais ce sera bien de voir d'abord un tracé.
ÉDITER:
Prenons en compte votre signal. Après que je déteste, il ressemble à ceci:
Vous pouvez voir comment il est symétrique. Si vous ignorez la dernière moitié, et regardez simplement la première moitié et zoomez sur vous, vous pouvez voir ceci:
la source
Pour une forme d'onde aussi lisse et stationnaire, le comptage des points d'échantillonnage entre les croisements positifs d'une certaine valeur de seuil moyenne vous donnera une estimation de période. Regardez plusieurs périodes de franchissement de seuil pour obtenir une estimation plus moyenne ou détecter toute tendance.
la source
Il n'est pas nécessaire de faire quoi que ce soit de compliqué: il suffit de mesurer la durée entre les pics de la forme d'onde. C'est la période. La fréquence est juste 1 divisée par la période.
Avec environ 8 cycles sur 2 heures, la fréquence est de 4 cycles par heure, soit environ 1 mHz.
la source