Algorithm for extracting an artificial whistler signal in a spectrogram using the PyCharm integrated application development environment
- 作者: Marchenko L.S.1,2
-
隶属关系:
- Institute of Cosmophysical Research and Radio Wave Propagation FEB RAS
- Scientific Research Geotechnological Centre FEB RAS
- 期: 卷 49, 编号 4 (2024)
- 页面: 99-111
- 栏目: Information and computing technologies
- URL: https://ogarev-online.ru/2079-6641/article/view/278331
- DOI: https://doi.org/10.26117/2079-6641-2024-49-4-99-111
- ID: 278331
如何引用文章
全文:
详细
The paper proposes an algorithm for identifying the trace of an artificial whistling atmospheric signal (whistle) in a spectrogram, implemented in Python in the PyCharm 2024.1 integrated development environment. The algorithm allows you to identify the whistler trace by setting a certain threshold value (filter). The filter takes into account the signal intensity in the spectrum, the standard deviation of values from the mean, and a certain multiplier that allows you to exclude noise and identify only the most significant peaks in the signal. In the algorithm, using a mask based on the filter, it is possible to obtain an array of frequencies for the trace of an artificial whistler. The computer program allows you to save the resulting array in a text file, which can be used for further analysis in various spreadsheet processors, as well as build whistler trace graphs for visual research. The article tested the adequacy of the algorithm using the example of calculating the dispersion coefficient. It was shown that the algorithm gives good results.
关键词
全文:
Введение
В последние десятилетия наблюдение и анализ электромагнитных волн, связанных с природными явлениями, стали важной областью исследований в физике плазмы и геофизике [1, 2]. Одним из наиболее интересных аспектов таких исследований является изучение вистлеров - низкочастотных электромагнитных волн, возникающих в результате грозовых разрядов с последующим взаимодействием с магнитосферой Земли [3-11, 11]. Эти волны играют ключевую роль в динамике плазмы и могут оказывать значительное влияние на радиосигналы и системы связи. Свое название вистлеры (свисты или свистящие атмосферики) получили из-за характерного звука, который они производят при преобразовании в звуковые волны.
Теоретические основы исследования вистлеров более подробно и системно были изложены в фундаментальных работах [12–14]. Дальнейшее исследование вистлеров получило широкое развитие в работах различных ученых, как зарубежных [3–8], так и российских [9–11, 11].
Отметим, что наиболее важными являются задачи исследования источников вистлеров грозовых разрядов [9-11], а также распознавания вистлеров в реальном времени [11]. К сожалению задача распознавания вистлеров в реальном времени до конца не была решена методами машинного обучения в силу сложности идентификации вистлеров по спектрограммам.
В работе Шагимуратова И.А. [15] подробно изложена теория исследования динамических спектров вистлеров, в которой указывается на важность определения следа вистлера, что в свою очередь дает возможность применять многоточечные методы обработки.
В настоящей работе для искусственно смоделированного вистлера [16] был разработан на языке Python в среде PyCharm 2024.1 алгоритм выделения его следа из спектрограммы. Данный алгоритм далее планируется применить для исследования характеристик искусственного вистлера согласно работе [15], а потом его адаптировать для исследования реальных сигналов вистлера, полученных с помощью ОНЧ-пеленгатора ИКИР ДВО РАН
Функциональная модель алгоритма
Интегрированная среда разработки (IDE) PyCharm 2024.1 для языка программирования Python имеет ряд преимуществ по сравнению с другими версиями PyCharm [17]: улучшенная поддержка AI: встроенные инструменты на базе искусственного интеллекта помогают в написании кода, предоставляя автозаполнение, рекомендации и исправления; оптимизированный интерфейс: новый интерфейс стал более интуитивно понятным и удобным, что упрощает навигацию и работу с проектами; расширенные возможности рефакторинга: новые инструменты для рефакторинга позволяют быстро и безопасно изменять структуру кода без риска появления ошибок: поддержка новых технологий: улучшена поддержка последних версий Python и популярных библиотек, таких как Django, Flask и других; инструменты для тестирования: улучшенные функции для написания и запуска тестов, включая поддержку новых фреймворков и расширенные возможности анализа результатов; оптимизация производительности: повышенная скорость работы IDE, улучшенное использование ресурсов системы и уменьшение времени загрузки проектов; поддержка многопоточности: улучшенная работа с асинхронным кодом и многопоточностью, что делает разработку более эффективной.
На рис.1 приведена блок-схема алгоритма выделения следа искусственного вистлера в среде PyCharm 2024.1.
Рис. 1. Блок-схема алгоритма в среде PyCharm.
Figure 1. Block diagram of the algorithm in the PyCharm environment.
Из блок-схемы на рис.1. мы можем выделить следующие этапы алгоритма:
- Построение искусственного вистлера. Этот этап был подробно рассмотрен в работе автора [16].
- Фильтрация искусственного сигнала вистлера. Установка порога для выделения следа искусственного вистлера.
- Проверка работы алгоритма на примере вычисления коэффициента дисперсии.
Построение искусственного вистлера
Мы здесь приведем лишь фрагмент кода на языке Python, более полный код смотрите в работе [16]. Значения параметров искуcственного сигнала возьмем также из работы [16].
# Подключение необходимых библиотек Python
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from tkinter import Tk
from tkinter.filedialog import asksaveasfilename
import pandas as pd
# Параметры модели, [17]
Dis = 100 # Коэффициент дисперсии
f_min = 1000 # Минимальная частота, Гц
f_max = 8000 # Максимальная частота, Гц
t_max = 3 # Максимальное время, с
fs = 50000 # Частота дискретизации, Гц
Описание фильтра для выделения следа искусственного вистлера
В этом пункте мы опишем фильтрацию для выделения следа искусственного сигнала вистлера на рис. 2. Для этой цели установка порога для выделения следа на языке Python имеет вид:
threshold = np.mean(Sxx) + k * np.std(Sxx).
Рис. 2. Искусственный вистлер при D = 100 c1/2 c [16].
Figure 2. Artificial whistler at D = 100 c1/2 c [16].
Здесь мы устанавливаем пороговое значение (threshold), которое будет использоваться для выделения значимых участков в спектрограмме; np.mean(Sxx) вычисляет среднее значение всех элементов в массиве Sxx, который представляет собой спектрограмму и показывает, какова типичная интенсивность сигнала в спектре; np.std(Sxx) вычисляет стандартное отклонение элементов в Sxx, оно указывает, насколько значения в массиве разбросаны относительно среднего; k * np.std(Sxx) - умножение стандартного отклонения на k позволяет установить порог выше среднего значения, учитывая разброс данных, что помогает исключить шум и выделить только более значимые пики.
Создание маски: mask = Sxx > threshold.
Здесь мы создаем логическую маску (mask), которая будет содержать True для всех точек в Sxx, где интенсивность превышает установленный порог (threshold), и False в противном случае.
Это позволяет нам выделить области в спектрограмме, где интенсивность сигнала значительно выше среднего уровня, что может указывать на наличие интересующих нас вистлеров.
Заметим, что мы выбрали простой пороговый метод. Однако можно использовать более сложный метод пороговой обработки, например, известны такие методы: адаптивный пороговый метод, который зависит от локальных характеристик сигнала; метод Оцу [18] метод используется для нахождения оптимального порога, который минимизирует внутриклассовую дисперсию; краевые методы алгоритмы для нахождения краев сигнала, такие как метод Собеля или Кэнни [19, 20].
Код на языке Python, характеризующий работу фильтра имеет вид:
# 1. Установка порога для выделения следа
threshold = np.mean(Sxx) + 10 * np.std(Sxx) # Простой порог
# 2. Создаем маску
mask = Sxx > threshold
# 3. Получаем индексы, где маска равна True
indices = np.where(mask)
# 4. Сохранение значений частоты и времени в текстовый файл
Tk().withdraw() # Скрыть основное окно
file_path = asksaveasfilename(defaultextension=".txt",
filetypes=[("Text files", "*.txt"), ("All files", "*.*")],
title="Сохранить как")
if file_path: # Проверка, что путь был выбран
# Создаем DataFrame с частотой и временем
data = {
’Частота (Гц)’: f[indices[0]],
’Время (с)’: t_spec[indices[1]]
}
results_df = pd.DataFrame(data)
# Сохраняем в текстовый файл
results_df.to_csv(file_path, sep=’\t’, index=False, header=True)
print(f"Файл сохранен: {file_path}")
else:
print("Сохранение отменено.")
# 5. Построение графика частот свистящего атмосферика
plt.figure(figsize=(12, 6))
plt.scatter(t_spec[indices[1]], f[indices[0]], s=10, color=’blue’,
alpha=0.5) # Используем scatter для отображения точек
plt.title(’Выделенные следа свистящего атмосферика’)
plt.xlabel(’Время (с)’)
plt.ylabel(’Частота (Гц)’)
plt.ylim(f_min, f_max)
plt.grid()
plt.tight_layout()
plt.show()
Вычисление коэффициента дисперсии
След искусственного вистлера на рис. 3 позволяет исследовать его характеристики. Покажем, что след искусственного вистлера найден корректно. Для этого мы найдем коэффициент дисперсии по углу наклона прямой построенной по точкам . Методика расчета коэффициента дисперсии подробно описана в книге [12].
Рис. 3. График следа искусственного вистлера из рис.2.
Figure 3. Graph of the trace of the artificial whistler from Fig. 2.
Код на языке Python для расчета коэффициента дисперсии.
# Создаем дополнительную таблицу с временем t и 1/f^(1/2)
additional_data = {
’Время (с)’: t_spec[indices[1]][valid_indices], # t
’1/f^(1/2)’: 1 / np.sqrt(f[indices[0]][valid_indices]) # 1/f^(1/2)
}
additional_df = pd.DataFrame(additional_data)
# Сохранение дополнительной таблицы в отдельный файл
additional_file_path = asksaveasfilename(defaultextension=".txt",
filetypes=[("Text files", "*.txt"), ("All files", "*.*")],
title="Сохранить дополнительную таблицу как")
if additional_file_path: # Проверка, что путь был выбран
additional_df.to_csv(additional_file_path, sep=’\t’, index=False, header=True)
print(f"Дополнительная таблица сохранена: {additional_file_path}")
# Построение графика для дополнительной таблицы
X = additional_df[’Время (с)’].values.reshape(-1, 1)
y = additional_df[’1/f^(1/2)’].values
# Линейная регрессия
model = LinearRegression()
model.fit(X, y)
# Получаем тангенс угла наклона и свободный член
tangent = model.coef_[0]
intercept = model.intercept_
# Уравнение линейной регрессии
equation = f’y = {tangent:.4f} * t + {intercept:.4f}’
# Вычисление котангенса угла наклона
cotangent = 1 / tangent
# Построение графика
plt.figure(figsize=(10, 6))
plt.scatter(X, y, color=’blue’, label=’Данные’)
plt.plot(X, model.predict(X), color=’red’, label=’Линейная регрессия’)
plt.title(’График зависимости времени от 1/f^(1/2)’)
plt.xlabel(’Время (с)’)
plt.ylabel(’1/f^(1/2)’)
plt.legend()
plt.grid()
# Вывод уравнения на график
plt.text(0.05, 0.95, equation, transform=plt.gca().transAxes,
fontsize=12, verticalalignment=’top’, color=’black’)
plt.tight_layout()
plt.show()
Из рис.4 видно, что угловой коэффициент или тангенс угла наклона равен 0.01, тогда расчетный коэффициент дисперсии c . Отсюда следует, что расчетный коэффициент совпадает с теоретическим коэффициентом .
Рис. 4. Данные, полученные по следу искусственного вистлера (точки) при D=100 c1/2, прямая линия – уравнение линейной регрессии.
Figure 4. Data obtained from the trail of an artificial whistler (points) at D=100 c1/2, the straight line is the linear regression equation.
Из рис.5 видно, что тангенс угла наклона равен , тогда расчетный коэффициент дисперсии c . Отсюда следует, что расчетный коэффициент практически совпадает с теоретическим коэффициентом c .
Рис. 5. Данные полученные по следу искусственного вистлера (точки) при D = 50 c1/2, прямая линия – уравнение линейной регрессии.
Figure 5. Data obtained from the trail of an artificial whistler (points) at D = 50 c1/2, the straight line is the linear regression equation.
Отметим, что коэффициент дисперсии можно рассчитать согласно математической модели, предложенной в статье [16]: , где время существования вистлера, в нашем случае это последнее время в отчете текстового файла, которое генерируется нашей программой, частота соответствующая времени . Тогда мы получаем следующие значения:
Мы видим, что оценки, полученные по математической модели, также дают приемлемый результат
Заключение
В работе предложен алгоритм выделения следа искусственного вистлера из спектрограммы на языке Pytnon в среде PyCharm 2024.1. С помощью фильтрации определяются необходимые частоты и времена, которые им соответствуют и характеризуют след искусственного вистлера. Далее, чтобы проверить адекватность алгоритма, был произведен расчет коэффициента дисперсии по уравнению линейной регрессии. Показано, что алгоритм является адекватным и дает приемлемые результаты.
Отметим, что следующим этапом развития работы является исследование реальных сигналов вистлеров, полученные с помощью ОНЧ-пеленгатора в ИКИР ДВО РАН. Следует подчеркнуть, что природные сигналы являются более сложными, так как помимо вистлеров регистрируются атмосферики. Поэтому необходимо будет корректировать алгоритм на этапе фильтрации с возможным применением машинного обучения и других методов обработки изображений.
Автор выражает благодарность своему научному руководителю д.ф.-м.н. Паровику Р.И. за ценные советы, которые послужили улучшению статьи.
作者简介
Ludmila Marchenko
Institute of Cosmophysical Research and Radio Wave Propagation FEB RAS; Scientific Research Geotechnological Centre FEB RAS
编辑信件的主要联系方式.
Email: marchenko@ikir.ru
ORCID iD: 0000-0003-3634-2443
leading specialist of the scientist Secretariat of the Institute of Cosmophysical Research and Radio Wave Propagation of the Far Eastern Branch of the Russian Academy of Sciences, postgraduate student, Research Geotechnological Center of the Far Eastern Branch of the Russian Academy of Sciences
俄罗斯联邦, 684034, Paratunka, 7 Mirnaya street; 683002, Petropavlovsk-Kamchatsky, 30 Severo-Vostochnoye highway参考
- Artekha S. N., Belyan A. V. On the role of electromagnetic phenomena in some atmospheric processes. Nonlinear Processes in Geophysics. 2013. vol. 20. no. 3. P. 293-304. doi: 10.5194/npg-20-293-2013.
- Mahmood N., Edminister J.A. Schaum’s Outline of Electromagnetics. 5th ed. New York: McGraw Hill. 2019.
- Lichtenberger J., Ferencz C., Bodn’ar L. et al. Automatic whistler detector and analyzer system: Automatic whistler detector. Geophys. Res. 2008. vol. 113.
- Koronczay D., Lichtenberger J., Clilverd M. A. et al. The source regions of whistlers. Journal of Geophysical Research: Space-Physics, 2019. Vol. 124, Pp. 5082–5096.
- Li W., Shen X.-C., Menietti J. D. et al. Global distribution of whistler mode waves in Jovian inner magnetosphere. Geophysical Research Letters. 2020. Vol. 47. No. 15. doi: 10.1029/2020GL088198.
- Morris P.J., Bohdan A., Weidl M. S. et al. Pre-acceleration in the electron foreshock. II. oblique whistler waves. The Astrophysical Journal. 2023. vol. 944. No. 1. Id 13. doi: 10.3847/1538-4357/acaec8.
- Sonwalkar V. S., Reddy A. Specularly reflected whistler: A low-latitude channel to couple lightning energy to the magnetosphere. Science Advances. 2024. Vol. 10. No. 33. eado2657. doi: 10.1126/sciadv.ado2657.
- Xiang T., Liu M., He S., Wang X., Zhou C. Automatic segmentation model and parameter extraction algorithm for lightning whistlers. Radio Science. 2024. vol. 59. no. 11. e2024RS007984. doi: 10.1029/2024RS007984.
- Cherneva N.V., Vodinchar G.M., Sivokon V.P. et al. Correlation analysis of fluxes of whistling atmospherics and lightning discharges Vestnik KRAUNC. Fiziko-Matematiсeskie Nauki. 2013. Vol. 7. No. 2. Pp. 59–67. doi: 10.18454/2079-6641-2013-7-2-59-67. (In Russian)
- Sivokon V.P., Bogdanov V.V., Druzhin G.I. et al. Whistler modulation. Geomagnetizm i Aeronomiya. 2014. vol. 54. no. 6. P. 851–851. doi: 10.7868/S0016794014060182. (In Russian)
- Malush E.A. Algorithm for automatic recognition of whistling atmospherics in real time. Vestnik KRAUNC. Fiziko-Matematiсeskie Nauki. 2015. No. 2(11). P. 82–87. doi: 10.18454/2079-6641-2015-11-2-82-87. (In Russian)
- Malkin E.I., Kazakov E.A., Sannikov D.V. et al. Statistical relationship between whistlers and sprites according to AWDANET and WWLLN. Vestnik KRAUNC. Fiziko-Matematiсeskie Nauki. 2022. Vol. 41. No. 4. P. 178–190. (In Russian)
- Storey L. R. O. An investigation of whistling atmospherics. Philosophical Transactions of the Royal Society of London. Series A, Mathematical and Physical Sciences. 1953. vol. 246. no. 908. P. 113-141.
- Gershman B.N., Korobkov Yu.S. On the theory of propagation of whistling atmospherics. Izvestiya Vuzov. Radiofizika. 1958. Vol. 1. No. 2. Pp. 51–58. (In Russian)
- Gershman B.N., Ugarov V.A. Propagation and generation of low-frequency electromagnetic waves in the upper atmosphere. Uspekhi Fizicheskikh Nauk. 1960. Vol. 72. No. 2. P. 235–271. (In Russian)
- Shagimuratov I. I. Variations of electron concentration in the plasmasphere according to whistling atmospheric data: specialty 01.04.12. Moscow: 1985. 189 p. (In Russian)
- Marchenko L.S., Parovik R.I. Modeling artificial whistlers in Pycharm. News of the Kabardino-Balkarian Scientific Center of RAS. 2024. Vol. 26. No. 5. P. 53–63. doi: 10.35330/1991-6639-2024-26-5-53-63. (In Russian)
- Van Horn, B. M., II; Nguyen, Q. Hands-On Application Development with PyCharm: Build Applications like a Pro with the Ultimate Python Development Tool; Packt Publishing Ltd.: Birmingham, UK, 2023.
- Talab A. M. A. et al. Detection crack in image using Otsu method and multiple filtering in image processing techniques. Optik. 2016. vol. 127. no. 3. P. 1030-1033.
- Mathur N., Mathur S., Mathur D. A novel approach to improve sobel edge detector. Procedia Computer Science. 2016. vol. 93. P. 431-438.
- Yan X., Li Y. A method of lane edge detection based on Canny algorithm. IEEE. 2017. P. 2120-2124.
补充文件
