Этот пример показывает, как использовать лифтинг для постепенного изменения свойств идеального банка фильтров реконструкции. Следующий рисунок показывает три канонических шага в подъеме: разделение, предсказание и обновление.
Первый шаг в подъеме - просто разделить сигнал на его 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
. Это совершенно последовательно в контексте подъема, но простое разделение данных действительно рассеивает или захватывает любую соответствующую деталь.
Следующим шагом в схеме подъема является предсказание нечетных выборок на основе четных выборок. Теоретическим базисный для этого является то, что большинство природных сигналов и изображений демонстрируют корреляцию среди соседних выборок. Соответственно, вы можете «предсказать» нечетные-индексированные выборки, используя четные-индексированные выборки. Различие между вашим предсказанием и фактическим значением является «деталь» в данных, пропущенных предиктором. Эта недостающая деталь содержит коэффициенты вейвлета.
В форме уравнения можно записать шаг предсказания как где являются вейвлет в более мелкой шкале и - некоторое количество более мелких масштабных коэффициентов. - оператор предсказания.
Добавьте шаг простого (Haar) предсказания, который вычитает четный (аппроксимация) коэффициент из нечетного (детализация) коэффициента. В этом случае оператор предсказания просто . Другими словами, он предсказывает нечетные выборки на основе непосредственно предшествующей четной выборки.
ElemLiftStep = liftingStep('Type','predict','Coefficients',-1,'MaxOrder',0);
Вышеуказанный код говорит "создать элементарный шаг подъема предсказания с помощью полинома в с высочайшей степенью . Коэффициент -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
На этапе предсказания вы предсказали, что смежная нечетная выборка в вашем сигнале имеет то же значение, что и непосредственно предыдущая четная выборка. Очевидно, что это справедливо только для тривиальных сигналов. Вейвлет захватывают различие между предсказанием и фактическими значениями (на нечетных выборках). Наконец, используйте шаг обновления, чтобы обновить четные выборки на основе различий, полученных на шаге предсказания. В этом случае обновляйте с помощью следующего . Это заменяет каждый четный-индексированный коэффициент на арифметику среднего значения четного и нечетного коэффициентов.
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
Обычно в конце добавить шаг нормализации, чтобы энергия в сигнале ( 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
Теперь норма сигнала равна сумме энергий в масштабирующем и вейвлет коэффициентах. Схема подъема, которую вы разработали в этом примере, является схемой подъема 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