function C = plotwavelets(c,info,varargin)
%PLOTWAVELETS Plot wavelet coefficients
% Usage: plotwavelets(c,info,fs)
% plotwavelets(c,info,fs,'dynrange',dynrange,...)
%
% PLOTWAVELETS(c,info) plots the wavelet coefficients c using
% additional parameters from struct. info. Both parameters are returned
% by any forward transform function in the wavelets directory.
%
% PLOTWAVELETS(c,info,fs) does the same plot assuming a sampling rate
% fs Hz of the original signal.
%
% plowavelets(c,info,fs,'dynrange',dynrange) additionally limits the
% dynamic range.
%
% C=PLOTWAVELETS(...) returns the processed image data used in the
% plotting. Inputting this data directly to imagesc or similar functions
% will create the plot. This is usefull for custom post-processing of the
% image data.
%
% PLOTWAVELETS supports optional parameters of TFPLOT. Please see
% the help of TFPLOT for an exhaustive list.
%
% See also: fwt, tfplot
%
% Url: http://ltfat.github.io/doc/wavelets/plotwavelets.html
% Copyright (C) 2005-2023 Peter L. Soendergaard <peter@sonderport.dk> and others.
% This file is part of LTFAT version 2.6.0
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see <http://www.gnu.org/licenses/>.
complainif_notenoughargs(nargin,2,'PLOTWAVELETS');
if isempty(c) || ~(iscell(c) || isnumeric(c))
error('%s: c must be non-empty cell or numeric array.',upper(mfilename));
end
if ~isstruct(info) || ~isfield(info,'fname')
error(['%s: info must be struct obtained as the 2nd return param. ',...
'of the comp. routine.'],upper(mfilename));
end
definput.import={'tfplot'};
definput.flags.fwtplottype = {'tfplot','stem'};
definput.keyvals.fs = [];
definput.keyvals.dynrange = [];
[flags,kv]=ltfatarghelper({'fs','dynrange'},definput,varargin);
if(flags.do_stem)
error('%s: Flag %s not supported yet.',upper(mfilename),flags.fwtplottype);
end
switch info.fname
case {'ufwt','uwfbt','uwpfbt'}
% Only one channel signals can be plotted.
if(ndims(c)>2)
error('%s: Multichannel not supported.',upper(mfilename));
end
case {'wfbt','dtwfbreal','dtwfb','wpfbt'}
if any(cellfun(@(cEl) size(cEl,2)>1,c))
error('%s: Multichannel input not supported.',upper(mfilename));
end
end
maxSubLen = 800;
draw_ticks = 1;
switch info.fname
case 'fwt'
%% FWT plot
% Change to the cell format
if(isnumeric(c))
c = wavpack2cell(c,info.Lc,info.dim);
end
maxSubLen = max(info.Lc);
% Only one channel signals can be plotted.
if(size(c{1},2)>1)
error('%s: Multichannel input not supported.',upper(mfilename));
end
subbNo = numel(c);
w = fwtinit(info.wt);
aBase = w.a;
filtNo = numel(w.h);
J = info.J;
a = [aBase(1).^J, reshape(aBase(2:end)*aBase(1).^(J-1:-1:0),1,[])]';
case 'ufwt'
subbNo = size(c,2);
a = ones(subbNo,1);
w = fwtinit(info.wt);
filtNo = numel(w.h);
J = info.J;
case {'wfbt','dtwfbreal','dtwfb'}
maxSubLen = max(cellfun(@(cEl) size(cEl,1),c));
a = treeSub(info.wt);
subbNo = numel(c);
draw_ticks = 0;
case 'uwfbt'
subbNo = size(c,2);
a = ones(subbNo,1);
draw_ticks = 0;
case 'wpfbt'
maxSubLen = max(cellfun(@(cEl) size(cEl,1),c));
aCell = nodesSub(nodeBForder(0,info.wt),info.wt);
a = cell2mat(cellfun(@(aEl) aEl(:)',aCell,'UniformOutput',0));
draw_ticks = 0;
case 'uwpfbt'
subbNo = size(c,2);
a = ones(subbNo,1);
draw_ticks = 0;
otherwise
error('%s: Unknown function name %s.',upper(mfilename),info.fname);
end
% POST optional operations
switch info.fname
case 'dtwfb'
% Do subband equivalent of fftshift
[c(1:end/2), c(end/2+1:end)] = deal( c(end/2+1:end), c(1:end/2));
a = [a(end:-1:1);a];
end
% Use plotfilterbank
C=plotfilterbank(c,a,[],kv.fs,kv.dynrange,flags.plottype,...
flags.log,flags.colorbar,flags.display,'fontsize',kv.fontsize,'clim',kv.clim,'xres',min([maxSubLen,800]));
if(draw_ticks)
% Redo the yticks and ylabel
yTickLabels = cell(1,subbNo);
yTickLabels{1} = sprintf('a%d',J);
Jtmp = ones(filtNo-1,1)*(J:-1:1);
for ii=1:subbNo-1
yTickLabels{ii+1} = sprintf('d%d',Jtmp(ii));
end
ylabel('Subbands','fontsize',kv.fontsize);
set(gca,'ytick',1:subbNo);
set(gca,'ytickLabel',yTickLabels,'fontsize',kv.fontsize);
end
% To avoid printing all the coefficients in the command window when a
% semicolon is forgotten
if nargout < 1
clear C;
end