Выберите *лучшую* полосу пропускания для вейвлет-преобразования

Преобразование данных непрерывного сигнала 1-D и создание ряда преобразований для данной полосы пропускания/масштаба. Теперь, как автоматически выбрать наилучшую пропускную способность или масштаб в заданном диапазоне?

Пример: на диаграмме темно-синяя линия — это исходные данные непрерывного одномерного сигнала. Каждая вторая кривая представляет собой преобразование этих данных для диапазона полос пропускания [10, 20, 30, 40, 50]. В этом примере, как автоматически выбрать полосу пропускания, которая лучше всего отражает изменение кривой?

Примечание. Ответы могут быть Python конкретными или очень общими о том, как рассчитать "наилучшую" пропускную способность.

import numpy 
import matplotlib.pyplot as plt
from scipy.signal import ricker, cwt

data         #numpy.ndarray
# data = ([11,  8,  8,  2,  2,  4,  4,  4,  4,  3,  3,  5,  5,  9, 12, 17, 19, 19, 20, 19, 19, 14, 12, 11,  9,  6,  4,  3,  3,  2,  2,  6,  9, 12, 16, 17, 19, 20, 20, 19, 17, 15, 13,  9,  7,  6,  5,  3,  2,  4], dtype=int64)
bandwidths = np.arange(10, 60, 10)
cwt_data = cwt(data, ricker, bandwidths)   #transforms the data
plt.plot(cwt_speed.T, label='Transformed data')
plt.plot(speed, label='original data', linewidth=2)
plt.legend()

введите здесь описание изображения


person Asif Rehan    schedule 02.02.2017    source источник


Ответы (1)


Для этого типа проблемы вы можете использовать метод Уэлча scipy.signal.welch для определения ожидаемой мощности вашей волны, переносимой данной частотой.

введите здесь описание изображения

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

Есть несколько способов использовать этот анализ, чтобы выбрать полосу пропускания для свертки.

Я бы рекомендовал вам посмотреть на PSD и определить локальные максимумы в частотных спектрах, где мощность отклоняется от кривой 1/f. Более низкие частотные диапазоны обычно лучше подходят статистически (если только ваш сигнал не содержит явного закодированного колебательного сигнала), поэтому это повлияет на выбор общего максимума.

Для незакодированных сигналов (нейронные данные, исторические тренды, наблюдаемые данные и т. д.), с которыми, похоже, вы работаете, нас, как правило, больше интересует, где возникают «удары» на кривой, потому что они указывают, на какой частоте колебательные драйверы несут часть сигнала. Таким образом, мы можем представить важную информацию вместо наилучшего соответствия из-за случайности.

person Brendan Frick    schedule 03.02.2017
comment
Благодарность! Не могли бы вы показать свой код для создания графика PSD? Я пытаюсь найти места, где сигнал сглаживается до нуля и остается таким, то есть когда сигнал «мертвый». - person Asif Rehan; 07.02.2017
comment
Я могу найти свой пример (в MATLAB), но, вероятно, было бы проще отказаться от примеров в документации для функции scipy. docs.scipy.org/doc/ scipy-0.14.0/ссылка/генерируется/ - person Brendan Frick; 08.02.2017
comment
Кроме того, я не совсем уверен в достоверности использования преобразований полосы пропускания для поиска «мертвого сигнала». Возможно, вам будет лучше просто посмотреть на производную и вторую производную вашего сигнала и определить временные окна, которые описывают «мертвый период». - person Brendan Frick; 08.02.2017