В примере показано, как подавлять сигнал с использованием пороговых значений, зависящих от интервала.
Инструментальные средства GUI вейвлета обеспечивают точный процесс обессоливания, позволяя нам точно настраивать параметры, необходимые для обессоливания сигнала. Затем мы можем сохранить деноизированный сигнал, вейвлет-разложение и все деноизирующие параметры.
Это может быть утомительным и иногда невозможно обработать многие сигналы, используя одни и те же настройки отрицания. Пакетный режим с помощью командной строки может быть гораздо более эффективным. В этом примере показано, как работать в командной строке для упрощения и решения этой проблемы.
В этом примере мы проводим шесть испытаний для устранения электрического сигнала nelec, используя следующие процедуры:
Использование одного интервала с минимальным пороговым значением: 4,5
Использование одного интервала с максимальным пороговым значением: 19.5
Выбор вручную трех интервалов и трех пороговых значений и использование wthresh функция для пороговых значений коэффициентов.
Использование utthrset_cmd для автоматического поиска интервалов и пороговых значений.
Использование cmddenoise для автоматического выполнения всех процессов.
Использование cmddenoise функция с дополнительными параметрами.
Загрузите электрический сигнал потребления nelec.
load nelec.mat
sig = nelec;Теперь мы используем дискретный вейвлет-анализ на уровне 5 с симвелетом sym4. Мы устанавливаем тип порогов как 's' (мягкий).
wname = 'sym4'; level = 5; sorh = 's';
Денуазировать сигнал с помощью функции wdencmp с пороговым значением 4,5, которое является минимальным значением, обеспечиваемым инструментами GUI.
thr = 4.5; [sigden_1,~,~,perf0,perfl2] = wdencmp('gbl',sig,wname,level,thr,sorh,1); res = sig-sigden_1; subplot(3,1,1) plot(sig,'r') axis tight title('Original Signal') subplot(3,1,2) plot(sigden_1,'b') axis tight title('Denoised Signal') subplot(3,1,3) plot(res,'k') axis tight title('Residual')

perf0,perfl2
perf0 = 66.6995
perfl2 = 99.9756
Полученный результат не является хорошим. Денойзинг очень эффективен в начале и конце сигнала, но между 100 и 1100 шум не снимается. Следует отметить, что значение perf0 дает процент коэффициентов, установленный равным нулю, а значение perfl2 дает процент сохраненной энергии.
Теперь мы отрицаем сигнал с максимальным значением, предоставленным инструментами GUI для порога, 19.5
thr = 19.5; [sigden_2,cxd,lxd,perf0,perfl2] = wdencmp('gbl',sig,wname,level,thr,sorh,1); res = sig-sigden_2; subplot(3,1,1) plot(sig,'r') axis tight title('Original Signal') subplot(3,1,2) plot(sigden_2,'b') axis tight title('Denoised Signal') subplot(3,1,3) plot(res,'k') axis tight title('Residual')

perf0,perfl2
perf0 = 94.7860
perfl2 = 99.9564
Деноузированный сигнал очень гладкий. Это кажется довольно хорошим, но если мы посмотрим на остаток после положения 1100, мы увидим, что дисперсия лежащего в основе шума не является постоянной. Некоторые компоненты сигнала, вероятно, остались в остатке, например, вблизи позиции 1300 и между позициями 1900 и 2000.
Теперь мы будем использовать зависящее от интервала пороговое значение, как в облагораживающих инструментах GUI.
Выполните дискретный вейвлет-анализ сигнала.
[coefs,longs] = wavedec(sig,level,wname);
Используя инструменты GUI для выполнения зависящих от интервала пороговых значений для сигнала nelec, и устанавливая количество интервалов на три, мы получаем содержимое denPAR переменная, которую можно интерпретировать следующим образом:
I1 = [1 94] с порогом thr1 = 5,9
I2 = [94 1110] с порогом thr2 = 19,5
I3 = [1110 2000] с порогом thr3 = 4,5
Определите зависящие от интервала пороговые значения.
denPAR = {[1 94 5.9 ; 94 1110 19.5 ; 1110 2000 4.5]};
thrParams = cell(1,level);
thrParams(:) = denPAR;Показать вейвлет-коэффициенты сигнала и интервал-зависимый порог для каждого уровня дискретного анализа.
% Replicate the coefficients cfs_beg = wrepcoef(coefs,longs); % Display the coefficients of the decomposition figure subplot(6,1,1) plot(sig,'r') axis tight title('Original Signal and Detail Coefficients from 1 to 5') ylabel('S','Rotation',0) for k = 1:level subplot(6,1,k+1) plot(cfs_beg(k,:),'Color',[0.5 0.8 0.5]) ylabel(['D' int2str(k)],'Rotation',0) axis tight hold on maxi = max(abs(cfs_beg(k,:))); hold on par = thrParams{k}; plotPar = {'Color','m','LineStyle','-.'}; for j = 1:size(par,1)-1 plot([par(j,2),par(j,2)],[-maxi maxi],plotPar{:}) end for j = 1:size(par,1) plot([par(j,1),par(j,2)],[par(j,3) par(j,3)],plotPar{:}) plot([par(j,1),par(j,2)],-[par(j,3) par(j,3)],plotPar{:}) end ylim([-maxi*1.05 maxi*1.05]) %hold off end subplot(6,1,level+1) xlabel('Time or Space')

Для каждого уровня k, переменная thrParams{k} содержит интервалы и соответствующие пороговые значения для процедуры обезвреживания.
Пороговое значение вейвлет-коэффициентов уровень за уровнем и интервал за интервалом, используя значения, содержащиеся в thrParams переменная.
Использование функции wthresh, мы пороговим значения вейвлет-коэффициентов между горизонтальными линиями, заменяя их нулями, в то время как другие значения либо уменьшаются, если sorh = 's' или остаться неизменным, если sorh = 'h'.
first = cumsum(longs)+1; first = first(end-2:-1:1); tmp = longs(end-1:-1:2); last = first+tmp-1; for k = 1:level thr_par = thrParams{k}; if ~isempty(thr_par) cfs = coefs(first(k):last(k)); nbCFS = longs(end-k); NB_int = size(thr_par,1); x = [thr_par(:,1) ; thr_par(NB_int,2)]; alf = (nbCFS-1)/(x(end)-x(1)); bet = 1 - alf*x(1); x = round(alf*x+bet); x(x<1) = 1; x(x>nbCFS) = nbCFS; thr = thr_par(:,3); for j = 1:NB_int if j == 1 d_beg = 0; else d_beg = 1; end j_beg = x(j)+ d_beg; j_end = x(j+1); j_ind = (j_beg:j_end); cfs(j_ind) = wthresh(cfs(j_ind),sorh,thr(j)); end coefs(first(k):last(k)) = cfs; end end
Отображение пороговых вейвлет-коэффициентов сигнала.
% Replicate the coefficients. cfs_beg = wrepcoef(coefs,longs); % Display the decomposition coefficients. figure subplot(6,1,1) plot(sig,'r') axis tight title('Original Signal and Detail Coefficients from 1 to 5') ylabel('S','Rotation',0) for k = 1:level subplot(6,1,k+1) plot(cfs_beg(k,:),'Color',[0.5 0.8 0.5]) ylabel(['D' int2str(k)],'Rotation',0) axis tight hold on maxi = max(abs(cfs_beg(k,:))); %hold on par = thrParams{k}; plotPar = {'Color','m','LineStyle','-.'}; for j = 1:size(par,1)-1 plot([par(j,2),par(j,2)],[-maxi maxi],plotPar{:}) end for j = 1:size(par,1) plot([par(j,1),par(j,2)], [par(j,3) par(j,3)],plotPar{:}) plot([par(j,1),par(j,2)],-[par(j,3) par(j,3)],plotPar{:}) end ylim([-maxi*1.05 maxi*1.05]) hold off end subplot(6,1,level+1) xlabel('Time or Space')

Восстановите денозированный сигнал.
sigden = waverec(coefs,longs,wname); res = sig - sigden;
Отображение исходных, денонсированных и остаточных сигналов.
figure subplot(3,1,1) plot(sig,'r') hold on plot(sigden,'b') axis tight title('Original and Denoised Signals') subplot(3,1,2) plot(sigden,'b') axis tight title('Denoised Signal') subplot(3,1,3) plot(res,'k') axis tight title('Residual')

Сравните три денонсированные версии сигнала.
figure plot(sigden_1,'g') hold on plot(sigden_2,'r') plot(sigden,'k') axis tight hold off legend('Denoised Min','Denoised Max','Denoised IDT','Location','North')

Глядя на первую половину сигналов, ясно, что деноизирование с использованием минимального значения порога не является хорошим. Теперь увеличим конец сигнала для получения более подробной информации.
xlim([1200 2000]) ylim([180 350])

Мы видим, что когда используется максимальное пороговое значение, деноизируемый сигнал сглаживается слишком сильно и информация теряется.
Наилучший результат дается с использованием порога, основанного на методе интерваль-зависимого порогового определения, как мы покажем сейчас.
Вместо ручной установки интервалов и пороговых значений для каждого уровня можно использовать функцию utthrset_cmd для автоматического вычисления интервалов и пороговых значений для каждого интервала. Затем мы завершаем процедуру, применяя пороговые значения, восстанавливая и отображая сигнал.
% Wavelet Analysis. [coefs,longs] = wavedec(sig,level,wname); siz = size(coefs); thrParams = utthrset_cmd(coefs,longs); first = cumsum(longs)+1; first = first(end-2:-1:1); tmp = longs(end-1:-1:2); last = first+tmp-1; for k = 1:level thr_par = thrParams{k}; if ~isempty(thr_par) cfs = coefs(first(k):last(k)); nbCFS = longs(end-k); NB_int = size(thr_par,1); x = [thr_par(:,1) ; thr_par(NB_int,2)]; alf = (nbCFS-1)/(x(end)-x(1)); bet = 1 - alf*x(1); x = round(alf*x+bet); x(x<1) = 1; x(x>nbCFS) = nbCFS; thr = thr_par(:,3); for j = 1:NB_int if j==1 d_beg = 0; else d_beg = 1; end j_beg = x(j)+d_beg; j_end = x(j+1); j_ind = (j_beg:j_end); cfs(j_ind) = wthresh(cfs(j_ind),sorh,thr(j)); end coefs(first(k):last(k)) = cfs; end end sigden = waverec(coefs,longs,wname); figure subplot(2,1,1) plot(sig,'r') axis tight hold on plot(sigden,'k') title('Original and Denoised Signals') subplot(2,1,2) plot(sigden,'k') axis tight hold off title('Denoised Signal')

В режиме командной строки можно использовать функцию cmddenoise автоматическое вычисление деноизолированного сигнала и коэффициентов на основе интервально-зависимого способа деноизирования. Этот способ выполняет весь процесс деноизирования, используя только эту одну функцию, которая включает в себя все шаги, описанные ранее в этом примере.
[sigden,~,thrParams] = cmddenoise(sig,wname,level);
thrParams{1} % Denoising parameters for level 1.ans = 2×3
103 ×
0.0010 1.1100 0.0176
1.1100 2.0000 0.0045
Автоматическая процедура находит два интервала для денойзинга:
I1 = [1 1110] с порогом thr1 = 17,6
I2 = [1110 2000] с порогом thr2 = 4,5.
Мы можем показать результат отрицания и увидеть, что результат в порядке.
figure subplot(2,1,1) plot(sig,'r') axis tight hold on plot(sigden,'k') title('Original and Denoised Signals') hold off subplot(2,1,2) plot(sigden,'k') axis tight title('Denoised Signal')

Теперь, мы рассмотрим более полный пример автоматического отрицания.
Вместо использования значений по умолчанию для входных параметров можно задать их при вызове функции. Здесь тип порога выбирается как s (мягкая) и количество интервалов устанавливается равным 3.
load nelec.mat; sig = nelec; % Signal to analyze. wname = 'sym4'; % Wavelet for analysis. level = 5; % Level for wavelet decomposition. sorh = 's'; % Type of thresholding. nb_Int = 3; % Number of intervals for thresholding. [sigden,coefs,thrParams,int_DepThr_Cell,BestNbOfInt] = ... cmddenoise(sig,wname,level,sorh,nb_Int);
Для выходных параметров переменная thrParams{1} дает параметры деноизирования для уровней от 1 до 5. Например, вот параметры деноизирования для уровня 1.
thrParams{1}ans = 3×3
103 ×
0.0010 0.0940 0.0059
0.0940 1.1100 0.0195
1.1100 2.0000 0.0045
Мы находим те же значения, которые были установлены ранее в этом примере. Они соответствуют выбору, который мы сделали, зафиксировав количество интервалов до трех во входном параметре: nb_Int = 3.
Автоматическая процедура предлагает 2 в качестве наилучшего количества интервалов для денойзинга. Это выходное значение BestNbOfInt = 2 то же, что и на предыдущем этапе данного примера.
BestNbOfInt
BestNbOfInt = 2
Переменная int_DepThr_Cell содержит местоположения интервалов и пороговые значения для нескольких интервалов от 1 до 6.
int_DepThr_Cell
int_DepThr_Cell=1×6 cell array
Columns 1 through 4
{[1 2000 8.3611]} {2x3 double} {3x3 double} {4x3 double}
Columns 5 through 6
{5x3 double} {6x3 double}
Наконец, мы рассмотрим значения, соответствующие местоположениям и порогам для 5 интервалов.
int_DepThr_Cell{5}ans = 5×3
103 ×
0.0010 0.0940 0.0059
0.0940 0.5420 0.0184
0.5420 0.5640 0.0056
0.5640 1.1100 0.0240
1.1100 2.0000 0.0045
В этом примере показано, как использовать режим командной строки для достижения тех же возможностей, что и инструменты GUI для денойзинга, предоставляя при этом больший контроль над определенными значениями параметров для получения лучших результатов.
Денойзер вейвлет-сигнала | wdenoise | wdenoise2