В этом примере показано, как добавить пару ортогонального квадратурного зеркального фильтра (QMF) и биортогональный вейвлет в четверик к Wavelet Toolbox™. В то время как Wavelet Toolbox™ уже содержит многие наиболее широко используемые ортогональные и биортогональные семейства вейвлет, включая экстремальную фазу Daubechies, наименее асимметричную фазу Daubechies, койфлет, фильтры Фейера-Коровкина и биортогональные сплайновые вейвлеты, вы можете легко добавить свои собственные
Этот пример добавляет пару фильтров QMF Бейлкина (18) в тулбокс и показывает, как впоследствии использовать фильтр в дискретном вейвлет. Затем пример демонстрирует, как проверить необходимые и достаточные условия для того, чтобы пара QMF составляла масштабный и вейвлет. После добавления пары QMF в пример добавляется почти ортогональный биортогональный вейвлет, основанный на лаплакийской пирамидной схеме Берта и Адельсона (таблица 8.4 на стр. 283 в [1]).
Во-первых, у вас должен быть какой-то способ получить коэффициенты. В этом случае вот коэффициенты для lowpass (масштабирование) фильтра Бейлкина (18). Вам нужен только допустимый масштабирующий фильтр, wfilters
создает соответствующий вейвлет для вас.
beyl = [9.93057653743539270E-02 4.24215360812961410E-01 6.99825214056600590E-01 4.49718251149468670E-01 -1.10927598348234300E-01 -2.64497231446384820E-01 2.69003088036903200E-02 1.55538731877093800E-01 -1.75207462665296490E-02 -8.85436306229248350E-02 1.96798660443221200E-02 4.29163872741922730E-02 -1.74604086960288290E-02 -1.43658079688526110E-02 1.00404118446319900E-02 1.48423478247234610E-03 -2.73603162625860610E-03 6.40485328521245350E-04];
Сохраните фильтр Бейлкина (18) и добавьте новый фильтр в тулбокс.
save beyl beyl
Использование wavemngr
для добавления вейвлета фильтра к тулбоксу. Задайте имя семейства вейвлет и краткое имя, используемое для доступа к фильтру. Определите тип вейвлета как 1. Вейвлеты типа 1 являются ортогональными вейвлетами в тулбоксе. Поскольку вы добавляете только один вейвлет в это семейство, задайте вход переменной NUMS в wavemngr
быть пустой строкой.
familyName = 'beylkin'; familyShortName = 'beyl'; familyWaveType = 1; familyNums = ''; fileWaveName = 'beyl.mat';
Добавьте вейвлет с помощью wavemngr
.
wavemngr('add',familyName,familyShortName,familyWaveType, ... familyNums,fileWaveName)
Убедитесь, что вейвлет добавлен в тулбокс.
wavemngr('read')
ans = 19x35 char array
'==================================='
'Haar ->->haar '
'Daubechies ->->db '
'Symlets ->->sym '
'Coiflets ->->coif '
'BiorSplines ->->bior '
'ReverseBior ->->rbio '
'Meyer ->->meyr '
'DMeyer ->->dmey '
'Gaussian ->->gaus '
'Mexican_hat ->->mexh '
'Morlet ->->morl '
'Complex Gaussian ->->cgau '
'Shannon ->->shan '
'Frequency B-Spline->->fbsp '
'Complex Morlet ->->cmor '
'Fejer-Korovkin ->->fk '
'beylkin ->->beyl '
'==================================='
Теперь можно использовать вейвлет для анализа сигналов или изображений. Для примера загрузите сигнал ECG и получите MODWT сигнала до четвертого уровня с помощью фильтра Бейлкина (18).
load wecg wtecg = modwt(wecg,'beyl',4);
Загрузите прямоугольное изображение, получите 2-D DWT с помощью фильтра Бейлкина (18). Отобразите диагональные коэффициенты детализации уровня 1.
load xbox [C,S] = wavedec2(xbox,1,'beyl'); [H,V,D] = detcoef2('all',C,S,1); subplot(2,1,1) imagesc(xbox) axis off title('Original Image') subplot(2,1,2) imagesc(D) axis off title('Level-One Diagonal Coefficients')
Наконец, проверьте, что новый фильтр удовлетворяет условиям для ортогональной пары QMF. Получите фильтры масштабирования (lowpass) и вейвлет (highpass).
[Lo,Hi] = wfilters('beyl');
Суммируйте коэффициенты lowpass, чтобы убедиться, что сумма равна . Суммируйте коэффициенты вейвлета фильтра и проверьте, что сумма равна 0.
sum(Lo)
ans = 1.4142
sum(Hi)
ans = -1.9873e-16
Проверьте, что автокорреляция масштабирующего и вейвлет при всех ненулевых лагах равна 0. У вас должны быть Signal Processing Toolbox™ для использования xcorr
.
[Clow,lags] = xcorr(Lo,Lo,10); Chigh = xcorr(Hi,Hi,10); subplot(2,1,1) stem(lags,Clow,'markerfacecolor',[0 0 1]) grid on; title('Autocorrelation of Scaling Filter'); subplot(2,1,2) stem(lags,Chigh,'markerfacecolor',[0 0 1]) grid on; title('Autocorrelation of Wavelet Filter');
Обратите внимание, что значения автокорреляции на обоих графиках равны нулю для ненулевых четных лагов. Покажите, что перекрестная корреляция масштабирующего и вейвлет равна нулю при всех даже лагах.
[xcr,lags] = xcorr(Lo,Hi,10); figure stem(lags,xcr,'markerfacecolor',[0 0 1]); title('Cross-correlation of QMF filters')
Конечный критерий утверждает, что сумма квадратов величин преобразований Фурье масштабирования и вейвлет фильтров на каждой частоте равна 2. Другими словами, позвольте быть преобразованием Фурье масштабирующего фильтра и быть преобразованием Фурье вейвлет. Следующее удерживает для всех : . Версия этого равенства для ДПФ: для любого . Проверьте фильтр Бейлкина (18) с.
N = numel(Lo); LoDFT = fft(Lo); HiDFT = fft(Hi); k = 0:N-1; m = 0; sumDFTmags = abs(LoDFT(1+mod(2^m*k,N))).^2+abs(HiDFT(1+mod(2^m*k,N))).^2
sumDFTmags = 18×1
2.0000
2.0000
2.0000
2.0000
2.0000
2.0000
2.0000
2.0000
2.0000
2.0000
⋮
Все значения равны 2, как и ожидалось. Чтобы понять, почему эти фильтры называются квадратурными зеркальными фильтрами, визуализируйте квадратурные частотные характеристики масштабирующего и вейвлет.
nfft = 512; F = 0:1/nfft:1/2; LoDFT = fft(Lo,nfft); HiDFT = fft(Hi,nfft); figure plot(F,abs(LoDFT(1:nfft/2+1)).^2,'DisplayName','Scaling Filter'); hold on plot(F,abs(HiDFT(1:nfft/2+1)).^2,'r','DisplayName','Wavelet Filter'); xlabel('Frequency'); ylabel('Squared Magnitude') title('Beylkin(18) QMF Filter Pair') grid on plot([1/4 1/4], [0 2],'k','HandleVisibility','off'); legend show;
Обратите внимание, что величины отклики являются симметричными или зеркальными изображениями друг друга вокруг квадратурной частоты 1/4.
Следующий код удаляет вейвлет Бейлкина (18).
wavemngr('del',familyShortName); delete('beyl.mat')
Добавление биортогонального вейвлета к тулбоксу аналогично добавлению QMF. Вы предоставляете допустимую пару lowpass (масштабирующих) фильтров, используемых в анализе и синтезе. The wfilters
функция сгенерирует высокочастотные фильтры.
Подлежит распознаванию wfilters
, фильтр масштабирования анализа должен быть назначен переменной Df
, и синтезирующий масштабирующий фильтр должен быть назначен переменной Rf
. Биортогональные масштабирующие фильтры не должны быть даже равной длины. Созданные выходы пары биортогональных фильтров будут иметь даже равные длины. Вот пары масштабирующих функций почти ортогонального биортогонального вейвлет, основанного на лаплакийской пирамидной схеме Берта и Адельсона.
Df = [-1 5 12 5 -1]/20*sqrt(2); Rf = [-3 -15 73 170 73 -15 -3]/280*sqrt(2);
Сохраните фильтры в .mat
файл.
save burt Df Rf
Использование wavemngr
для добавления биортогональных фильтров вейвлета к тулбоксу. Задайте имя семейства вейвлет и краткое имя, используемое для доступа к фильтру. Поскольку вейвлеты являются биортогональными, установите тип вейвлета равным 2. Поскольку вы добавляете только один вейвлет в это семейство, задайте вход переменной NUMS в wavemngr
быть пустой строкой.
familyName = 'burtAdelson'; familyShortName = 'burt'; familyWaveType = 2; familyNums = ''; fileWaveName = 'burt.mat'; wavemngr('add',familyName,familyShortName,familyWaveType,... familyNums,fileWaveName)
Проверьте, что биортогональный вейвлет добавлен в тулбокс.
wavemngr('read')
ans = 19x35 char array
'==================================='
'Haar ->->haar '
'Daubechies ->->db '
'Symlets ->->sym '
'Coiflets ->->coif '
'BiorSplines ->->bior '
'ReverseBior ->->rbio '
'Meyer ->->meyr '
'DMeyer ->->dmey '
'Gaussian ->->gaus '
'Mexican_hat ->->mexh '
'Morlet ->->morl '
'Complex Gaussian ->->cgau '
'Shannon ->->shan '
'Frequency B-Spline->->fbsp '
'Complex Morlet ->->cmor '
'Fejer-Korovkin ->->fk '
'burtAdelson ->->burt '
'==================================='
Теперь можно использовать вейвлет в тулбоксе. Создайте банк фильтров DWT для анализа с помощью burt
вейвлет. Подтвердите, что группа фильтров DWT является биортогональной. Постройте график величины частотных характеристик вейвлета полосно-пропускающих фильтров и функции масштабирования с наибольшим разрешением.
fb = dwtfilterbank('Wavelet','burt'); isBiorthogonal(fb)
ans = logical
1
freqz(fb)
Получите вейвлет и масштабирование функции банка фильтров. Постройте график функций вейвлета и масштабирования в самой крупной шкале.
[fb_phi,t] = scalingfunctions(fb); [fb_psi,~] = wavelets(fb); subplot(2,1,1) plot(t,fb_phi(end,:)) axis tight grid on title('Analysis - Scaling') subplot(2,1,2) plot(t,fb_psi(end,:)) axis tight grid on title('Analysis - Wavelet')
Создайте синтез набора фильтров DWT с помощью burt
вейвлет. Вычислите границы фрейма.
fb2 = dwtfilterbank('Wavelet','burt','FilterType','Synthesis','Level',4); [synthesisLowerBound,synthesisUpperBound] = framebounds(fb2)
synthesisLowerBound = 0.9800
synthesisUpperBound = 1.0509
Получите lowpass и highpass фильтры анализа и синтеза, сопоставленные с burt
. Обратите внимание, что выходные фильтры имеют одинаковую четную длину. Подтвердите сумму коэффициентов lowpass к sqrt(2)
и коэффициенты высокочастотного фильтра равны 0.
[LoD,HiD,LoR,HiR] = wfilters('burt');
[LoD' HiD' LoR' HiR']
ans = 8×4
0 0.0152 -0.0152 0
0 -0.0758 -0.0758 0
-0.0707 -0.3687 0.3687 -0.0707
0.3536 0.8586 0.8586 -0.3536
0.8485 -0.3687 0.3687 0.8485
0.3536 -0.0758 -0.0758 -0.3536
-0.0707 0.0152 -0.0152 -0.0707
0 0 0 0
sum([(LoD'/sqrt(2)) HiD' (LoR'/sqrt(2)) HiR'])
ans = 1×4
1.0000 -0.0000 1.0000 0
Удалите фильтр Burt-Adelson из тулбокса.
wavemngr('del',familyShortName); delete('burt.mat')
[1] Daubechies, I. Ten Lectures on Wavelets. Серия региональных конференций CBMS-NSF по прикладной математике. Филадельфия, Пенсильвания: Общество промышленной и прикладной математики, 1992.