Этот пример показывает, как использовать подъем на 1-D сигнале.
Создайте сигнал 1-D, который является кусочно-постоянным по 2 выборкам. Добавить шум сигнала.
x = [1 1 2 2 -3.5 -3.5 4.3 4.3 6 6 -4.5 -4.5 2.2 2.2 -1.5 -1.5];
x = repmat(x,1,64);
rng default
x = x+ 0.1*randn(size(x));
Постройте график сигнала и масштабирование первых 100 выборок, чтобы визуализировать корреляцию в соседних выборках.
plot(x) xlim([0 100]) title('Signal') xlabel('Index') ylabel('Amplitude')
Используйте ленивый вейвлет, чтобы получить четные и нечетные полифазные компоненты сигнала. Постройте график коэффициентов детализации (вейвлет) в D
и заметьте, что это преобразование не декоррелировало сигнал. Вейвлет очень похожи на сигнал.
LS = liftingScheme; [A,D] = lwt(x,'LiftingScheme',LS,'Level',1); plot(D{1}) xlim([0 100]) title('Detail Coefficients') xlabel('Index') ylabel('Amplitude')
Добавьте шаг подъема предсказания, который вычитает четный-индексированный коэффициент из нечетного коэффициента на одну выборку позже, .
ElemLiftStep = liftingStep('Type','predict','Coefficients',-1,'MaxOrder',0); LSnew = addlift(LS,ElemLiftStep);
Поскольку сигнал является кусочно-постоянным для последовательных выборок с аддитивным шумом, новый шаг предсказания должен привести к тому, что коэффициенты вейвлета будут маленькими по абсолютному значению. В этом случае вейвлет действительно декоррелирует данные. Проверьте это, найдя коэффициенты приближения и детализации с новым шагом предсказания.
[A,D] = lwt(x,'liftingScheme',LSnew,'Level',1);
Если вы строите график коэффициентов детализации (вейвлет), вы видите, что вейвлет-коэффициенты больше не напоминают исходный сигнал.
plot(D{1}) xlim([0 100]) title('Detail Coefficients') xlabel('Index') ylabel('Amplitude')
Коэффициенты приближения, A
, предыдущего преобразования составляют четный полифазный компонент сигнала. Поэтому коэффициенты влияют на сглаживание. Используйте шаг подъема обновления, чтобы обновить коэффициенты приближения и уменьшить сглаживание. Шаг обновления заменяет коэффициенты приближения на , что равно среднему значению и . Среднее значение представляет собой lowpass, которая помогает уменьшить сглаживание.
ElemLiftStep = liftingStep('Type','update','Coefficients',1/2,'MaxOrder',0); LSnew = addlift(LSnew,ElemLiftStep);
Используйте новую схему подъема, чтобы получить вейвлет входного сигнала. Коэффициенты приближения напоминают плавную версию исходного сигнала.
[A,D] = lwt(x,'liftingScheme',LSnew,'Level',1); plot(A) xlim([0 100])
Создайте новую схему подъема с такими же шагами подъема, как LSnew
. Применить масштабные коэффициенты для обеспечения идеальной реконструкции. Получите приближение и вейвлет с помощью схемы подъема и восстановите сигнал с помощью ilwt
. Проверьте идеальную реконструкцию.
scaleFactors = [sqrt(2) sqrt(2)/2]; ElemLiftStep1 = liftingStep('Type','predict','Coefficients',-1,'MaxOrder',0); ElemLiftStep2 = liftingStep('Type','update','Coefficients',1/2,'MaxOrder',0); LSscale = liftingScheme('LiftingSteps',[ElemLiftStep1;ElemLiftStep2],'NormalizationFactors',scaleFactors); [A,D] = lwt(x,'liftingScheme',LSscale,'Level',1); xrecon = ilwt(A,D,'liftingScheme',LSscale); max(abs(x(:)-xrecon(:)))
ans = 1.7764e-15
Предыдущий пример разработал вейвлет, который эффективно удалил полином нулевого порядка (константа). Если поведение сигнала лучше представлено полиномом более высокого порядка, можно спроектировать двойной вейвлет с соответствующим количеством моментов исчезновения, чтобы декоррелировать сигнал.
Используйте схему подъема, чтобы спроектировать вейвлет с двумя моментами исчезновения. Двойной вейвлет с двумя моментами исчезновения украшает сигнал с локальным поведением, аппроксимированным полиномом первого порядка. Создайте сигнал, характеризующийся полиномиальным поведением первого порядка с аддитивом шум.
y = [1 0 0 4 0 0 -1 0 0 2 0 0 7 0 0 -4 0 0 1 0 0 -3]; x1 = 1:(21/1024):22-(21/1024); y1 = interp1(1:22,y,x1,'linear'); rng default y1 = y1+0.25*randn(size(y1)); plot(x1,y1) xlim([1 22])
В этом случае вейвлет должны удалить полином первого порядка. Если значение сигналов при нечетном индексе, , хорошо аппроксимируется полиномом первого порядка, подобранным к окружающим значениям выборки, затем должен обеспечить хорошую подгонку для . Другими словами, должен быть средней точкой между и .
Из этого следует, что должен украсить сигнал.
Создайте новую схему подъема с шагом подъема предсказания, который моделирует предшествующее уравнение.
ElemLiftStep = liftingStep('Type','predict','Coefficients',[-1/2 -1/2],'MaxOrder',1); LS = liftingScheme('LiftingSteps',ElemLiftStep,'NormalizationFactors',1);
Используйте схему подъема, чтобы получить коэффициенты приближения и детализации и построить график результата.
[A,D] = lwt(y1,'LiftingScheme',LS,'Level',1); subplot(2,1,1) plot(A) xlim([1 512]) title('Approximation Coefficients') subplot(2,1,2) plot(D{1}) xlim([1 512]) title('Detail Coefficients')
Вы видите, что вейвлет, по-видимому, содержат только шум, в то время как аппроксимационные коэффициенты представляют собой деноизированную версию исходного сигнала. Поскольку в предыдущем преобразовании для коэффициентов приближения используется только четный полифазный компонент, можно уменьшить сглаживание, добавив шаг обновления.
Создайте новую схему подъема, которая состоит из предыдущего шага предсказания и нового шага обновления, который уменьшает сглаживание. Нормализуйте схему подъема, чтобы получить идеальный банк фильтров реконструкции. Получите дискретное вейвлет с новой схемой подъема и постройте график результатов.
scaleFactors = [sqrt(2) sqrt(2)/2]; ElemLiftStep1 = liftingStep('Type','predict','Coefficients',[-1/2 -1/2],'MaxOrder',1); ElemLiftStep2 = liftingStep('Type','update','Coefficients',[1/4 1/4],'MaxOrder',0); LSnew = liftingScheme('LiftingSteps',[ElemLiftStep1;ElemLiftStep2],'NormalizationFactors',scaleFactors); [A,D] = lwt(y1,'liftingScheme',LSnew,'Level',1); subplot(2,1,1) plot(A) xlim([1 512]) title('Approximation Coefficients') subplot(2,1,2) plot(D{1}) xlim([1 512]) title('Detail Coefficients')
Продемонстрировать, что вы разработали идеальный банк фильтров реконструкции.
y2 = ilwt(A,D,'liftingScheme',LSnew);
max(abs(y2(:)-y1(:)))
ans = 1.7764e-15