ฉันกำลังรวบรวมข้อมูลอุณหภูมิจากตู้เย็น ข้อมูลดูเหมือนเป็นคลื่น ฉันต้องการกำหนดระยะเวลาและความถี่ของคลื่น (เพื่อให้ฉันสามารถวัดได้ว่าการดัดแปลงตู้เย็นมีผลกระทบใด ๆ )
ฉันใช้ 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
นี่คือข้อมูลของฉันในรูปแบบที่คั่นด้วยแท็บหากใครต้องการลอง
ขอบคุณสำหรับความช่วยเหลือ! ปัญหานี้ยาก (สำหรับฉัน) แต่ฉันมีช่วงเวลาที่ดี!