Подъем набора фильтров

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

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

LS = liftwave('lazy');

Примените поднимающуюся схему к некоторым данным.

x = randn(8,1);
[ALazy,DLazy] = lwt(x,LS);

MATLAB™ индексирует от 1 так ALazy содержит нечетно индексированные выборки x и DLazy содержит даже индексированные выборки. Большинство объяснений подъема принимает, что сигнал запускается с демонстрационного 0, таким образом, ALazy были бы даже индексированные выборки и DLazy нечетно индексированные выборки. Этот пример следует тому последнему соглашению. "Ленивый" вейвлет преобразовывает обработки одна половина сигнала как коэффициенты вейвлета, DLazy, и другая половина как масштабные коэффициенты, ALazy. Это совершенно сопоставимо в контексте подъема, но простое разделение данных делает действительно sparsify или получает любую соответствующую деталь.

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

Шаг предсказания также упоминается как "двойной поднимающийся шаг". В форме уравнения можно записать шаг предсказания как dj(n)=dj-1(n)-P(aj-1) где dj-1(n) коэффициенты вейвлета в более прекрасной шкале и aj-1 некоторое количество масштабных коэффициентов более прекрасной шкалы. P() оператор предсказания.

Добавьте простое (Хаар) двойной поднимающийся шаг, который вычитает ровное (приближение) коэффициент от нечетного (деталь) коэффициент. В этом случае оператор предсказания просто (-1)aj-1(n). Другими словами, это предсказывает нечетные выборки на основе сразу предыдущий даже выборка.

ElemLiftStep = {'d',-1,0};

В вышеупомянутом коде говорится, "создают элементарное двойное (предсказывают) подъем шага с помощью полинома в z с самой высокой степенью z0. Коэффициент-1. Обновите ленивую поднимающуюся схему.

LSN = addlift(LS,ElemLiftStep,'end');

Примените новую поднимающуюся схему к сигналу.

[A,D] = lwt(x,LSN);

Обратите внимание на то, что элементы A идентичны тем в ALazy. Это ожидается, потому что вы не изменили коэффициенты приближения. Если вы смотрите на элементы D, вы видите, что они равны

Dnew = DLazy-ALazy;

Сравните Dnew к D. Вообразите пример, где сигнал был кусочной константой по каждым двум выборкам.

v = [1 -1 1 -1 1 -1];
u = repelem(v,2);

Примените новую поднимающуюся схему к u.

[Au,Du] = lwt(u,LSN);

Вы видите что весь Du нуль. Этот сигнал был сжат, потому что вся информация теперь содержится в 6 выборках вместо 12 выборок. Можно легко восстановить исходный сигнал

urecon = ilwt(Au,Du,LSN);

В вашем предсказании (двойной подъем) шаг, вы предсказали, что смежная нечетная выборка в вашем сигнале имела то же значение как сразу предыдущий даже выборка. Очевидно, это верно только для тривиальных сигналов. Коэффициенты вейвлета получают различие между предсказанием и фактическими значениями (на нечетных выборках). Наконец, используйте шаг обновления, чтобы обновить ровные выборки на основе различий, полученных на шаге предсказания. В этом случае, обновление с помощью следующего aj(n)=aj-1(n)+dj-1(n)/2. Это заменяет каждый даже индексированный коэффициент средним арифметическим четных и нечетных коэффициентов. Шаг обновления также упоминается как основной поднимающийся шаг.

elsprimal = {'p',1/2,0};
LSupdated = addlift(LSN,elsprimal,'end');

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

[A,D] = lwt(x,LSupdated);

Если вы сравниваете A к исходному сигналу, x, вы видите, что среднее значение сигнала получено в коэффициентах приближения.

mean(A)
ans = -0.0131
mean(x)
ans = -0.0131

На самом деле, элементы A легко доступны от x следующим.

n = 1;
for ii = 1:2:numel(x)
    meanz(n) = mean([x(ii) x(ii+1)]);
    n = n+1;
end

Сравните meanz и A. Как всегда, можно инвертировать поднимающуюся схему получить совершенную реконструкцию данных.

xrec = ilwt(A,D,LSupdated);
max(abs(x-xrec))
ans = 2.2204e-16

Распространено добавить шаг нормализации в конце так, чтобы энергия в сигнале (2 норма), сохраняется как сумма энергий в коэффициентах вейвлета и масштабировании. Без этого шага нормализации не сохраняется энергия.

norm(x,2)^2
ans = 11.6150
norm(A,2)^2+norm(D,2)^2
ans = 16.8091

Добавьте необходимый шаг нормализации.

LSscaled = LSupdated;
LSscaled(end,1:2) = {sqrt(2), sqrt(2)/2};
[A,D] = lwt(x,LSscaled);
norm(A,2)^2+norm(D,2)^2
ans = 11.6150

Теперь 2 норма сигнала равна сумме энергий в коэффициентах вейвлета и масштабировании. Поднимающаяся схема, которую вы разработали в этом примере, является схемой подъема Хаара.

Wavelet Toolbox™ поддерживает многих обычно используемые поднимающиеся схемы через liftwave с предопределенным, двойным, основным, и шаги нормализации. Например, можно получить схему подъема Хаара со следующим.

lshaar = liftwave('haar');

Если вы сравниваете lshaar к LSUpdated, вы видите, что наша постепенная поднимающаяся схема совпадает со схемой подъема Хаара. Чтобы видеть, что не все поднимающиеся схемы состоят из одного двойных и основных поднимающихся шагов, исследуйте поднимающуюся схему, которая соответствует 'bior3.1' вейвлету.

lsbior3_1 = liftwave('bior3.1')
lsbior3_1=4×3 cell array
    {'d'     }    {[  0.3333]}    {[       1]}
    {'p'     }    {1x2 double}    {[       0]}
    {'d'     }    {[ -0.4444]}    {[       0]}
    {[0.4714]}    {[  2.1213]}    {0x0 double}

Можно также использовать liftfilt если вы хотите запуститься с ряда биоортогонального (или ортогональный) масштабирование и фильтры вейвлета и "снять" их к другому набору. Например, начните с Хаара, масштабирующегося и снимающего фильтры.

[LoD,HiD,LoR,HiR] = wfilters('haar');

Снимите фильтры Хаара с двумя основными поднимающимися шагами.

twoels(1) = struct('type','p','value',...
laurpoly([0.125 -0.125],0));
twoels(2) = struct('type','p','value',...
laurpoly([0.125 -0.125],1));
[LoDN,HiDN,LoRN,HiRN] = liftfilt(LoD,HiD,LoR,HiR,twoels);

Постройте получившееся масштабирование и функции вейвлета.

[phia,psia,phis,psis,xval] = bswfun(LoDN,HiDN,LoRN,HiRN);
subplot(2,2,1)
plot(xval,phia,'r','linewidth',2);
title('Analysis Scaling Function');
axis tight;
grid on;
subplot(2,2,2)
plot(xval,phis,'linewidth',2);
axis tight;
grid on;
title('Synthesis Scaling Function');
subplot(2,2,3);
plot(xval,psia,'r','linewidth',2);
axis tight;
grid on;
title('Analysis Wavelet');
subplot(2,2,4);
plot(xval,psis,'linewidth',2);
axis tight;
grid on;
title('Synthesis Wavelet');

Если вы строите функции масштабирования анализа и синтеза и вейвлеты для 'bior1.3' вейвлета, вы видите, что подъем вейвлета Хаара как в предыдущем примере по существу обеспечил, 'bior1.3' вейвлет к в изменении входят в систему вейвлет синтеза.

[LoD,HiD,LoR,HiR] = wfilters('bior1.3');
[phia,psia,phis,psis,xval] = bswfun(LoD,HiD,LoR,HiR);