Tôi đang thu thập dữ liệu nhiệt độ từ tủ lạnh. Dữ liệu trông giống như một con sóng. Tôi muốn xác định chu kỳ và tần số của sóng (để tôi có thể đo nếu sửa đổi cho tủ lạnh có ảnh hưởng gì không).
Tôi đang sử dụng R và tôi nghĩ rằng tôi cần sử dụng FFT trên dữ liệu, nhưng tôi không chắc sẽ đi đâu từ đó. Tôi rất mới với R và phân tích tín hiệu, vì vậy bất kỳ trợ giúp sẽ được đánh giá rất cao!
Đây là làn sóng tôi đang sản xuất:
Đây là mã R của tôi cho đến nay:
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))
Tôi đã đăng mã R cùng với cơ sở dữ liệu SQLite tại đây .
Dưới đây là một biểu đồ của đồ thị chuẩn hóa (với giá trị trung bình bị loại bỏ):
Càng xa càng tốt. Dưới đây là biểu đồ mật độ phổ:
Sau đó, chúng tôi phóng to ở bên trái của âm mưu và đánh dấu chỉ số cao nhất (là 70) bằng một đường màu xanh lá cây:
Cuối cùng, chúng tôi tính toán tần số của sóng. Sóng này rất chậm, vì vậy chúng tôi chuyển đổi nó thành phút trong mỗi chu kỳ và in ra giá trị đó là 17.14286.
Đây là dữ liệu của tôi ở định dạng được phân định bằng tab nếu có ai muốn thử.
Cảm ơn đã giúp đỡ! Vấn đề này thật khó khăn (đối với tôi) nhưng tôi đã có một khoảng thời gian tuyệt vời!