Этот пример показывает, как создать и визуализировать словарь, состоящий из вейвлета Хаара вниз к уровню 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
Эта анимация бесконечно циклы через все графики сгенерирована.
Этот пример показывает, как выполнить ортогональное преследование соответствия на 1D входном сигнале, который содержит острый выступ.
Загрузите сигнал cuspamax. Создайте словарь, состоящий из Daubechies наименьшее количество асимметричных пакетов вейвлета на уровне 4, Daubechies экстремальные вейвлеты фазы на уровне 2, основании DCT-II, основании sin и переключенном Кронекеровом основании дельты.
load cuspamax; dict = {{'wpsym4',1},{'db4',2},'dct','sin','RnIdent'}; mpdict = wmpdictionary(length(cuspamax),'lstcpt',dict);
Используйте ортогональное преследование соответствия, чтобы получить приближение сигнала в сверхполном словаре, mpdict, с 25 итерациями. Постройте результат как фильм, обновив каждые 5 итераций.
[yfit,r,coeff,iopt,qual] = wmpalg('OMP',cuspamax,mpdict,'typeplot',... 'movie','stepplot',5);
Этот пример показывает, как сравнить соответствие с преследованием с нелинейным приближением в дискретном основании преобразования Фурье. Данные являются данными о потреблении электричества, собранными за 24-часовой период. Пример демонстрирует, что путем выбора атомов из словаря, соответствия с преследованием часто может аппроксимировать вектор более эффективно с векторами M, чем какое-либо одно основание.
Совпадая с преследованием Используя DCT, синус и словари вейвлета
Загрузите набор данных и отобразите данные на графике. Набор данных содержит 35 дней электрического потребления. Выберите день 32 для последующего анализа. Данные сосредотачиваются и масштабируются, таким образом, фактические модули использования не релевантны.
load elec35_nor x = signals(32,:); plot(x) xlabel('Minutes') ylabel('Usage')
Данные о потреблении электричества содержат сглаженные колебания, акцентированные резкими увеличениями и уменьшениями в использовании.
Увеличьте масштаб временного интервала от 500 минут до 1 200 минут.
xlim([500 1200])
Вы видите резкие изменения в медленно переменном сигнале приблизительно в 650, 760, и 1 120 минут. Во многих реальных сигналах как эти данные интересная и важная информация содержится в переходных процессах. Важно смоделировать эти переходные процессы.
Создайте приближение сигнала с помощью 35 векторов, выбранных из словаря с ортогональным преследованием соответствия (OMP). Словарь состоит из Добечи экстремальный вейвлет фазы и масштабирующиеся векторы на уровне 2, основании дискретного косинусного преобразования (DCT), основании синуса, Кронекеровом основании дельты и Добечи наименьшее количество асимметричного вейвлета фазы и масштабирующихся векторов с 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 вейвлета Daubechies (db4) векторы уровня 2
16 векторов Дискретного косинусного преобразования
5 векторов Синуса
2 Daubechies меньше всего - асимметричный вейвлет (sym4) векторы уровня 1
9 Daubechies меньше всего - асимметричный вейвлет (sym4) векторы уровня 4
Соответствие с преследованием Используя DCT и словарь синуса по сравнению с полным словарем
Повторите OMP только с DCT и подсловарями синуса. Установите OMP выбирать 35 лучших векторов из словаря синуса DCT. Создайте словарь и выполните OMP. Сравните OMP со словарем синуса DCT к OMP с дополнительными подсловарями вейвлета. Заметьте, что добавление подсловарей вейвлета показывает резкие изменения в использовании электричества более точно. Преимущество включения основ вейвлета особенно ясно особенно в приближении восходящих и нисходящих скачков в использовании приблизительно в 650 и 1 120 минут.
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) Найквисту (1/2 циклы/минута).
xdft = fft(x);
[~,I] = sort(xdft(1:length(x)/2+1),'descend');
ind = I(1:35);
Исследуйте векторный ind
. Ни один из индексов не соответствует 0 или Найквист. Добавьте соответствующее сопряженное комплексное число, чтобы получить нелинейное приближение в основании ДПФ. Постройте приближение и исходный сигнал.
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 нелинейное приближение ДПФ выполняет хорошо при соответствии со сглаженными колебаниями в данных о потреблении электричества. Однако нелинейное приближение ДПФ не аппроксимирует резкие изменения точно. Увеличьте масштаб интервала данных, содержащих резкие изменения в потреблении.
plot(x) hold on plot(xrec,'LineWidth',2) hold off xlabel('Minutes') ylabel('Usage') legend('Original Signal','Nonlinear DFT Approximation') xlim([500 1200])