Класс DMatrix (работа с матрицами на C++)
Класс FFT (быстрое преобразование
Фурье на C++)
Класс HHT
Калюжный О.Н.
Метод
эмпирической модовой декомпозиции (EMD) основан на предположении, что любой
сигнал можно разложить на сумму модовых функций (IMF).
В
отличие от анализа Фурье, где разложение производится по базису из
тригонометрических функций с фиксированными частотами и фазами, в данном случае
базис образуют функции более общего вида. Эти функции (модовые
функции, эмпирические моды) определяются следующим образом:
1.
Количество экстремумов и количество пересечений нуля не отличаются более чем на
единицу.
2.
Среднее значение, определяемое по двум огибающим, верхней
и нижней, равно нулю.
То
есть, проще говоря, эмпирическая мода – это функция, колеблющаяся вокруг нуля,
но не обязательно с фиксированной частотой, амплитудой и фазой.
При
исследовании реальных сигналов часто можно столкнуться с ситуацией, при которой
параметры гармоники изменяются со временем, поэтому классический спектр Фурье
не дает полной картины. Разложение на модовые функции
(моды) позволяет получить более полную картину. Метод называется эмпирическим
по той причине, что пока он не имеет четкого математического обоснования; тем
не менее, в последние годы он широко используется на практике.
В двух
словах, метод заключается в разделении сигнала на несколько мод. Первая мода
содержит в себе наиболее высокочастотные колебания, следующая содержит
колебания более низких частот и так далее. Далее к каждой из полученных мод или
к суммам нескольких мод применяется быстрое преобразование Фурье, что позволяет
анализировать определенный участок спектра.
Моды
выделяются из сигнала последовательно с помощью построения огибающих,
отдельно по локальным максимумам и по локальным минимумам сигнала. Огибающие обычно рассчитываются с помощью кубических сплайнов, так
как расчет кубических сплайнов не требует большого количества вычислительных
операций. Расчет коэффициентов кубических сплайнов производится с
помощью решения трехдиагональной системы уравнений методом прогонки.
Для
ознакомления с методом можно прочитать следующие статьи:
1. Давыдов А.В.,
Преобразование Гильберта-Хуанга (здесь –
описание самого метода EMD).
2. Уткин П.С.
Сплайн-интерполяция.
3. Мостовской А.П.
Численные методы и система Mathematica. (Про метод прогонки
см. на стр. 35)
Класс
HHT предназначен
для встраивания в исходный код задач, реализованных на языке C++, в которых необходимо разделить исходный
сигнал на эмпирические моды.
Класс
содержит следующие основные переменные и функции, используемые программистом
при встраивании кода:
Переменные
класса HHT:
n – количество
точек сигнала
*t
–массив абсцисс (время)
*x0
–массив ординат (сигнал)
modesQty – количество мод
*X
– текущий набор значений (в глобальном цикле алгоритма)
**Xm –массивы с наборами значений модовых
функций
*Xloc – текущий набор значений (в локальном цикле алгоритма)
*Xup, *Xdn – огибающие
gorbsStop – критерий останова в
глобальном цикле (по количеству экстремумов)
maxModesQty – критерий останова в
глобальном цикле (по количеству мод)
deltaStop – критерий останова в
локальном цикле (по дробному соотношению)
delta0
– рассчитанное значение для критерия останова в локальном цикле
maxIterationsQty –
критерий останова в локальном цикле (по количеству итераций)
N – количество экстремумов огибающей
*k – индексы экстремумов
*Spline – объект класса SPLINE
Функции
класса HHT:
Global(void) – глобальный цикл алгоритма
Local(void) – локальный цикл алгоритма
gorbsQty(double *xx) –
расчет количества экстремумов
findGorbs(double *xx, int
m) – поиск индексов точек
экстремумов в массиве (и расчет их количества)
HHT(int
nn, double *tt, double *xx0, int
gs, double ds) – конструктор класса. n – количество
точек, *tt
–
массив времени, *xx0 –
массив данных сигнала, gs –
количество экстремумов для критерия останова, ds – значение для критерия
останова по дробному соотношению
~HHT()– деструктор класса
Встраивание класса HHT на конкретном примере
Проект hhttest создан в среде Borland Builder 6 и предназначен для
опробования класса HHT:
пользователь может задавать амплитуды и частоты семи гармоник, генерировать
сигнал, рассчитывать моды и отображать каждую из них на экране. Кроме того, с
формы задаются параметры нестабильности гармоник – коэффициенты «дрожания»
амплитуд и фаз гармоники. Кнопкой “Zero” можно
обнулить эти коэффициенты.
Кнопкой “Generate” создается сигнал. Далее,
кнопкой “Calculate”
рассчитываем моды (под кнопкой появляется количество мод, на которые удалось
разложить сигнал). Вводим номер моды (нумерация начинается с 0) и нажимаем “Graph” – мода выводится на экран. Чем меньше
номер моды, тем более высокочастотные составляющие сигнала в ней спрятаны.
Для просмотра отдельных участков графика можно
их увеличить или подвинуть. Увеличение: нажимаем и держим левую кнопку мыши,
тянем сверху вниз и слева направо, отпускаем кнопку. Восстановление масштаба:
наоборот (снизу вверх и справа налево). Подвинуть график можно правой кнопкой мыши.
Исходный код проекта состоит из 3-х unit’ов:
main –
пользовательский интерфейс; здесь производится ввод параметров, создание
сигнала, создание объекта hht класса HHT и работа с ним;
hht – здесь находится класс HHT;
spline
–
здесь находится класс SPLINE,
предназначенный для вычисления огибающих в виде кубических сплайнов.
Применение метода EMD
Метод
эмпирической модовой декомпозиции предназначен для
разделения сигнала на части (моды), каждая из которых содержит свой диапазон
частот сигнала. После такого разделения, применив преобразование Фурье к одной
из мод, мы можем построить ее спектр (или АЧХ). Также имеет смысл строить спектр суммы нескольких соседних мод, так как в
соседних модах может содержаться информация об одной и той же гармонике.
А
теперь – немного о том, как метод EMD
помог
конкретно мне.
Однажды
у меня было несколько разных датчиков вибрации. Некоторые из них обладали
дефектом: кабель между датчиком и усилителем был некачественный, на испытаниях
возникал «кабельный эффект», что проявлялось в наводках на низких частотах
(< 500 Гц), из-за чего на этом участке спектра невозможно было увидеть
реальные гармоники.
В
этом случае после разделения сигнала на моды выяснялось, что почти все моды не
содержат почти никаких частот сигнала, то есть для того, чтобы получить на
спектре хоть какие-то реальные частоты, даже низкие, надо строить спектр по
одной-двум самым высокочастотным модам. В случае же хорошей аппаратуры высокие
частоты «живут» только в первых модах, средние – в средних,
а низкие – в последних.
Поэтому
для определения качества аппаратуры я применял следующую методику.
Предположим,
сигнал разложился на 8 мод. Строим спектр только по самой низкочастотной моде
(моде с индексом 7). Видим графике только очень низкие частоты. Следующим шагом
складываем моды № 6 и 7, строим спектр. Затем смотрим спектр суммы 5, 6 и 7-й
мод, и так далее.
В
случае испорченного сигнала картинка почти не будет меняться, мы все время
будем видеть только низкочастотную кабельную наводку. И только после добавления
1-й и 0-й мод мы увидим пики средних и высоких частот. В случае же исправной
аппаратуры картинка меняется плавно, диапазон частот постепенно расширяется
вправо.