Вейвлет, рассеивающий шкалу инвариантности и сверхдискретизацию

В этом примере показано, как изменение шкалы инвариантности и сверхдискретизация фактора влияют на выход рассеивания вейвлета, преобразовывают.

Шкала инвариантности

InvarianceScale свойство времени вейвлета, рассеивая сеть устанавливает масштаб времени масштабирующегося (lowpass) фильтр. Создайте сеть рассеивания вейвлета с длиной сигнала 10 000 и шкалой инвариантности 500. Получите набор фильтров.

sigLength = 1e4;
sf = waveletScattering('SignalLength',sigLength,'InvarianceScale',500);
[fb,f] = filterbank(sf);

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

helperPlotScalingWavelet(fb,f,500)

Figure contains an axes object. The axes object contains 5 objects of type line. These objects represent Scaling Function, Wavelet-Real Part, Wavelet-Imaginary Part.

Сгенерируйте случайный сигнал и используйте featureMatrix получить рассеивающуюся матрицу функции для сигнала и рассеивающуюся сеть.

x = randn(1,sigLength);
smat = featureMatrix(sf,x);
whos smat
  Name        Size            Bytes  Class     Attributes

  smat      102x79            64464  double              

Каждая строка матрицы функции является вектором, к которому применили операцию свертки (отфильтрованный) с фильтром lowpass (после другой фильтрации вейвлета). Второе измерение матрицы функции является разрешением времени. Выход фильтрации прорежен как можно больше без искажения, что называется "критически субдискретизацией". Объем субдискретизации зависит от полосы пропускания фильтра. Чем больше шкала инвариантности, тем больше поддержка времени lowpass (масштабирование) функционирует и соответственно больше мы можем проредить.

Получите рассеивающееся преобразование сигнала.

[S,~] = scatteringTransform(sf,x);
S{2}
ans=41×4 table
       signals        path      bandwidth    resolution
    _____________    _______    _________    __________

    {79x1 double}    0     1    0.0084478        -7    
    {79x1 double}    0     2    0.0084478        -7    
    {79x1 double}    0     3    0.0084478        -7    
    {79x1 double}    0     4    0.0084478        -7    
    {79x1 double}    0     5    0.0084478        -7    
    {79x1 double}    0     6    0.0084478        -7    
    {79x1 double}    0     7    0.0084478        -7    
    {79x1 double}    0     8    0.0084478        -7    
    {79x1 double}    0     9    0.0084478        -7    
    {79x1 double}    0    10    0.0084478        -7    
    {79x1 double}    0    11    0.0084478        -7    
    {79x1 double}    0    12    0.0084478        -7    
    {79x1 double}    0    13    0.0084478        -7    
    {79x1 double}    0    14    0.0084478        -7    
    {79x1 double}    0    15    0.0084478        -7    
    {79x1 double}    0    16    0.0084478        -7    
      ⋮

Рассеивающиеся векторы коэффициентов, signals, имейте длину 79, и разрешение-7. Это означает, что мы ожидаем приблизительно 104/27 коэффициенты в каждом векторе.

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

sf = waveletScattering('SignalLength',sigLength,'InvarianceScale',200);
[S,~] = scatteringTransform(sf,x);
S{2}
ans=30×4 table
       signals         path      bandwidth    resolution
    ______________    _______    _________    __________

    {157x1 double}    0     1     0.02112         -6    
    {157x1 double}    0     2     0.02112         -6    
    {157x1 double}    0     3     0.02112         -6    
    {157x1 double}    0     4     0.02112         -6    
    {157x1 double}    0     5     0.02112         -6    
    {157x1 double}    0     6     0.02112         -6    
    {157x1 double}    0     7     0.02112         -6    
    {157x1 double}    0     8     0.02112         -6    
    {157x1 double}    0     9     0.02112         -6    
    {157x1 double}    0    10     0.02112         -6    
    {157x1 double}    0    11     0.02112         -6    
    {157x1 double}    0    12     0.02112         -6    
    {157x1 double}    0    13     0.02112         -6    
    {157x1 double}    0    14     0.02112         -6    
    {157x1 double}    0    15     0.02112         -6    
    {157x1 double}    0    16     0.02112         -6    
      ⋮

Сверхдискретизация фактора

Поскольку шкала инвариантности является таким важным гиперпараметром для рассеивания сетей (один из самых важных для эффективности), необходимо установить значение на основе проблемы под рукой и не потому что вы хотите определенное число коэффициентов. Можно использовать OversamplingFactor свойство для корректировки количества коэффициентов для данного InvarianceScale. OversamplingFactor задает, насколько рассеивающиеся коэффициенты сверхдискретизированы относительно критически прореженных значений. Фактор находится на a log2 шкала.

Создайте рассеивающуюся сеть со шкалой инвариантности 500, и OversamplingFactor равняйтесь 1. Получите рассеивающееся преобразование сигнала. Как ожидалось количество рассеивающихся путей больше в случае где InvarianceScale 200. Установкой OversamplingFactor к 1, рассеивающееся преобразование возвращает в два раза больше коэффициентов для каждого пути к рассеиванию относительно критически произведенного номера. Размер рассеивающихся возвращенных векторов коэффициентов равен размеру, когда рассеивающаяся сеть имеет шкалу инвариантности 200 с критической субдискретизацией по умолчанию.

sf = waveletScattering('SignalLength',sigLength,'InvarianceScale',500,'OversamplingFactor',1);
[S,~] = scatteringTransform(sf,x);
S{2}
ans=41×4 table
       signals         path      bandwidth    resolution
    ______________    _______    _________    __________

    {157x1 double}    0     1    0.0084478        -6    
    {157x1 double}    0     2    0.0084478        -6    
    {157x1 double}    0     3    0.0084478        -6    
    {157x1 double}    0     4    0.0084478        -6    
    {157x1 double}    0     5    0.0084478        -6    
    {157x1 double}    0     6    0.0084478        -6    
    {157x1 double}    0     7    0.0084478        -6    
    {157x1 double}    0     8    0.0084478        -6    
    {157x1 double}    0     9    0.0084478        -6    
    {157x1 double}    0    10    0.0084478        -6    
    {157x1 double}    0    11    0.0084478        -6    
    {157x1 double}    0    12    0.0084478        -6    
    {157x1 double}    0    13    0.0084478        -6    
    {157x1 double}    0    14    0.0084478        -6    
    {157x1 double}    0    15    0.0084478        -6    
    {157x1 double}    0    16    0.0084478        -6    
      ⋮

Приложение

function helperPlotScalingWavelet(fb,f,invScale)
% This function is in support of wavelet scattering examples only. It may
% change or be removed in a future release.
fBin = diff(f(1:2));
time = (-1/2:fBin:1/2-fBin)*1e4;
phi = ifftshift(ifft(fb{1}.phift));
psiL1 = ifftshift(ifft(fb{2}.psift(:,end)));
figure
plot(time,phi,'b','LineWidth',1.5)
grid on
hold on
plot(time,real(psiL1));
plot(time,imag(psiL1));
plot([-invScale/2 -invScale/2],[-6e-3 6.5e-3],'k--')
plot([invScale/2 invScale/2],[-6e-3 6.5e-3],'k--')
ylim([-6e-3 6.5e-3])
xlim([-invScale invScale])
legend('Scaling Function','Wavelet-Real Part','Wavelet-Imaginary Part')
end

Смотрите также

| |