냉장고에서 온도 데이터를 수집하고 있습니다. 데이터는 파도처럼 보입니다. 나는 파도의주기와 주파수를 결정하고 싶습니다 (냉장고에 대한 수정이 효과가 있는지 측정 할 수 있도록).
R을 사용하고 있으며 데이터에 FFT를 사용해야한다고 생각하지만 어디에서 어디로 가야할지 모르겠습니다. 저는 R 및 신호 분석에 익숙하지 않으므로 도움을 주시면 감사하겠습니다.
다음은 내가 생성하는 물결입니다.
지금까지 내 R 코드는 다음과 같습니다.
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))
R 코드를 SQLite 데이터베이스와 함께 여기에 게시했습니다 .
다음은 정규화 된 그래프의 플롯입니다 (평균이 제거 된 상태).
여태까지는 그런대로 잘됐다. 스펙트럼 밀도 플롯은 다음과 같습니다.
그런 다음 플롯의 왼쪽을 확대하고 가장 높은 색인 (70)을 녹색 선으로 표시합니다.
마지막으로 파도의 주파수를 계산합니다. 이 물결은 매우 느리기 때문에주기 당 분으로 변환하고 17.14286의 값을 인쇄합니다.
다음은 탭에서 내 데이터 형식을 구분 다른 사람이 시도하고자하는 경우.
도와 주셔서 감사합니다! 이 문제는 어려웠지만 (나를 위해) 좋은 시간을 보냈습니다!