Спектральный анализ сигналов

Спектральный анализ сигналов

281
ПОДЕЛИТЬСЯ

Не так издавна товарищ Makeman обрисовал, как спектральный анализ может быть разложен какой-то звук сигнала на составляющие нотки. Давайте возьмем чуток в сторону от звука, и представим , что у нас есть некие оцифрованный сигнал, спектральный состав которого мы желаем найти, точно и справедливо.
Под катом лаконичный обзор способа выделения гармоник случайного сигнала с помощью цифрового heterogenerous, и незначительно особым, Фурье магии.
Файл с эталонами оцифрованного сигнала. Понятно, что сигнал представляет собой сумму синусоид с частотами, амплитудами и исходными фазами, и, может быть, белоснежный шум. Итак, что мы имеем.
Что мы будем делать. Внедрение спектрального анализа для определения:

число гармоник в составе сигнала, и для каждого: амплитуда, частота (тут и дальше в контексте число длин волн на длине сигнала), исходная фаза;
наличие/отсутствие белоснежного шума, и раз он доступен, его обычное отклонение (обычное отклонение);
наличие/отсутствие неизменной составляющей сигнала;
все это рисовать в прекрасном PDF отчет с блэкджеком и иллюстрации.

Мы будем решать эту делему в Java.
Так вышло, что для анализа повторяющихся сигналов в инженерной практике обширное применение массивного математического аппарата, именуемых в целом «Фурье-анализ». Давайте коротко разглядим, что это за зверек таковой. Матчасть
Как я уже произнес, структура сигнала известен: это сумма синусоид и некие шумовой составляющей.
Незначительно не в для себя, Фурье магии
Не так издавна, в 19 веке французский математик Жан Батист Жозеф Фурье показал, что неважно какая функция, удовлетворяющая неким условиям (непрерывность во времени, частоты, удовлетворяющих условиям Дирихле) может быть разложена в ряд, который позднее был назван в его честь — в ряд Фурье.
В инженерной практике при разложении повторяющихся функций в ряды Фурье обширно употребляется, к примеру, в задачках теории цепей: синусоидальное входное действие выкладываются на сумму синусоидальных и расчета нужных характеристик цепей, к примеру, способом суперпозиции.
В общем случае ряд будет иметь нескончаемое число членов. Разложение в ряд Фурье дозволяет нам разложить в непрерывную функцию в сумму остальных непрерывных функций. Существует несколько вероятных вариантов для записи коэффициентов ряда Фурье, мы тоже лишь необходимо знать сущность.
В отличие от Фурье, преобразование Фурье разлагает функцию не на дискретных частотах (набор частот Фурье, для которого разложение происходит, вообщем говоря, дискретные) и непрерывные. На практике, раз разглядывать раздельно амплитудного диапазона и фазового диапазона. Давайте взглянем на то, как соотносятся коэффициенты рядов Фурье и итог преобразования Фурье, именуется, на самом деле, диапазон. Предстоящее улучшение подхода является Фурье-интегральное преобразование его имя. Маленькое отступление: в диапазоне Фурье в общем непростая функция, описывающая комплексной амплитуды соответственной гармоники. Преобразование Фурье. То есть, значения диапазона является комплексным числом, чьи модули амплитуд соответственных частотах, и аргументы для соответственных исходных шагах.

Соответствие рядов Фурье и преобразования Фурье на примере амплитудного диапазона. 1. Рис.
Просто созидать, что коэффициенты ряда Фурье являются не наиболее, чем значения преобразования Фурье в дискретные моменты времени.
Что делать, раз у нас нет нескончаемого времени функции, а есть лишь записан в дискретной части? Ответ на этот вопросец дает предстоящее развитие Фурье — дискретное преобразование Фурье (ДПФ). Но преобразование Фурье карты в непрерывном времени, нескончаемого остальных функций, непрерывных В Частота, функция нескончаемого спектра.
Дискретное преобразование Фурье призван решить делему необходимости непрерывности и бесконечности во времени сигнала. На самом деле, мы считаем, что вырезали некие части нескончаемого сигнала, а в остальное время домен мы рассматриваем этот сигнал равен нулю.
Математически это значит, что, исследовав нескончаемой во времени функции f(T), мы умножаем его на оконную функцию W(T), который обращается в нуль везде, не считая увлекательных интервал времени.
Раз «выход» классического Фурье-диапазона является функцией, потом «выход» дискретного преобразования Фурье дискретного диапазона. И также подают на вход дискретного сигнала.
Остальные характеристики преобразования Фурье не изменяется: они могут быть найдены в литературе.
Мы также должны знать о Фурье изображения синусоидального сигнала, который мы попытаемся отыскать в нашем диапазоне. В общем, это пара Дельта-функции, симметричным относительно нулевой частоты в частотной области.

Амплитуда диапазона синусоидального сигнала. 2. Рис.
Потом, раз диапазон начальной функции f(W), и окна Вт(Вт), Спектр работы будет таковой противной операции, как свертку этих 2-ух спектров (Ф*з)(з) (Аксиома свертки). Я уже упоминал, что, вообщем говоря, мы считаем, что исходная функция и некие ее работы с оконной функции.
На практике это значит, что заместо Дельта-функции, в диапазоне мы увидим нечто вроде этого:

3. Рис. Эффекта растекания диапазона.
Основная черта «эффективность» окно функции на уровень боковых лепестков (дБ). И шум, который возникает в итоге растекания диапазона, соответственно, боковые лепестки (англ. Этот эффект также именуется спред спектрум» (англ. спектральный leekage). Для угнетения боковых лепестков использования других, хороших от прямоугольной оконной функции. лепестков). Сводная Таблица уровней боковых лепестков в течение пары используемое окно функции показаны ниже.
Функция окна
На уровень боковых лепестков (дБ)

Окна Дирихле (прямоугольное окно)
-13 дБ

Окно Ханна
-31.5 дБ

Окна Хемминга
-42 дБ
Основная неувязка в чем наша неувязка заключается в том, что боковые лепестки могут маскировать остальные гармоники, лежащие недалеко.

4. Рис. Отдельные диапазоны гармоник.
Видно, что добавление выше спектров, слабее гармоник будет растворяться в посильнее.

Это не есть отлично. Рис. Верно видна лишь одна гармоника. 5.
Комплексной амплитуды диапазона генерируемых в единицах частоты, но ничто не мешает на гармошке и иметь дробной частоты. Недостаточно просто принять нужные данные из комплексной амплитуды. В этом случае комплексная амплитуда просто как в тумане меж 2-ух примыкающих частот, а также точную частоту и остальные характеристики, которые нельзя настроить. Иной вопросец-как точно получить нужные гармоники. Иной подход к борьбе с распространением диапазона вычитается из сигнала гармоники, создавая это самое распространение. То есть, установив амплитуды, частоты и исходные фазы гармоник, можно вычесть его из сигнала, мы также удалить «Дельта-функция», надлежащие ей, и с ее боковых толикой причинил ей.
Для установления четкой частоты и амплитуды комплекса хотимых гармоник, мы будем применять технику, которая обширно употребляется во почти всех отраслях машиностроения занятий — heterogenerous.
Сиим свойством мы и воспользуемся, смещая диапазон нашего сигнала вплоть до гармоника становится еще больше похож на Дельта-функцию (то есть пока некие местные сигнал / шум добивается максимума). Диапазон сигнала будет сдвинута на величину ш на право. Давайте поглядим, что произойдет, раз мы умножим входного сигнала для комплексного гармонического Ехр(я*ш*т). Иллюстрация диапазона меняется в зависимости от частоты гетеродина показана ниже. Тогда мы сможем рассчитать точную частоту подходящей гармоники, как в0 — wгет, и вычесть ее из начального сигнала для угнетения эффекта растекания диапазона.

6. Рис. Вид амплитудного диапазона частоты гетеродина.
Повторяем функцию до тех пор, пока вы режете все гармоники находятся, да и ассортимент не напоминают нам о диапазоне белоснежного шума.
Потом, нужно оценить обычное отклонение белоснежного шума. Здесь никаких хитростей: вы сможете просто применять формулу для вычисления обычного отличия:

Повторите еще раз метод: Что может быть автоматизировано
Пришло время заавтоматизировать выбор гармоник.
Перейдите к шаг 1. 4. 1. Вычесть из сигнала гармоническим с той же частотой, амплитудой и фазой минус частота гетеродина. 5. При необходимости округлить значения амплитуды и фазы. Этот коттедж частота гетеродина, ищем такое значение частоты, при которой будет достигаться наибольшая неких местных сигнал / шум в некой окрестности пика
3. Отыскивает глобальный пик амплитуды диапазона над неким пороговым значением K. 1.1 раз не отыскали, конец
2.
Метод не непростой, и единственный вопросец возникает — Откуда нам взять пороговое значение, выше которого мы будем находить гармоник? Чтоб ответить на этот вопросец, нужно оценить уровень шума до отсечки гармоник.
статистики), где по оси абсцисс будет амплитуда гармоник, а по оси ординат-число гармоник, не превосходящих по амплитуде значение аргумента. Мы построим функцию распределения (привет, мат. Примером этого построены функции:

Функция распределения гармоник. Рис. 7.
На данный момент мы строим функция является плотностью распределения. е. значения конечных разностей от функции распределения. Т.

Плотность функции распределения гармоник. Рис. 8.
Сейчас вы сможете заавтоматизировать. Отклоняться от пика на право на некое расстояние, и мы предполагаем, что абсцисса данной точки оценки уровня шума в нашем диапазоне. Абсциссу максимума функции плотности и амплитуды гармоник, возникающих в диапазоне наибольшее количество раз.

Поглядеть на кусочек кода, обнаружение гармоник в сигнале составобщественного класса arraylist<SynthesizableSignal> detectHarmonics() {
SignalCutter резак = новейший SignalCutter(источник, новейший сигнал(источник));
SynthesizableComplexExponent heterodinParameter = новейший SynthesizableComplexExponent();
heterodinParameter.способов-setproperty(«частота», 0.0);
Сигнал heterodin = новейший сигнал(источник.getLength());
Сигнал heterodinedSignal = новейший сигнал(резец.getCurrentSignal());
Спектрум спектрум = новейший диапазона(heterodinedSignal);
инт гармоники;
пока ((гармонический = диапазона.detectStrongPeak(мин)) != -1) {
раз (резец.getCuttersCount() > 10)
кидайте новейшие runtimeexception является(«не удалось проанализировать сигнал! Попытайтесь иной характеристики.»);
двойной heterodinSelected = 0.0;
двойной signalToNoise = диапазона.getRealAmplitude(гармонических) / диапазона.getAverageAmplitudeIn(гармонический, windowSize);
для (двойной heterodinFrequency = Объединенных + 0.5; heterodinFrequency < (0.5 + heterodinAccuracy); heterodinFrequency += heterodinAccuracy) {
heterodinParameter.способов-setproperty(«частота», heterodinFrequency);
heterodinParameter.synthesizeIn(heterodin);
heterodinedSignal.набор(резец.getCurrentSignal()).умножить(heterodin);
спектрум.пересчета();
двойной newSignalToNoise = диапазона.getRealAmplitude(гармонических) / диапазона.getAverageAmplitudeIn(гармонический, windowSize);
раз (newSignalToNoise > signalToNoise) {
signalToNoise = newSignalToNoise;
heterodinSelected = heterodinFrequency;
}
}
SynthesizableCosine параметр = новейший SynthesizableCosine();
heterodinParameter.способов-setproperty(«частота», heterodinSelected);
heterodinParameter.synthesizeIn(heterodin);
heterodinedSignal.набор(резец.getCurrentSignal()).умножить(heterodin);
спектрум.пересчета();
параметр.способов-setproperty(«амплитуда», ассистент.adaptiveRound(диапазона.getRealAmplitude(гармонических)));
параметр.способов-setproperty(«частота», гармоники — heterodinSelected);
параметр.способов-setproperty(«фаза», ассистент.круглый(диапазона.getPhase(гармоники), 1));
резца.addSignal(параметр);
резца.cutNext();
heterodinedSignal.набор(резец.getCurrentSignal());
спектрум.пересчета();
}
возвращение резца.getSignalsParameters();
}
Гости могут просмотреть начальный код на github. Она была написана за пару вечеров, как подтверждение концепции. Практическая часть
Я не претендую на звание профессионала Java и представляет собой решение может быть сомнительной как с точки зрения производительности и употребления памяти, и в целом философия Java и ООП философии, сколько бы я ни пробовал сделать его лучше.
Единственная сложность заключалась в генерации PDF-отчета на базе анализа результатов: PDFbox не желает работать с кириллицей. Кстати, не желаю и на данный момент.
В проекте употребляется библиотека:
JFreeChart — отображение графиков
PDFBox — создание отчета
JLatexMath — рендер Латекс формулы
В конце концов, оказалось достаточно мощная программа (13.6 МБ), это комфортные ручки задачка.
Можно порезать гармоники вручную либо доверить эту задачку метод.
Спасибо всем за внимание!

Примеры сигналов для анализасигнала 1
Сигнал 2
Сигнал 3
Сигнал 4
Сигнал 5
Сигнал 6
Сигнал 7
Пример отчет, сгенерированный програмкой.
Литература
Сергиенко — Цифровая обработка сигналов habrahabr.ru А. Б.

НЕТ КОММЕНТАРИЕВ

ОСТАВЬТЕ ОТВЕТ

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.