Рубрики
Без рубрики

Как превратить в вулканические землетрясения в значимые данные с небольшим количеством питона

TL; доктор Я не хороший программист Но я думаю, что я делаю интересные вещи. Одно из тех вещей, которые я … помечен с Python, Учебник, Исследование.

Я не хороший программист Но я думаю, что я делаю интересные вещи. Одним из тех вещей является исследование вулканической изоляции. Магма нажимает, создает землетрясение, и я использую показания датчиков этих землетрясений, чтобы сделать мои исследования.

Код мне нужен извлечение функций, которые мне нужны:

import 
#read in the raw data
input_df = pd.read_csv("../Data/Specimen_Event.csv", index_col="Seconds")

#The output from the raw data isn't too useful, so let's look at the constituent frequencies

fft_df = input_df.copy()

y_values = np.fft.fft(input_df.Amplitude.values)

no_of_datapoints = len(y_values)
time_interval = 0.01 

yf_values = 2.0/no_of_datapoints * np.abs(y_values[:no_of_datapoints//2])

x_values = fftfreq(no_of_datapoints, d=time_interval)
xf_values = fftfreq(no_of_datapoints, d=time_interval)[:no_of_datapoints//2]

#The frequency data is useful, but we've lost all temporal information - let's just take time slices and transform those, and glue it back together like a histogram - aka a seismogram

window_size = 256

recording_rate = 100

frequencies, times, amplitudes = signal.spectrogram(input_df.Amplitude.values, fs = recording_rate, window='hanning', nperseg = window_size, noverlap= window_size - 100, detrend= False, scaling="spectrum")

decibels = 20 * np.log10(amplitudes)

f, ax = plt.subplots()
ax.pcolormesh(times, frequencies, decibels, cmap="viridis")

Это показывает мне оба события, так и скрытая узор при 38 Гц. Это может быть использовано для гипотезы, которые у нас есть магматическая камера около ~ 150 метров.

Я постараюсь начать этот пост, как будто я пытаюсь начать свою работу – управляя ожиданиями и честным о моих возможностях. Я не инженер 10x ( Если вы верите в этот миф ) Или что-нибудь рядом с ним, и я не сфокусировал лазерный старший разработчик с годы взносов с открытым исходным кодом. Я не изменю так, как вы код или как вы подходите к своей работе.

То, что я есть, вместо этого является забор-иттер с привычкой откидывания между промышленностью и академией; Достаточно опыта, чтобы узнать, когда я пишу Bonckiness плохой код (даже если я не могу остановить себя от этого первым место), но достаточно времени в исследованиях, чтобы применить мои посредственные навыки на что-то другое – в частности, Вулканы!

Итак, как именно вулканология погружается в программирование? Хорошо, на протяжении многих лет произошли прорывы в том, как мы наблюдаем вулканические волнения – и более того, изменения в том, как мы мера Это тоже, и это важная часть. Безопадать Арни: «Если это количественно, мы можем проанализировать это» Отказ

Итак, что мы измерим? Вулкан трудно прожимать вулкан, и мы не можем просверлить в активный вулкан, чтобы получить примерные данные. Но у нас есть некоторые прокси, которые мы можем вместо этого, которые дают нам подсказки, и один из лучших – это то, что называется сейсмичность – землетрясение – землетрясение от вулкана. У нас не может быть извержения без магмы, попадающей на поверхность (или, по крайней мере, несколько близко), но для них нельзя приятных простых пробуренных труб. Каждый дюйм вентиляции должен быть разделен из окружающей скалы, иногда для километров.

Эта инъекция магмы является довольно энергичным и шумным делом, и мы можем забрать. Эти небольшие переломы создают очень мелкие, различные, локализованные землетрясения, которые мы можем забрать с сейсмометрами – наклон/акселерометров измерения измерения в осях ± x, ± y и ± z.

Итак, какой смысл этого поста? Ну, все очень хорошо зная, что эти землетрясения происходят, но как мы их понимаем?

Мы начинаем там, где мы всегда делаем, посмотрев на данные, но сначала давайте получим библиотеки, которые нам понадобится.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from numpy.fft import * # a library for carrying out Fourier Transforms
from scipy import signal # further FFT functionality

Для тех из вас, кто хочет кодировать на дому, я включил указатели на данные образцы и ноутбук внизу

Теперь нам нужно получить наши данные в. Это доступно как простая серия Time-Series CSV, что приносит проглатывание очень легко, и, поскольку мы загружаем только в одном примере, мы не беспокоимся о расширении этого, поэтому у нас нет причин не использовать Пандас и облегчить нашу жизнь.

После того, как мы загружены наши данные, мы будем быстро построить необработанные данные.

input_df = pd.read_csv("../Data/Specimen_Event.csv", index_col="Seconds")

input_df.plot(lw = 0.3)

Что дает нам

Кажется, нам повезло иметь два события в одном 300-секундном окне; Вы можете увидеть одно меньшую событие, а затем больший. Но трудно сказать больше, чем это точно. Нам нужен лучший способ понять показания датчика.

То, что мы видели на сюжете, была амплитуда против времени. Когда мы относимся к тому же данным в качестве звукового файла и прослушайте его, мы бы не просто слышали грохот, но мы сможем выбирать более глубокие и более высокие часы. К счастью, есть способ математически выбирать частоты – преобразования Фурье.

Я оставлю подробное объяснение для более позднего поста, но достаточно сказать, что мы можем повернуть Амплитуда против времени Сюжет, где мы видим количество энергии, записанную один раз на 0,01 секунды, к Амплитуда против частоты Сюжет, где мы видим количество энергии через Datafile на частоту Отказ Вы обычно слышите, что люди относятся к этим как в либо временный или Время домена и часто или Частота-домен Отказ

Мы используем Scipy/Numpy Fast Fasterier Furrier Furrier, чтобы преобразовать наше событие в частотный домен.

fft_df = input_df.copy()

y_values = np.fft.fft(input_df.Amplitude.values)

no_of_datapoints = len(y_values)
time_interval = 0.01 #the seismometers for this recording sample 100 times a second

yf_values = 2.0/no_of_datapoints * np.abs(y_values[:no_of_datapoints//2])

x_values = fftfreq(no_of_datapoints, d=time_interval)
xf_values = fftfreq(no_of_datapoints, d=time_interval)[:no_of_datapoints//2]

fig, ax = plt.subplots()
ax.plot(xf_values, yf_values, lw=0.3)
ax.set_xlabel("Frequency [Hz]")
ax.set_ylabel("Amplitude")
ax.set_title("Fast Fourier Transform for Specimen event")
plt.show()

Мы проведем шаги здесь подробно в более позднем посте, но по сути, мы рассчитываем амплитуду произвольной периодичностью, но нам необходимо самостоятельно работать фактические частоты, которые мы видим (наша ось X, Все частоты зависят от количества точек данных и скорости записи), используя fftfreq функция. Там немного жонглирование, чтобы кормить вдвое, даже длину. Опять больше на это в более позднем посте.

Это оставляет нас с этим сюжетом:

Теперь мы можем увидеть распределение частот в мероприятии. Существует много низкочастотной грохоты между регионом 1 – 30 Гц. Диапазон человека с людьми начинается около 20 Гц, поэтому это относительно низкое. Но есть тенденция.

Единственная проблема в настоящее время заключается в том, что, перемещая данные в частотную домен, мы потеряли любую информацию о том, как событие меняется со временем. Ответ на это состоит в том, чтобы нарезать событие в узкие, слегка перекрывающиеся окна и запускайте те же преобразования Фурье над этими окнами индивидуально. Затем мы можем сложить их вместе как форму гистограммы с информацией о частоте, так и время, известной как Спектрограмма Отказ

Тем не менее, есть выделение – тем короче образец, тем менее точным и чувствительным преобразованием Фурье – это, но более длинные образцы оставляют нас с более низким разрешением времени. Еще одна вещь, которую мы должны иметь в виду, это то, что он вычисляется более эффективным для использования 2 ^ n размеров окон.

Мы могли бы сделать это вручную с одним и тем же кодом, раньше, но мы будем использовать короткую резюме: пребультативную скаковую библиотеку, которая будет запускать преобразования и подготовить к нам для визуализации.

window_size = 256

recording_rate = 100

frequencies, times, amplitudes = signal.spectrogram(input_df.Amplitude.values, fs = recording_rate, window='hanning', nperseg = window_size, noverlap= window_size - 100, detrend= False, scaling="spectrum")

decibels = 20 * np.log10(amplitudes)

f, ax = plt.subplots()
ax.pcolormesh(times, frequencies, decibels, cmap="viridis")
ax.set_ylabel("Frequency $kHz$")
ax.set_xlabel("Time $s$")
ax.set_title("Fast Fourier Transform for Specimen event")
plt.show()

И что?

Что ж, усилия по захвату временных тенденций данных в частотной области окупили. То, что мы можем видеть на последнем графике, – это время прогрессировать время, когда вы двигаетесь правым, и запись становится более высокой частотой, когда вы поднимаетесь – яркий цвет, тем больше энергии. Мы можем видеть оба события довольно четко, но есть один шаблон, который менее очевиден, но более захватывающим.

Если вы не заметили его, есть полоса информации примерно на ~ 38 Гц, которая вполне активна через 150 секунд. Трудно быть уверенным в том, что мы видим, но у нас есть две возможности. Чем больше мирного ответа состоит в том, что есть некоторые фоновые шумоподобные штормы в океане, что резонировали в эту полосу – частоту эхо. Сигнал, сидящий настолько последовательно на ~ 38 Гц, будет поддерживать этот механизм.

Однако шум океана обычно не выше ~ 0,14 Гц. Найти его до 38 Гц, вряд ли. Хотя есть много других источников шума, не так ли это что последовательнее, чтобы остаться именно той частотным диапазоном.

Другой ответ заключается в том, что после этих более значимых событий магма часто переселяется и перемещается в пробелы в новых трещинах, а давление в камере переселяется. По мере того как сигнал появляется больше после событий, и это довольно непрерывно, оно с большей вероятностью будет слайвлением магмы, чем быть одним хрупким отказа.

Давайте пойдем на последний полет фантазии. Я не утверждаю, что эта последняя часть – это что-то, кроме как догада, поэтому скептики предотвращают ваши глаза!

Как ни странно, сигнал настолько соответствует частоте, поэтому может быть, что он действует как ветер через пивной бутылку. Когда скорость ветра достаточно быстрая поперек апертуры, его свистки и резонирует. В нашем случае это может быть наоборот – это то, что диафрагма является правильным размером для волн давления.

Так что, возможно, мы можем получить что-то о форме камеры магмы? Если камера представляет собой определенную длину или широту, она будет резонировать при определенной частоте, связанной с ее длиной волны.

Мы знаем, что частота F и мы хотим длина волны лямбда . Последнее, что нам нужно знать, – это скорость звука через магму – и хотя это различное число, для задней части расчета конверта, скажем, 5 км в секунду.

Давайте сделаем математику:

Итак, чтобы повернуть его, мы можем оценить, что некоторое измерение камеры или вентиляционного отверстия или трубы, которое было разрушением, было около 131 метров в размере – все от аудиоклипа!

Для тех из вас, кто хочет играть на дому, вы можете найти данные здесь и ноутбук здесь

Оригинал: “https://dev.to/rstrange/visualising-volcanoseismic-events-an-exercise-in-signal-processing-5gal”