Визначення частоти та періоду хвилі


11

Я збираю дані про температуру з холодильника. Дані виглядають як хвиля. Я хотів би визначити період та частоту хвилі (щоб я міг виміряти, чи можуть зміни холодильника мати якийсь ефект).

Я використовую 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.

Ось мої дані у форматі з обмеженими вкладками, якщо хтось ще хоче спробувати.

Дякую за допомогу! Ця проблема була важкою (для мене), але я чудово провів час!


Аарон, я думаю, що найкраще тут, щоб ви помістили посилання на файл ваших даних (у вигляді тексту чи чогось іншого) на дропбокс, щоб я міг його завантажити та дати відповідь. Інакше буде багато їздити туди-сюди. Я не можу розібрати цифри в крайньому лівому кінці. :-) (Також дайте вам показник вибірки - тобто, як часто ви приймаєте показник температури).
Спейсі

Ах, вибачте. Дані містять температуру в градусах С, я перетворюю на градуси F для графіка. Це правильні дані, хоча це "стовпчик".
Аарон Паттерсон

Проблема з вимірюванням частоти таким чином полягає в тому, що якщо ви отримаєте значну варіативність від циклу до циклу, то визначити середню частоту буде набагато складніше - піки будуть мазати разом - тоді як просто підрахунок часу між екскурсіями дозволить вам добре оцінити середні речі (а також обчислити std dev тощо). Використання підходу FFT було б більш затребуваним, якби було багато шуму, але, мабуть, це не так.
Даніель Р Хікс

+1 для публікації, коду, даних, сюжетів та посилання на github.
nibot

@DanielRHicks У цьому конкретному випадку я не думаю, що це має значення, але так, FFT дасть вам середню серед усіх, тоді як якби ми зробили щось на зразок нульового перетину, ми б вимірювали тривалість (частоту) кожного циклу, і тоді ми можемо визначити, чи хочемо ми взяти середню, медіану, режим тощо. Добре!
Спейсі

Відповіді:


7

Цікавий проект, який ви там продовжуєте! :-)

З аналізу сигналу POV, це насправді просте запитання - і так, ви праві, що використовували FFT для цієї проблеми оцінки частоти.

Я не знайомий з R, але те, що ви, по суті, хочете зробити, це прийняти FFT сигналу температури. Оскільки ваш сигнал справжній, ви отримаєте складний результат як результат вашої FFT. Тепер ви можете взяти в квадраті абсолютну величину вашого складного результату FFT (оскільки ми не піклуємося про фазу). Тобто . Це ваша спектральна щільність потужності.real2+imag2

Тоді, дуже просто, знайдіть максимум місця, де сидить ваш PSD. Абсциса цього максимуму буде відповідати вашій частоті.

Caveat Emptor, я даю вам загальний прогноз, і я підозрюю, що результат FFT в R буде нормалізованою частотою, і в цьому випадку вам доведеться знати ваш показник вибірки (що ви робите), щоб перетворити його назад в Гц. Є багато інших важливих деталей, які я залишаю поза увагою, такі як ваше дозвіл на частоту, розмір FFT, а також те, що ви, мабуть, хочете спочатку визначити свій сигнал, але добре буде спочатку переглянути сюжет.

Редагувати:

Давайте врахуємо ваш сигнал. Після того, як я де-маю це, це виглядає приблизно так:

введіть тут опис зображення

Ви хочете визначити, оскільки зміщення постійного струму технічно є частотою 0 Гц, і ви не хочете, щоб він заглушив інші цікаві частоти. Назвемо цей знецінений сигнал .x[n]

Тепер, коли ви приймаєте FFT, ви повинні прислухатися до деяких деталей. Я використовую FFT довжиною в 10 разів більше довжини сигналу, тому ми можемо сказати, що Будь-який розмір FFT, встановлений більше, ніж розмір вихідного сигналу, впливає на інтерполяцію результату FFT в частотній області. Хоча це не додає будь-якої інформації для вас з теорії інформації POV, це допоможе вам краще зрозуміти, де саме знаходиться ваш справжній пік, особливо у випадках, коли він лежить між двома частотами. Щоб отримати справді кращу роздільну здатність, потрібно отримати більше даних. (тобто нехай датчик працює протягом більш тривалого періоду часу).Nfft=103600=36000.

Переходячи з текстового файлу, я бачу, що ваш датчик проводить показання температури кожні 2 секунди. Це означає, що ваша частота вибірки абоfs=0.5Hz

Таким чином, візьмемо FFT з і назвемо цей результат . Цей результат буде складним, і насправді він є симетричним, але це не важливо. (Це просто означає для ваших цілей, половина - це зайве). Тепер якщо ми візьмемо , це спектральна щільність потужності (в масштабі журналу). Результат виглядає так:x[n]X(f)10log10(|X(f)|2)

введіть тут опис зображення

Ви можете бачити, як це симетрично. Якщо ви проігноруєте останню половину і просто подивіться на першу половину і збільшите масштаб, ви можете побачити це:

введіть тут опис зображення

Тож у вас пік за показником 70! Але що таке показник 70 у реальному вираженні частоти? Тут ви хочете, щоб ваше частотне дозвіл. Щоб обчислити це, ми просто беремо . Це просто означає, що кожен індекс представляє частоту, кратну цьому числу. Індекс 0 дорівнює . Індекс 1 дорівнює . Індекс 70 дорівнює .FsNfft=1.3889e005Hz01.3889e005=0Hz11.3889e005=1.3889e005Hz701.3889e005=9.7222e004Hz

Ми майже готові. Тепер, коли у вас є ця цифра, ми можемо перетворити її на щось більш приємне. Цей показник просто говорить про те, що ваш сигнал завершує 9,7222e-004 циклів щосекунди. Тож ми можемо запитати, скільки хвилин потрібно для обчислення одного циклу? Таким чином, хв за цикл.1(9.7222e004)60=17.14


@AaronPatterson Я редагував публікацію, будь ласка, дивіться. Крім того, ви можете додавати свої фотографії безпосередньо до своєї оригінальної публікації. :-). Будь ласка, додайте зображення отриманого результату PSD.
Спейсі

1
Не зовсім коректно, якщо частота виявляється між білками результатів FFT.
hotpaw2

@ hotpaw2 Тому я попередив ОП, що я даю загальний прогноз, і чому мені потрібно подивитися сюжет. Я все-таки редагував, щоб додати додаткові застереження.
Спейсі

1
@AaronPatterson Немає проблем, радий допомогти. Щодо книг, подивіться на "Розуміння DSP" Річарда Лайона - це швидка книга, з якої слід розпочати.
Спейсі

1
@Frank Це просто показник. , наприклад. 1.3x105
Спейси

4

Для такої плавної та нерухомої форми хвилі підрахунок точок вибірки між позитивними перехідними перетинаннями середнього порогового значення дасть оцінку періоду. Подивіться на кілька періодів переходу порогу, щоб отримати більш середню оцінку або виявити будь-яку тенденцію.


3

Не потрібно робити нічого складного: просто виміряйте тривалість між піками форми хвилі. Це період. Частота всього 1, поділена на період.

Маючи приблизно 8 циклів протягом 2 годин, частота становить 4 цикли на годину, або близько 1 мГц.


3
Як я можу це зробити програмно?
Аарон Паттерсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.