В этом примере показано, как создать и визуализировать словарь, состоящий из вейвлета Haar, до уровня 2.
[mpdict,~,~,longs] = wmpdictionary(100,'lstcpt',{{'haar',2}});
Используйте longs
выходной аргумент для деления вейвлет-словаря на уровень и тип функции (масштабирование или вейвлет). Пройдите график переведенных функций масштабирования и вейвлетов по уровням.
for nn = 1:size(mpdict,2) if (nn <= longs{1}(1)) plot(mpdict(:,nn),'k','linewidth',2) grid on xlabel('Translation') title('Haar Scaling Function - Level 2') elseif (nn>longs{1}(1) && nn<= longs{1}(1)+longs{1}(2)) plot(mpdict(:,nn),'r','linewidth',2) grid on xlabel('Translation') title('Haar Wavelet - Level 2') else plot(mpdict(:,nn),'b','linewidth',2) grid on xlabel('Translation') title('Haar Wavelet - Level 1') end pause(0.2) end
Эта анимация бесконечно петлет через все сгенерированные графики.
Этот пример показывает, как выполнить ортогональное совпадение для входного сигнала 1-D, который содержит cusp.
Загрузите сигнал cuspamax. Создайте словарь, состоящий из наименее асимметричных вейвлет-пакетов Daubechies на уровне 4, вейвлетов экстремальной фазы Daubechies на уровне 2, базиса DCT-II, основа sin и сдвинутого базиса дельты Кронекера.
load cuspamax; dict = {{'wpsym4',1},{'db4',2},'dct','sin','RnIdent'}; mpdict = wmpdictionary(length(cuspamax),'lstcpt',dict);
Используйте ортогональное совпадение для получения приближения сигнала в словаре overcomplete, mpdict, с 25 итерациями. Постройте график результата как фильм, обновляя каждые 5 итераций.
[yfit,r,coeff,iopt,qual] = wmpalg('OMP',cuspamax,mpdict,'typeplot',... 'movie','stepplot',5);
Этот пример показывает, как сравнить совпадающее преследование с нелинейным приближением в дискретном базисе преобразования Фурье. Данные представляют собой данные о потреблении электроэнергии, собранные за 24 часа. Пример демонстрирует, что, выбирая атомы из словаря, совпадающее преследование часто способно аппроксимировать вектор более эффективно с M векторами, чем любой отдельный базис.
Соответствие преследованию с использованием словарей DCT, Sine и Wavelet
Загрузите набор данных и постройте график данных. Набор данных содержит 35 дней потребления электроэнергии. Выберите день 32 для последующего анализа. Данные центрированы и масштабированы, поэтому фактические модули использования не релевантны.
load elec35_nor x = signals(32,:); plot(x) xlabel('Minutes') ylabel('Usage')
Данные по потреблению электроэнергии содержат плавные колебания, пунктуированные резкими увеличениями и уменьшением использования.
Изменение масштаба интервала времени от 500 минут до 1200 минут.
xlim([500 1200])
Вы можете увидеть резкие изменения в медленно изменяющемся сигнале примерно на 650, 760 и 1120 минутах. Во многих реальных сигналах, подобных этим данным, интересная и важная информация содержится в переходных процессах. Важно смоделировать эти переходные явления.
Создайте приближение сигнала, используя 35 векторов, выбранных из словаря с ортогональным поиском соответствия (OMP). Словарь состоит из вейвлет экстремальной фазы Daubechies и векторов масштабирования на уровне 2, базиса дискретного косметического преобразования (DCT), синусоидального базиса, базиса дельты Кронекера и наименее асимметричного фазового вейвлета Daubechies и векторов масштабирования с 4 моментами исчезновения на уровнях 1 и 4. Затем используйте OMP, чтобы найти лучшее 35-терминовое жадное приближение данных электрического потребления. Постройте график результата.
dictionary = {{'db1',2},{'db1',3},'dct','sin','RnIdent',{'sym4',4}}; [mpdict,nbvect] = wmpdictionary(length(x),'lstcpt',dictionary); [y,~,~,iopt] = wmpalg('OMP',x,mpdict); plot(x) hold on plot(y) hold off xlabel('Minutes') ylabel('Usage') legend('Original Signal','OMP')
Вы можете увидеть, что с 35 коэффициентами ортогональное совпадение преследования аппроксимирует как плавно колеблющуюся часть сигнала, так и резкие изменения в потреблении электроэнергии.
Определите, сколько векторов алгоритм OMP выбрал из каждого из подсловарей.
basez = cumsum(nbvect); k = 1; for nn = 1:length(basez) if (nn == 1) basezind{nn} = 1:basez(nn); else basezind{nn} = basez(nn-1)+1:basez(nn); end end dictvectors = cellfun(@(x)intersect(iopt,x),basezind, ... 'UniformOutput',false);
Большинство (60%) векторов происходит из базиса DCT и синуса. Учитывая общий медленно изменяющийся характер данных о потреблении электроэнергии, это ожидаемое поведение. Дополнительные 14 векторов из вейвлета подсловарей захватывают резкие изменения сигнала. Количество векторов каждого типа:
3 вектора уровня 2 Daubechies вейвлет (db4)
16 Дискретных векторов косинусоидального преобразования
5 векторов синуса
2 Daubechies наименее-асимметричные векторы вейвлет (sym4) уровня 1
9 Daubechies наименее асимметричных векторов вейвлет (sym4) уровня 4
Соответствие преследования с использованием DCT и словаря синуса по сравнению с полным словарем
Повторите OMP только с подсловарями DCT и sine. Установите OMP, чтобы выбрать 35 лучших векторов из словаря DCT-sine. Создайте словарь и выполните OMP. Сравните OMP со словарем DCT-sine с OMP с дополнительными вейвлетами подсловарями. Заметьте, что добавление вейвлета подсловарей показывает резкие изменения в потреблении электроэнергии более точно. Преимущество включения вейвлета основ особенно очевидно в аппроксимацию восходящих и нисходящих шипов при использовании приблизительно на 650 и 1120 минутах.
dictionary2 = {'dct','sin'}; [mpdict2,nbvect2] = wmpdictionary(length(x),'lstcpt',dictionary2); y2 = wmpalg('OMP',x,mpdict2,'itermax',35); plot(x) hold on plot(y2,'linewidth',2) hold off title('DCT and Sine Dictionary') xlabel('Minutes') ylabel('Usage') xlim([500 1200])
figure plot(x) hold on plot(y,'linewidth',2) hold off title('Full Dictionary') xlabel('Minutes') ylabel('Usage') xlim([500 1200])
Получите лучшее 35-терминовое нелинейное приближение сигнала в дискретном базисе Фурье. Получите ДПФ данных, отсортируйте коэффициенты ДПФ и выберите 35 самых больших коэффициентов. ДПФ реального сигнала сопряжена симметрично, поэтому учитывайте только частоты от 0 (DC) до Nyquist (1/2 цикла/минуту).
xdft = fft(x);
[~,I] = sort(xdft(1:length(x)/2+1),'descend');
ind = I(1:35);
Исследуйте векторную ind
. Ни один из индексов не соответствует 0 или Nyquist. Добавьте соответствующий комплексный сопряженный, чтобы получить нелинейное приближение в базисе ДПФ. Постройте график приближения и исходного сигнала.
indconj = length(xdft)-ind+2; ind = [ind indconj]; xdftapp = zeros(size(xdft)); xdftapp(ind) = xdft(ind); xrec = ifft(xdftapp); plot(x) hold on plot(xrec,'LineWidth',2) hold off xlabel('Minutes') ylabel('Usage') legend('Original Signal','Nonlinear DFT Approximation')
Подобно словарю DCT-sine, нелинейное приближение ДПФ хорошо работает при согласовании плавных колебаний в данных о потреблении электроэнергии. Однако нелинейное приближение ДПФ не аппроксимирует резкие изменения точно. Изменение масштаба интервала данных, содержащих резкие изменения в потреблении.
plot(x) hold on plot(xrec,'LineWidth',2) hold off xlabel('Minutes') ylabel('Usage') legend('Original Signal','Nonlinear DFT Approximation') xlim([500 1200])