Документация Engee
Notebook

Вейвлет-преобразование сигналов с построением скалограммы

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

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

In [ ]:
Pkg.add(["ContinuousWavelets", "Wavelets"])
In [ ]:
fs = 1000 # Частота дискретизации
t = 0:1/fs:1-1/fs # Вектор времени  
signal = cos.(2π*50*t) .+ cos.(2π*120*t) .+ randn(length(t))  # Композитный сигнал с шумом
plot(t, signal)
Out[0]:

Для реализации такого анализа в Engee нам понадобятся следующие библиотеки:

  1. ContinuousWavelets
  2. Wavelets
  3. FFTW
In [ ]:
Pkg.add("Wavelets")
Pkg.add("ContinuousWavelets")
using ContinuousWavelets, Wavelets, FFTW

Разберём детально код, описанный ниже.

wavelet — это функция, которая создает объект волнового преобразователя. В нашем случае она принимает три аргумента:

  1. Morlet(π) — волновая функция Морле с параметром π. Функция Морле широко применяется в анализе сигналов благодаря своей способности эффективно выделять особенности сигнала на разных масштабах.
  2. averagingType=NoAve() — определяет тип усреднения. Здесь выбрано отсутствие усреднения. Это означает, что каждая точка в результирующем массиве будет соответствовать значению волнового коэффициента без дополнительного сглаживания.
  3. β=2 — параметр, определяющий ширину окна функции Морле. Чем выше значение β, тем более узкое окно и тем точнее локализация сигнала во временной области, но хуже разрешение в частотной области.

cwt — эта функция выполняет непрерывное волновое преобразование (CWT) исходного сигнала с использованием созданного волнового преобразователя.

In [ ]:
c = wavelet(Morlet(π), averagingType=NoAve(), β=2)
res = cwt(signal, c)
heatmap(abs.(res)', xlabel= "time",ylabel="frequency")
Out[0]:

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

In [ ]:
using MATLAB
mat"""
cwt($(signal),200);
saveas(gcf, 'Wavelet.jpg'); % Сохраняет текущую фигуру как JPG
"""

load( "$(@__DIR__)/Wavelet.jpg" )
Out[0]:
No description has been provided for this image

Вывод

Графики показали, что результаты идентичны в обеих средах.