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

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

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

LS = liftingScheme;

Используйте схему подъема, чтобы получить вейвлет уровня 1 случайного сигнала.

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

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

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

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

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

ElemLiftStep = liftingStep('Type','predict','Coefficients',-1,'MaxOrder',0);

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

LSN = addlift(LS,ElemLiftStep);

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

[A,D] = lwt(x,'LiftingScheme',LSN,'Level',1);

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

[A ALazy]
ans = 4×2

    0.5377    0.5377
   -2.2588   -2.2588
    0.3188    0.3188
   -0.4336   -0.4336

Если вы посмотрите на элементы D{1}Вы видите, что они равны DLazy{1}-ALazy.

Dnew = DLazy{1}-ALazy;
[Dnew D{1}]
ans = 4×2

    1.2962    1.2962
    3.1210    3.1210
   -1.6265   -1.6265
    0.7762    0.7762

Сравнение Dnew на D. Представьте пример, где сигнал был кусочно-постоянным на каждые две выборки.

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

     1     1    -1    -1     1     1    -1    -1     1     1    -1    -1

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

[Au,Du] = lwt(u,'LiftingScheme',LSN,'Level',1);
Du{1}
ans = 6×1

     0
     0
     0
     0
     0
     0

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

urecon = ilwt(Au,Du,'LiftingScheme',LSN);
max(abs(u(:)-urecon(:)))
ans = 0

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

elsUpdate = liftingStep('Type','update','Coefficients',1/2,'MaxOrder',0);
LSupdated = addlift(LSN,elsUpdate);

Получите вейвлет сигнала с обновленной схемой подъема.

[A,D] = lwt(x,'LiftingScheme',LSupdated,'Level',1);

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

[mean(A) mean(x)]
ans = 1×2

   -0.0131   -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,'LiftingScheme',LSupdated);
max(abs(x-xrec))
ans = 2.2204e-16

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

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

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

LSsteps = LSupdated.LiftingSteps;
LSscaled = liftingScheme('LiftingSteps',LSsteps,'NormalizationFactors',[sqrt(2)]);
[A,D] = lwt(x,'LiftingScheme',LSscaled,'Level',1);
norm(A,2)^2+norm(D{1},2)^2
ans = 11.6150

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

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

lshaar = liftingScheme('Wavelet','haar');

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

lsbior3_1 = liftingScheme('Wavelet','bior3.1')
lsbior3_1 = 
 	 Wavelet              : 'bior3.1' 
 	 LiftingSteps         : [3 × 1] liftingStep 
 	 NormalizationFactors : [2.1213 0.4714] 
 	 CustomLowpassFilter  : [] 


 Details of LiftingSteps :
            Type: 'update'
    Coefficients: -0.3333
        MaxOrder: -1

            Type: 'predict'
    Coefficients: [-0.3750 -1.1250]
        MaxOrder: 1

            Type: 'update'
    Coefficients: 0.4444
        MaxOrder: 0