Введение
Английское слово wavelet (от французского «ondelette») дословно переводится как «короткая (маленькая) волна». В различных переводах зарубежных статей на русский язык встречаются еще термины: «всплеск», «всплесковая функция», «маловолновая функция», «волночка» и др.
Вейвлет-преобразование (ВП) широко используется для анализа сигналов. Помимо этого, оно находит большое применение в области сжатия данных. ВП одномерного сигнала – это его представление ввиде обобщенного ряда или интеграла Фурье по системе базисных функций.
сконструированных из материнского (исходного) вейвлета
Множитель
В качестве примера приведём вейвлет «мексиканская шляпа» во временной и частотной областях:
Листинг вейвлета для временной области
from numpy import*
import matplotlib.pyplot as plt
x= arange(-4,30,0.01)
def w(a,b,t):
f =(1/a**0.5)*exp(-0.5*((t-b)/a)**2)* (((t-b)/a)**2-1)
return f
plt.title("Вейвлет «Мексиканская шляпа»:\n$1/\sqrt{a}*exp(-0,5*t^{2}/a^{2})*(t^{2}-1)$")
y=[w(1,12,t) for t in x]
plt.plot(x,y,label="$\psi(t)$ a=1,b=12")
y=[w(2,12,t) for t in x]
plt.plot(x,y,label="$\psi_{ab}(t)$ a=2 b=12")
y=[w(4,12,t) for t in x]
plt.plot(x,y,label="$\psi_{ab}(t)$ a=4 b=12")
plt.legend(loc='best')
plt.grid(True)
plt.show()

Листинг для спектра вейвлета
from numpy import*
from pylab import *
from scipy import *
import os
def w(a,b,t):
f =(1/a**0.5)*exp(-0.5*((t-b)/a)**2)* (((t-b)/a)**2-1)
return f
x= arange(-4,30,0.2)
def plotSpectrum(y,Fs):
n = len(y)
k = arange(n)
T = n/Fs
frq = k/T
frq = frq[range(int(n/2))]
Y = fft(y)/n
Y = Y[range(int(n/2))]
return Y,frq
xlabel('f (Hz)')
ylabel('|Y(f)|')
Fs=1024.0
y=[w(1,12,t) for t in x]
Y,frq=plotSpectrum(y,Fs)
plot(frq,abs(Y),label="$\psi(\omega)$ a=1,b=12")
y=[w(2,12,t) for t in x]
Y,frq=plotSpectrum(y,Fs)
plot(frq,abs(Y),label="$\psi_{ab}(\omega)$ a=2 b=12")
y=[w(4,12,t) for t in x]
Y,frq=plotSpectrum(y,Fs)
plot(frq,abs(Y),label="$\psi_{ab}(\omega)$ a=4 b=12")
plt.title("Вейвлет «Мексиканская шляпа» частотная область $\omega$")
legend(loc='best')
grid(True)
show()

Вывод:
1.Между концепцией гармоник Фурье и масштабом вейвлета действительно существует взаимосвязь. Главное в этой взаимосвязи — обратная пропорциональность собственной частоты и масштаба. Кроме этого, уменьшая масштаб, мы увеличиваем полосу пропускания спектра вейвлета.
2. За счет изменения масштаба (увеличение a приводит к сужению фурье-спектра функции
3. Приведенные листинги, написанные на свободно распространяемом языке высокого уровня Python позволяют подбирать функции для вейвлетов, отвечающие заданным требованиям. Однако, при этом дополнительно необходимо учесть все главные признаки вейвлетов.
Главные признаки вейвлета
Ограниченность. Квадрат нормы функции должен быть конечным:
Локализация. ВП в отличие от преобразования Фурье использует локализованную исходную функцию и во времени, и по частоте. Для этого достаточно, чтобы выполнялись условия:
Например, дельта-функция
Нулевое среднее. График исходной функции должен осциллировать (быть знакопеременным) вокруг нуля на оси времени и иметь нулевую площадь:
Из этого условия становится понятным выбор названия «вейвлет» – маленькая волна.
Равенство нулю площади функции
Часто для приложений бывает необходимо, чтобы не только нулевой, но и все первые n моментов были равны нулю:
Вейвлеты n -го порядка позволяют анализировать более тонкую (высокочастотную) структуру сигнала, подавляя медленно изменяющиеся его составляющие.
Автомодельность. Характерным признаком ВП является его самоподобие. Все вейвлеты конкретного семейства
Непрерывное вейвлет-преобразование
Непрерывное (интегральное) вейвлет-преобразование (НВП или СWT – continuous wavelet transform). Сконструируем базис
Тогда, по определению прямое (анализ) и обратное (синтез) HВП (т.е. ПНВП и ОНВП) сигнала S(t) запишутся так:
где
где: (•,•) – скалярное произведение соответствующих сомножителей,
Из (6) следует, что вейвлет-спектр
Следует отметить, что
Если исследуемый сигнал S(t) представляет собой одиночный импульс длительностью
Способы представления (визуализации)
Кроме того, изображают картины линий локальных экстремумов этих поверхностей, так называемый скелетон (sceleton), который выявляет структуру анализируемого сигнала.
Непрерывное вейвлет преобразование при определении вейвлет спектра на основе материнского вейвлета -«мексиканская шляпа».
Применяются и другие материнские вейвлеты используемые для НВП:

Непрерывное ВП нашло широкое применение в обработке сигналов. В частности, вейвлет-анализ (ВА) дает уникальные возможности распознавать локальные и «тонкие» особенности сигналов (функций), что важно во многих областях радиотехники, связи, радиоэлектроники, геофизики и других отраслях науки и техники. Рассмотрим эту возможность на некоторых простейших примерах.
Гармоническое колебание.
Сигнал имеет вид:
где:
Вейвлетобразующая функция:
Вейвлеты:
Вейвлет-спектр: N:=256, a:=1..30, b:=0..50,
Листинг программы
from scipy.integrate import quad
from numpy import*
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
N=256
T=50
def S(t):
return sin(2*pi*t/T)
plt.figure()
plt.title(' Гармоническое колебание', size=12)
y=[S(t) for t in arange(0,100,1)]
x=[t for t in arange(0,100,1)]
plt.plot(x,y)
plt.grid()
def w(a,b):
f = lambda t :(1/a**0.5)*exp(-0.5*((t-b)/a)**2)* (((t-b)/a)**2-1)*S(t)
r= quad(f, -N, N)
return round(r[0],3)
x = arange(1,50,1)
y = arange(1,50,1)
z = array([w(i,j) for j in y for i in x])
X, Y = meshgrid(x, y)
Z = z.reshape(49,49)
fig = plt.figure("Вейвлет- спектр: гармонического колебания")
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet)
ax.set_xlabel(' Масштаб:a')
ax.set_ylabel('Задержка: b')
ax.set_zlabel('Амплитуда ВП: $ N_{ab}$')
plt.figure("2D-график для z = w (a,b)")
plt.title('Плоскость ab с цветовыми областями ВП', size=12)
plt.contourf(X, Y, Z,100)
plt.show()

График сигнала.

График двухпараметрического спектра

Следует отметить, что сечение W(a,b) для временного масштаба
Сумма двух гармонических колебаний.
Сигнал имеет вид :
где:
Листинг программы
from scipy.integrate import quad
from numpy import*
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
N=256
def S(t):
return sin(2*pi*t/10)+sin(2*pi*t/50)
plt.figure(' Сумма двух гармонических колебаний')
plt.title(' Сумма двух гармонических колебаний', size=12)
y=[S(t) for t in arange(0,250,1)]
x=[t for t in arange(0,250,1)]
plt.plot(x,y)
plt.grid()
def w(a,b):
f = lambda t :(1/a**0.5)*exp(-0.5*((t-b)/a)**2)* (((t-b)/a)**2-1)*S(t)
r= quad(f, -N, N)
return round(r[0],3)
x = arange(1,50,1)
y = arange(1,50,1)
z = array([w(i,j) for j in y for i in x])
X, Y = meshgrid(x, y)
Z = z.reshape(49, 49)
fig = plt.figure("Вейвлет-спектр:2-х гармонических колебаний")
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet)
ax.set_xlabel(' Масштаб:a')
ax.set_ylabel('Задержка: b')
ax.set_zlabel('Амплитуда ВП: $ N_{ab}$')
plt.figure("2D-график для z = w (a,b)")
plt.title('Плоскость ab с цветовыми областями ВП', size=12)
plt.contourf(X, Y, Z, 100)
plt.figure()
q=[w(2,i) for i in y]
p=[i for i in y]
plt.plot(p,q,label='w(2,b)')
q=[w(15,i) for i in y]
plt.plot(p,q,label='w(15,b)')
q=[w(30,i) for i in y]
plt.plot(p,q,label='w(30,b)')
plt.legend(loc='best')
plt.grid(True)
plt.figure()
q=[w(i,13) for i in x]
p=[i for i in x]
plt.plot(p,q,label='w(a,13)')
q=[w(i,17) for i in x]
plt.plot(p,q,label='w(a,17)')
plt.legend(loc='best')
plt.grid(True)
plt.show()

График сигнала.

График двухпараметрического спектра W(a,b) выведен виде поверхности в трехмерном пространстве.

Плоскость параметров a,b на которой результаты ВП выделены цветными областями.

На графике приведены «сечения» вейвлет-спектра для двух значений параметра а. При относительно небольшом параметре временного масштаба a, при
С ростом a происходит растяжение базисной функции
При дальнейшем увеличении a полоса окна еще уменьшается и уровень этого низкочастотного компонента убывает до постоянной составляющей (при a >25), равной нулю для анализируемого сигнала.

На графике приведены сечения вейвлет-спектра W(a,b), характеризующие
текущий спектр сигнала при
Прямоугольный импульс.
Листинг программы
from scipy.integrate import quad
from numpy import*
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
N=256
def S(t):
U=5;t0=20;tau=60
if t0<=t<=t0+tau:
return U
else:
return 0
plt.figure()
plt.title('Прямоугольный импульс', size=12)
y=[S(t) for t in arange(0,120,1)]
x=[t for t in arange(0,120,1)]
plt.plot(x,y)
plt.grid()
def w(a,b):
f = lambda t :(1/a**0.5)*exp(-0.5*((t-b)/a)**2)* (((t-b)/a)**2-1)*S(t)
r= quad(f, -N, N)
return round(r[0],3)
x = arange(1,100,1)
y = arange(1,100,1)
z = array([w(i,j) for j in y for i in x])
X, Y = meshgrid(x, y)
Z = z.reshape(99, 99)
fig = plt.figure("3D-график вейвлет спектрограммы")
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet)
ax.set_xlabel(' Масштаб:a')
ax.set_ylabel('Задержка: b')
ax.set_zlabel('Амплитуда ВП: $ N_{ab}$')
plt.figure("2D-график для z = w (a,b)")
plt.title('Плоскость ab с цветовыми областями ВП', size=12)
plt.contourf(X, Y, Z,100)
plt.show()




Вейвлет-спектры приведены в графиках, вейвлет-спектр хорошо передает тонкие особенности сигнала – его скачки на отсчетах b =20 и b =80 (при a:1..10).
Выводы
Эта публикация носит учебный характер, в ней приведены основные сведения о вейвлет- анализе в целом, а на простых примерах на свободно распространяемом высокоуровневом языке программирования Python показаны особенности непрерывного вейвлет-анализа с обширной графической 3D и 2D визуализацией.
P.S. Автор не умаляет безусловные преимущества вейвлет-анализа с применением Matlab как по количеству вейвлетов, так и по быстродействию. Но на Python есть ещё куда развиваться- это scipy.signal и PyWavelets.