How to specify thresholding for SWT in a loop?

조회 수: 1 (최근 30일)
maruljay
maruljay 2019년 7월 28일
댓글: maruljay 2019년 8월 9일
Hi all,
I have a nested cell array (cnew) and each cell array contains a time series. I am using SWT denoising -1D in the wavelet analyzer toolbox for denoising. For the first time serise in the 1st cell array (5990x1), I used a db-10 level 8 decomposition for denoising (as shown in the code auto-generated by wavelet analyzer toolbox).
Here
1) I used a soft threshold and clicked "denoise" in the toolbox
2) I accepted the automatic thresholding limits set by the toolbox for coefficients 1, 2, 3, 4 without changing anything
3) I manually set "0" as the thresholding limit for coeffcient 5, 6, 7 ,8
4) Then clicked "denoise" again and auto-generated this code
My question is: How can I do the same thresholding procedure for all the cell arrays in my nested cell array without having to manually open the toolbox every time ?
Note: The length of my time series varies
function [sigDEN,wDEC] = func_denoise_sw1d(SIG)
% FUNC_DENOISE_SW1D Saved Denoising Process.
% SIG: vector of data
% -------------------
% sigDEN: vector of denoised data
% wDEC: stationary wavelet decomposition
% Auto-generated by Wavelet Toolbox on 28-Jul-2019 15:55:45
% Analysis parameters.
%---------------------
wname = 'db10';
level = 8;
% Denoising parameters.
%----------------------
% meth = 'sqtwolog';
% scal_OR_alfa = one;
sorh = 's'; % Specified soft or hard thresholding
thrSettings = {...
[...
1.000000000000000 5888.000000000000000 0.255766629023205; ...
]; ...
[...
1.000000000000000 5888.000000000000000 0.425342655228765; ...
]; ...
[...
1.000000000000000 5888.000000000000000 0.645995128480590; ...
]; ...
[...
1.000000000000000 5888.000000000000000 0.838125150823955; ...
]; ...
[...
1.000000000000000 5888.000000000000000 0.000000000000000; ...
]; ...
[...
1.000000000000000 5888.000000000000000 0.000000000000000; ...
]; ...
[...
1.000000000000000 5888.000000000000000 0.000000000000000; ...
]; ...
[...
1.000000000000000 5888.000000000000000 0.000000000000000; ...
]; ...
};
% Decompose using SWT.
%---------------------
wDEC = swt(SIG,level,wname);
% Denoise.
%---------
len = length(SIG);
for k = 1:level
thr_par = thrSettings{k};
if ~isempty(thr_par)
NB_int = size(thr_par,1);
x = [thr_par(:,1) ; thr_par(NB_int,2)];
x = round(x);
x(x<1) = 1;
x(x>len) = len;
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);
wDEC(k,j_ind) = wthresh(wDEC(k,j_ind),sorh,thr(j));
end
end
end
% Reconstruct the denoise signal using ISWT.
%-------------------------------------------
sigDEN = iswt(wDEC,wname);

답변 (1개)

Subhadeep Koley
Subhadeep Koley 2019년 8월 9일
Hi, I understand that you are trying to perform the same thresholding procedure (as generated by the wavelet analyzer toolbox) for all the cell arrays in your nested cell array without having to manually open the toolbox every time.
The following code might help you.
denoisedSignal=cell(size(cnew));
for i=1:size(cnew)
SIG=cnew{i,1};
[sigDEN,wDEC] = func_denoise_sw1d(SIG);
denoisedSignal{i,1}=sigDEN;
end
  댓글 수: 1
maruljay
maruljay 2019년 8월 9일
For every dataset, the wavelet analyzer toolbox provides different thresholding limits. In that limits, I want to change the thresholding of coefficient 5,6,7,8 to "0" and leave the rest unchanged.
I want this to happen to all the datasets in my array.
The code you provided uses constant thresholding for all datasets instead of allowing the toolbox to suggest different thresholding for different datasets.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Denoising and Compression에 대해 자세히 알아보기

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by