Непрерывное вейвлет-преобразование с помощью Scipy.signal (Python): что такое параметр "widths" в функции cwt()? (Время-частота)
Я пытаюсь нарисовать частотно-временной сигнал с дискретным временным сигналом (шаг выборки = 0,001 с). Я использую Python и библиотеку Scipy.signal. Я использую функцию cwt(data, wavelet, widths), которая возвращает матрицу, для выполнения непрерывного вейвлет-преобразования со сложным морлет-вейвлетом (или вейвлетом Габора). К сожалению, не так много документации об этом использовании. Лучшее, что я нашел: - это для Matlab (я пытаюсь найти тот же результат масштаба-времени), но у меня, естественно, нет доступа к тем же функциям, - и это объясняет, что такое непрерывное вейвлет-преобразование, без подробностей о параметрах вейвлета,
Первый шаг: Получить сигнал трансляции масштаба. Сомневаюсь, что я непосредственно связал массив "widths" с массивом возможных различных масштабов. Потому что я не понял, что такое ширина параметра, если это не масштаб. Возможно, вы скажете мне "это ширина вашего текущего вейвлета"! Но даже сейчас я не уверен, как ширина ссылки с масштабом... В документации Morlet на Scipy, похоже, что ссылка может быть: "s: Коэффициент масштабирования, с окном от -s*2*pi до +s*2*pi", поэтому я подумал, что width = 4*pi*scale (width=width of the window). Но когда я рисую вейвлеты, увеличивается масштаб, больше уменьшается визуальная ширина вейвлета...
Моя вторая проблема - найти и нарисовать эквивалент по частоте. В литературе я нахожу эту формулу: Fa = Fc / (s*delta), где Fa - конечная частота, Fc - центральная частота вейвлета в Гц, s шкала и дельта периода выборки. Итак, хорошо для масштаба (если я найду связь с шириной) и дельты (=0,001 сек), но это сложнее с центральной частотой вейвлета. В документации scipy я нахожу, что: "Основная частота этого вейвлета [морлета вейвлет] в Гц задается как f = 2*s*w*r / M, где r - частота дискретизации [s здесь здесь Коэффициент масштабирования, оконный от -s * 2 * пи до + s * 2 * пи. По умолчанию 1; ш ширина; и M длина вейвлета]. Я думаю, что это центральная частота, не так ли?
Спасибо
Вот мой исправленный код для cwt():
def MyCWT(data, wavelet, scales):
output = zeros([len(scales), len(data)], dtype=complex)
for ind, scale in enumerate(scales):
window = scale*4*pi*10#Number of points to define correctly the wavelet
waveletLength = min(window, len(data))#Number of points of the wavelet
wavelet_data = wavelet(waveletLength, s=scale)#Need to precise w parameter???
#To see the wavelets:
plot(wavelet_data)
xlabel('time (10^-3 sec)')
ylabel('amplitude')
title('Morlet Wavelet for scale='+str(scale)+'\nwidth='+str(window))
show()
#Concolution to calculate the current line for the current scale:
z = convolve(data, wavelet_data, mode='same')
i = 0
for complexVal in z:
output[ind][i] = complex(complexVal.real, complexVal.imag)
i+=1
return output
1 ответ
widths
Параметр - это массив размеров ширины, до которого растягивается вейвлет, прежде чем сворачивать вейвлет с данными.
Вы должны выбрать диапазон, начиная со значения, немного меньшего ожидаемой ширины сигнала, до чуть большего. Чем больше значений вы предоставляете, тем медленнее вычисления, но выше разрешение.
Ознакомьтесь с документацией или ссылочной статьей Bioinformatics (2006) 22 (17): 2059-2065. doi: 10.1093 / bioinformatics / btl355 для получения дополнительной информации.