Saya mengumpulkan data suhu dari kulkas. Data terlihat seperti gelombang. Saya ingin menentukan periode dan frekuensi gelombang (sehingga saya dapat mengukur apakah modifikasi pada kulkas berpengaruh).
Saya menggunakan R, dan saya pikir saya perlu menggunakan FFT pada data, tapi saya tidak yakin ke mana harus pergi dari sana. Saya sangat baru dalam analisis R dan sinyal, jadi bantuan apa pun akan sangat dihargai!
Inilah gelombang yang saya hasilkan:
Ini kode R saya sejauh ini:
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))
Saya telah memposting kode R bersama dengan database SQLite di sini .
Berikut ini adalah plot grafik yang dinormalisasi (dengan mean dihapus):
Sejauh ini bagus. Berikut adalah plot kerapatan spektral:
Kemudian kita perbesar di sisi kiri plot dan tandai indeks tertinggi (yaitu 70) dengan garis hijau:
Akhirnya kami menghitung frekuensi gelombang. Gelombang ini sangat lambat, jadi kami mengonversinya menjadi menit per siklus, dan mencetak nilai tersebut yaitu 17.14286.
Berikut adalah data saya dalam format tab terbatas jika ada orang lain yang ingin mencoba.
Terima kasih untuk bantuannya! Masalah ini sulit (untuk saya) tetapi saya bersenang-senang!