Этот пример показывает различие между дискретным вейвлет (DWT) и непрерывным вейвлет (CWT).
Чтобы ответить на это, рассмотрим связанные вопросы: Нужно ли знать все значения непрерывного разложения, чтобы точно восстановить сигнал? Можно ли выполнить нерезервированный анализ? Когда энергия сигнала конечна, не все значения разложения необходимы, чтобы точно восстановить исходный сигнал, при условии, что вы используете вейвлет, который удовлетворяет некоторому условию допустимости. Обычные вейвлеты удовлетворяют этому условию. В этом случае сигнал непрерывного времени характеризуется знанием дискретного преобразования. В таких случаях дискретного анализа достаточно и непрерывный анализ избыточен.
Непрерывный анализ часто легче интерпретировать, поскольку его избыточность имеет тенденцию усиливать признаки и делает всю информацию более заметной. Особенно это касается очень тонкой информации. Таким образом, анализ повышает «читаемость» и простоту интерпретации того, что он теряет с точки зрения сохранения пространства.
Покажите, как анализ с помощью вейвлетов может обнаружить точный момент при изменении сигнала. Используйте прерывистый сигнал, который состоит из медленной синусоиды, за которой резко следует средняя синусоида.
load freqbrk;
signal = freqbrk;
Выполните дискретное вейвлет-преобразование (DWT) на уровне 5 с помощью вейвлет Haar.
lev = 5;
wname = 'db1';
nbcol = 64;
[c,l] = wavedec(signal,lev,wname);
Разверните дискретные коэффициенты вейвлета для графика.
len = length(signal); cfd = zeros(lev,len); for k = 1:lev d = detcoef(c,l,k); d = d(:)'; d = d(ones(1,2^k),:); cfd(k,:) = wkeep(d(:)',len); end cfd = cfd(:); I = find(abs(cfd)<sqrt(eps)); cfd(I) = zeros(size(I)); cfd = reshape(cfd,lev,len); cfd = wcodemat(cfd,nbcol,'row'); h211 = subplot(2,1,1); h211.XTick = []; plot(signal,'r'); title('Analyzed signal.'); ax = gca; ax.XLim = [1 length(signal)]; subplot(2,1,2); colormap(cool(128)); image(cfd); tics = 1:lev; labs = int2str(tics'); ax = gca; ax.YTickLabelMode = 'manual'; ax.YDir = 'normal'; ax.Box = 'On'; ax.YTick = tics; ax.YTickLabel = labs; title('Discrete Transform, absolute coefficients.'); ylabel('Level');
Выполните непрерывное вейвлет (CWT) и визуализируйте результаты
figure; [cfs,f] = cwt(signal,1,'waveletparameters',[3 3.1]); hp = pcolor(1:length(signal),f,abs(cfs)); hp.EdgeColor = 'none'; set(gca,'YScale','log'); xlabel('Sample'); ylabel('log10(f)');
Если вы просто посмотрите на коэффициенты CWT самой мелкой шкалы, можно точно локализовать изменение частоты.
plot(abs(cfs(1,:))); grid on;
Этот пример показывает важное преимущество вейвлет по сравнению с Фурье. Если бы тот же сигнал был проанализирован преобразованием Фурье, мы бы не смогли обнаружить момент, когда частота сигнала изменилась, тогда как он явно наблюдаем здесь.