Выбрать главу

Сравнение кривых

До сих пор мы имели дело с отдельными значениями параметров. Ниже будут рассмотрены параметры, представленные в виде кривых. Возникает вопрос, каким образом сравнивать две кривые, чтобы определить их взаимную близость.

Разложение по ортогональному базису

Пусть заданы две кривые, определенные функциями F(t),G(t). Выбираем ортонормированный базис и оставляем заданное число M коэффициентов. В качестве примера такого разложения можно взять преобразование Фурье или дискретное косинус преобразование. Этот подход хорош, когда совпадают области определения обеих функций. Если же они разнятся (имеют разные длины), то для сравнения понадобятся дополнительные манипуляции с коэффициентами.

Квантили

Существует другой подход, основанный на квантилях, свободный от указанного выше недостатка и требующий минимальных вычислений. С этой целью исходные функции нормируются таким образом, чтобы их область значений заполняла интервал [0,1]. После этого выбирается набор квантилей в качестве вектора характеристик функций. Квантили зависят только от области значений, поэтому зависимость от длины интервалов, на которых определены функции, сводится к минимуму.

def getQuant(Wave,Intervs):

'''Standard quaniles normalized by the maximum of wave

'''

Wave = np.float32(Wave)

Wave /= max(Wave)

Quant = np.quantile(Wave,Intervs)

return np.float32(Quant)

Применим квантили для сравнения формы двух тригонометрических кривых

X = np.arange(0,1,0.01)

F = np.sin(2*np.pi*X)

G = np.cos(2*np.pi*X)

Intervs = np.arange(1,5)/5

print(getQuant(F,Intervs))

print(getQuant(G,Inters))

Ответы

[-0.809017 -0.309017 0.309017 0.809017]

[-0.809017 -0.309017 0.309017 0.809017]

Здесь мы имеем полное совпадение квантилей. Если растянуть одну из кривых, то абсолютного совпадения не получится, но квантили примут близкие значение. Очень важное свойство этого подхода — число выданных параметров будет одним и тем же для любой функции.

Кривые, применяемые для описания фрагмента.

Первым примером служит абсолютный спектр, полученный с помощью fft. Эта информация дополняет частоту F0, рассмотренную выше. Кроме параметров, заданных одним значением, важную роль играют характеристики, описывающие динамику сигнала. Этим свойством обладают кривые, вычисляющие, значения, зависящие от времени

Кривая энергии в точке

Согласно теории (Teager), энергия сигнала X в точке n определяется формулой X[n}*X[n]-X[n-1]*X[n+1]. Построенная согласно этой формуле кривая описывает изменение энергии со временем, поэтому служит очень важной характеристикой фрагмента. Используя квантили, получаем сжатое описание этой кривой. Обычно применяют квантили равномерно распределенные по длине так, как это сделано в примере с тригонометрическими функциями.

Огибающая кривая сигнала

Огибающая кривая сигнала Dat строится с помощью функции, зависящей от параметра WinLen. В данном случае выбрано значение 20, но это эмпирическая величина. Визуально огибающая мало зависит от этого параметра, если он берется из интервала [20,50], однако, увеличение WinLen ведет росту времени на вычисление.

WinLen = 20

Beg = 0

End = WinLen

Env1 = []

while End <= len(Dat1):

Fragm = Dat1[Beg: End]

Beg += 1

End += 1

Env1.append(F(Fragm,WinLen))

Куммулятивная сумма

Рассмотренные выше кривые слабо зависят от сдвига сигнала. В противоположность им, функция np.cumsum(Dat) зависит существенно. Вычислив значения этой функции и подсчитав квантили, получим важную характеристику фрагмента.

Эмоциональные фрагменты

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