Вейвлет-преобразование сигналов с построением скалограммы
Вейвлет-преобразование представляет собой мощный инструмент анализа сигналов, который позволяет исследовать временные и частотные характеристики одновременно. Этот метод особенно полезен для обработки нелинейных и непериодических сигналов, таких как биологические данные, финансовые ряды и акустические сигналы. Одним из наиболее популярных приложений вейвлет-анализа является построение скалограмм, которые представляют собой двумерные графики, показывающие распределение энергии сигнала по времени и частоте.
Например, рассмотрим задачу анализа композитного сигнала, состоящего из двух косинусоидальных компонентов и случайного шума. Объявление сигнала выполним в Engee а результирующий анализ также проведём на MATLAB, чтобы сравнить возможности этих двух сред.
Pkg.add(["ContinuousWavelets", "Wavelets"])
fs = 1000 # Частота дискретизации
t = 0:1/fs:1-1/fs # Вектор времени
signal = cos.(2π*50*t) .+ cos.(2π*120*t) .+ randn(length(t)) # Композитный сигнал с шумом
plot(t, signal)
Для реализации такого анализа в Engee нам понадобятся следующие библиотеки:
- ContinuousWavelets
- Wavelets
- FFTW
Pkg.add("Wavelets")
Pkg.add("ContinuousWavelets")
using ContinuousWavelets, Wavelets, FFTW
Разберём детально код, описанный ниже.
wavelet — это функция, которая создает объект волнового преобразователя. В нашем случае она принимает три аргумента:
- Morlet(π) — волновая функция Морле с параметром π. Функция Морле широко применяется в анализе сигналов благодаря своей способности эффективно выделять особенности сигнала на разных масштабах.
- averagingType=NoAve() — определяет тип усреднения. Здесь выбрано отсутствие усреднения. Это означает, что каждая точка в результирующем массиве будет соответствовать значению волнового коэффициента без дополнительного сглаживания.
- β=2 — параметр, определяющий ширину окна функции Морле. Чем выше значение β, тем более узкое окно и тем точнее локализация сигнала во временной области, но хуже разрешение в частотной области.
cwt — эта функция выполняет непрерывное волновое преобразование (CWT) исходного сигнала с использованием созданного волнового преобразователя.
c = wavelet(Morlet(π), averagingType=NoAve(), β=2)
res = cwt(signal, c)
heatmap(abs.(res)', xlabel= "time",ylabel="frequency")
Теперь построим то же самое в MATLAB. В данном случае cwt отличается по синтаксису и вычисляет коэффициенты волнового преобразования для входного сигнала и числа масштабов. Также важно уточнить, что большее количество масштабов обеспечивает более детальный анализ, но требует больше вычислительных ресурсов.
using MATLAB
mat"""
cwt($(signal),200);
saveas(gcf, 'Wavelet.jpg'); % Сохраняет текущую фигуру как JPG
"""
load( "$(@__DIR__)/Wavelet.jpg" )
Вывод
Графики показали, что результаты идентичны в обеих средах.