Buzdolabından sıcaklık verileri topluyorum. Veriler bir dalgaya benziyor. Dalganın periyodunu ve sıklığını belirlemek istiyorum (böylece buzdolabındaki değişikliklerin herhangi bir etkisi olup olmadığını ölçebilirim).
R kullanıyorum ve veri üzerinde bir FFT kullanmam gerektiğini düşünüyorum, ama oradan nereye gideceğimi bilmiyorum. R ve sinyal analizinde çok yeniyim, bu yüzden herhangi bir yardım çok takdir edilecektir!
İşte ürettiğim dalga:
İşte şimdiye kadar benim R kodu:
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))
Burada SQLite veritabanı ile birlikte R kodunu gönderdim .
İşte normalleştirilmiş grafiğin bir grafiği (ortalama kaldırılmış olarak):
Çok uzak çok iyi. İşte spektral yoğunluk grafiği:
Sonra grafiğin sol tarafını yakınlaştırırız ve en yüksek endeksi (70 olan) yeşil bir çizgiyle işaretleriz:
Son olarak dalganın frekansını hesaplıyoruz. Bu dalga çok yavaş, bu yüzden onu döngü başına dakikaya dönüştürüyoruz ve 17.14286 olan bu değeri yazdırıyoruz.
İşte sekmede verilerim ayrılmış biçim başkasının denemek istiyorsa.
Yardım için teşekkürler! Bu sorun (benim için) zordu ama harika zaman geçirdim!