📄 filtview.m
字号:
Fs = evalin('base',ud.prefs.Fs,'1');
switch ud.prefs.freqrange
case 1 % [0 Fs/2]
flim = [Fs/ud.prefs.nfft Fs/2];
case 2 % [0 Fs]
flim = [Fs/ud.prefs.nfft Fs];
end
set(ud.ht.a([1 2 3]),'xscale','log','xlim',flim)
end
if ud.prefs.tool.ruler & any(ud.ht.a(1:3) == ud.mainaxes)
plotIndex = find(ud.mainaxes == ud.ht.a);
% Make sure that ud.limits matches new axes limits
ud = filtview('setudlimits',ud,ud.ht.a,plotIndex);
set(fig,'userdata',ud)
% Make sure that ruler values stay within the new axes limits
ruler('inbounds',fig,'xlim',plotIndex)
ud = get(fig,'userdata');
ruler('newlimits',fig,plotIndex,ud.focusline)
ruler('newsig',fig,plotIndex)
end
p = sptool('getprefs','filtview1');
p.freqscale = get(ud.ht.fscalepop,'value');
sptool('setprefs','filtview1',p)
% ----------------------------------------------------------------------
% filtview('frangepop',fig)
% callback of frequency range popup
%
case 'frangepop'
if nargin > 1
fig = varargin{2};
else
fig = gcf;
end
ud = get(fig,'userdata');
oldmode = ud.prefs.freqrange;
popupval = get(ud.ht.frangepop,'value');
popupstr = get(ud.ht.frangepop,'string');
if (oldmode == popupval)
return
end
switch popupval
case 1
ud.prefs.freqrange = 1;
case 2
ud.prefs.freqrange = 2;
case 3
% if in log scaling, don't allow display of negative frequencies
if strcmp(ud.prefs.freqscale,'log')
% so don't change range!
msgbox({'Sorry, you can''t set the range to include negative' ...
'frequencies when the Frequency Axis Scaling is logarithmic.'},...
'Logarithmic Scaling Conflict','warn','modal')
set(ud.ht.frangepop,'value',ud.prefs.freqrange)
return
end
ud.prefs.freqrange = 3;
end
set(fig,'userdata',ud)
filtview('plots',[ud.prefs.plots(1:3); 0; 0; 0],fig)
fvzoom('zoomout',[ud.prefs.plots(1:3)' 0 0 0],fig) % sets userdata
ud = get(fig,'userdata');
% Make sure that rulers appear within the new axes limits
if ud.prefs.tool.ruler & any(ud.ht.a(1:3) == ud.mainaxes)
plotIndex = find(ud.mainaxes == ud.ht.a);
ruler('inbounds',fig,'xlim',plotIndex) % make sure ruler limits are
% within the new axes limits
if (ud.prefs.freqrange ~= oldmode)
ruler('updatepeaksgroup',fig)
end
end
p = sptool('getprefs','filtview1');
p.freqrange = get(ud.ht.frangepop,'value');
sptool('setprefs','filtview1',p)
% ----------------------------------------------------------------------
% filtview('Fs',fig)
% callback of sampling frequency edit box
% (or you can use this to set the sampling frequency if you
% set the string of ud.ht.Fsedit first)
%
case 'Fs'
if nargin < 2
fig = gcf;
else
fig = varargin{2};
end
ud = get(fig,'userdata');
str = get(ud.ht.Fsedit,'string');
if isequal(str,ud.prefs.Fs)
return
end
[Fs,err] = validarg(str,[0 Inf],[1 1],'sampling frequency');
if err
set(ud.ht.Fsedit,'string',ud.prefs.Fs)
return
else
ud.prefs.Fs = str;
set(fig,'userdata',ud)
if ~isempty(ud.tabfig) % update settings figure
data = get(ud.tabfig,'userdata');
% this panel has been created since it is the first 1
fvprefhand('populate',ud.tabfig,1,ud.prefs)
end
fvzoom('zoomout',ud.prefs.plots,fig)
filtview('plots',ud.prefs.plots,fig)
end
% ----------------------------------------------------------------------
% filtview('plots',plots,fig,need_update)
% updates the plots indicated with a '1' in the plots vector
%
case 'plots'
if nargin < 3
fig = gcf;
else
fig = varargin{3};
end
ud = get(fig,'userdata');
if nargin < 4
need_update = 1:length(ud.filt); % everything needs updating
else
need_update = varargin{4};
end
plots = varargin{2};
if all(plots==0)
return
end
if isempty(ud.filt)
% uninitialized tool - no filter
% set axes limits to default value [0 1]
for i=1:3
if plots(i)
set(ud.ht.a(i),'xlim',[0 1])
end
end
return
end
maxFs = evalin('base',ud.prefs.Fs,'1');
nfft = ud.prefs.nfft;
if strcmp(ud.prefs.freqscale,'log')
xlim1 = maxFs/ud.prefs.nfft;
else
xlim1 = 0;
end
switch ud.prefs.freqrange
case 1 % [0 Fs/2]
flim = [xlim1 maxFs/2];
case 2 % [0 Fs]
flim = [xlim1 maxFs];
case 3 % [-Fs/2 Fs/2]
flim = [-maxFs/2 maxFs/2];
end
% Loop through selected filters that need updating
for i = need_update
Fs = ud.filt(i).Fs;
switch ud.prefs.freqrange
case 1 % [0 Fs/2]
ud.filt(i).f = 0:Fs/nfft:(Fs/2 - Fs/(2*nfft));
case 2 % [0 Fs]
ud.filt(i).f = 0:Fs/nfft:(Fs - Fs/nfft);
case 3 % [-Fs/2 Fs/2]
ud.filt(i).f = fftshift(0:Fs/nfft:(Fs - Fs/nfft));
ind = find(ud.filt(i).f>=Fs/2);
ud.filt(i).f(ind) = ud.filt(i).f(ind)-Fs;
end
if any(plots([1 2 3]))
ud.filt(i).H = fft(ud.filt(i).tf.num,nfft);
warnsave = warning;
warning('off') % prevent possible divide by 0 message
ud.filt(i).H = ud.filt(i).H./fft(ud.filt(i).tf.den,nfft);
warning(warnsave)
switch ud.prefs.freqrange
case 1 % [0 Fs/2]
ud.filt(i).H = ud.filt(i).H(1:nfft/2);
case 3 % [-Fs/2 Fs/2]
ud.filt(i).H = fftshift(ud.filt(i).H);
end
end
if isempty(ud.filt(i).lineinfo)
lineColor = ud.colororder{1};
lineStyle = ud.linestyleorder{1};
else
lineColor = ud.filt(i).lineinfo.color;
lineStyle = ud.filt(i).lineinfo.linestyle;
end
if plots(1)
if isempty(ud.lines(i).mag)
ud.lines(i).mag = line(1,1,'tag','magline',...
'parent',ud.ht.a(1), ...
'buttondownfcn','filtview(''mdown'')');
end
set(ud.lines(i).mag,'color',lineColor,'linestyle',lineStyle)
if strcmp(ud.prefs.magmode,'decibels')
absH = abs(ud.filt(i).H);
ind = find(absH>0);
dbH = -Inf; dbH = dbH(ones(size(absH)));
dbH(ind) = 20*log10(absH(ind));
set(ud.lines(i).mag,'xdata',ud.filt(i).f,...
'ydata',dbH,'visible','on')
else
set(ud.lines(i).mag,'xdata',ud.filt(i).f,...
'ydata',abs(ud.filt(i).H),'visible','on')
end
end
if plots(2)
if isempty(ud.lines(i).phase)
ud.lines(i).phase = line(1,1,'tag','phaseline',...
'parent',ud.ht.a(2), ...
'buttondownfcn','filtview(''mdown'')');
end
set(ud.lines(i).phase,'color',lineColor,'linestyle',lineStyle)
if ud.prefs.freqrange < 3
pha = unwrap(angle(ud.filt(i).H));
else
pha_neg = unwrap(angle(ud.filt(i).H(nfft/2:-1:1)));
pha_neg = pha_neg(end:-1:1);
pha_pos = unwrap(angle(ud.filt(i).H((nfft/2+1):end)));
pha = [pha_neg(:); pha_pos(:);];
end
switch ud.prefs.phasemode
case 'degrees'
set(ud.lines(i).phase,'xdata',ud.filt(i).f,...
'ydata',pha*180/pi,'visible','on')
case 'radians'
set(ud.lines(i).phase,'xdata',ud.filt(i).f,...
'ydata',pha,'visible','on')
end
end
if plots(3)
warnsave = warning;
warning('off'); % turn off divide by zero warning
ud.filt(i).G = grpdelay(ud.filt(i).tf.num,ud.filt(i).tf.den,...
ud.filt(i).f,Fs);
warning(warnsave);
if isempty(ud.lines(i).grpdelay)
ud.lines(i).grpdelay = line(1,1,'tag','delayline',...
'parent',ud.ht.a(3), ...
'buttondownfcn','filtview(''mdown'')');
end
set(ud.lines(i).grpdelay,'color',lineColor,'linestyle',lineStyle)
set(ud.lines(i).grpdelay,'xdata',ud.filt(i).f,...
'ydata',ud.filt(i).G,'visible','on')
end
if plots(4)
if isempty(ud.lines(i).z)
ud.lines(i).z = line(NaN,NaN,'tag','zerosline',...
'linestyle','none','marker','o',...
'parent',ud.ht.a(4),...
'buttondownfcn','filtview(''mdown'')');
end
set(ud.lines(i).z,'color',lineColor)
if isempty(ud.lines(i).p)
ud.lines(i).p = line(NaN,NaN,'tag','polesline',...
'linestyle','none','marker','x',...
'parent',ud.ht.a(4),...
'buttondownfcn','filtview(''mdown'')');
end
set(ud.lines(i).p,'color',lineColor)
if isempty(ud.filt(i).zpk)
if ~isempty(ud.filt(i).ss)
[z,p,k] = ss2zp(ud.filt(i).ss.a,ud.filt(i).ss.b,...
ud.filt(i).ss.c,ud.filt(i).ss.d,1);
elseif ~isempty(ud.filt(i).sos)
[z,p,k] = sos2zp(ud.filt(i).sos);
else
if length(ud.filt(i).tf.den)<length(ud.filt(i).tf.num)
den = ud.filt(i).tf.den;
den(length(ud.filt(i).tf.num)) = 0; % zero pad
[z,p,k] = tf2zp(ud.filt(i).tf.num,den);
else
[z,p,k] = tf2zp(ud.filt(i).tf.num,ud.filt(i).tf.den);
end
end
ud.filt(i).zpk.z = z;
ud.filt(i).zpk.p = p;
ud.filt(i).zpk.k = k;
end
set(ud.lines(i).z,'xdata',real(ud.filt(i).zpk.z),...
'ydata',imag(ud.filt(i).zpk.z),'visible','on')
set(ud.lines(i).p,'xdata',real(ud.filt(i).zpk.p),...
'ydata',imag(ud.filt(i).zpk.p),'visible','on')
set(ud.ht.a(4),'ylimmode','auto','xlimmode','auto')
apos = get(ud.ht.a(4),'Position');
set(ud.ht.a(4),'DataAspectRatio',[1 1 1],...
'PlotBoxAspectRatio',apos([3 4 4]))
end
if any(plots([5 6]))
[ud.filt(i).imp,ud.filt(i).t] = ...
impz(ud.filt(i).tf.num,ud.filt(i).tf.den,ud.prefs.nimp,Fs);
end
if plots(5)
if isempty(ud.lines(i).imp)
ud.lines(i).imp = line(nan,nan,'tag','implinedots',...
'linestyle','none','marker','o',...
'parent',ud.ht.a(5),...
'buttondownfcn','filtview(''mdown'')');
end
set(ud.lines(i).imp,'color',lineColor,'markerfacecolor',lineColor)
if isempty(ud.lines(i).impstem)
ud.lines(i).impstem = line(nan,nan,'color',lineColor,...
'linestyle','-',...
'tag','implinestem',...
'parent',ud.ht.a(5),...
'buttondownfcn','filtview(''mdown'')');
end
set(ud.lines(i).impstem,'color',lineColor,'linestyle',lineStyle)
if isempty(ud.lines(i).impc)
ud.lines(i).impc = line(nan,nan,'tag','implinedotsc',...
'linestyle','none','marker','*',...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -