📄 fdcheby2.m
字号:
fdutil('pokeFilterMeasurements','fdcheby2',type,f1,f2,f3,f4,Rp,Rs,Fs)
function RChangeMeas(passbandChange,type,Fs,Lresp,L1,L2,...
f1,f2,f3,f4,Rp,Rs,Fs1,Fs2)
%RChangeMeas - interactively track response when Rp or Rs has changed
% This function is meant to be called when the user
% a) changes the Rp or Rs measurement
% or b) drags the Rp or Rs value
% Xdata, Ydata, values of other frequencies and Rp and Rs are updated as
% needed.
% Note that for cheby2, only dragging Rp is allowed in this fashion, so
% passbandChange is assumed 1 and is ignored.
% Inputs:
% passbandChange - boolean == 1 for Rp, 0 for Rs, or vector [0 1] for
% both Rp and Rs
% type - band configuration (1 = lp, 2 = hp, 3 = bp, 4 = bs)
% Fs - sampling frequency
% Lresp, L1, L2 - fdline objects
% f1,f2,f3,f4,Rp,Rs - fdmeas objects
ff = Lresp.xdata;
delf = ff(2)-ff(1); % frequency spacing
Hlog = Lresp.ydata;
Fstop = get(Fs1,'value');
if type > 2
Fstop(2) = get(Fs2,'value');
end
fm = getFreqMeasurements(ff,Hlog,type,Rp.value,Rs.value,Fstop);
i = []; % which frequencies have changed
switch type
case 1
f1.value = fm(1);
i = 1;
case 2
f2.value = fm(2);
i = 2;
case 3 % bandpass - update f2 f3
f2.value = fm(2);
f3.value = fm(3);
i = [2 3];
case 4 % bandstop - update f1 f4
f1.value = fm(1);
f4.value = fm(4);
i = [1 4];
end
updateLines(1,type,i,f1,f2,f3,f4,Rp,Rs,Fs)
fdutil('pokeFilterMeasurements','fdcheby2',type,f1,f2,f3,f4,Rp,Rs,Fs)
function updateLines(passbandChange,type,fchange_ind,f1,f2,f3,f4,Rp,Rs,Fs)
% assume values of f1,f2,f3,f4,Rp and Rs are correct now
% fchange_ind - vector of indices indicating which frequencies have
% changed
global L1 L2 ax
f = getFrequencyValues(type,f1,f2,f3,f4,Fs)*Fs/2;
if any(passbandChange==1)
maxpass = 0;
minpass = -Rp.value;
% update L1 xdata and ydata
switch type
case 1 % lowpass
set(L1,'xdata',[f(1:2) NaN f(1:2)],...
'ydata',[maxpass maxpass NaN minpass minpass])
case 2 % highpass
set(L1,'xdata',[f(3:4) NaN f(3:4)],...
'ydata',[maxpass maxpass NaN minpass minpass ])
case 3 % bandpass
set(L1,'xdata',[f(3:4) NaN f(3:4)],...
'ydata',[maxpass maxpass NaN minpass minpass])
case 4 % bandstop
set(L1,'xdata',[f(1:2) NaN f(1:2) NaN f(5:6) NaN f(5:6)],...
'ydata',[ maxpass maxpass NaN minpass minpass NaN ...
maxpass maxpass NaN minpass minpass])
end
ylim = [minpass maxpass];
dyl = (ylim(2)-ylim(1))*.15;
ax.ylimPassband = ylim + [-dyl/2 dyl/2];
if length(f)==4
f(6)=0; % zeropad for call to xlimpassband
end
ax.xlimPassband = fdutil('xlimpassband',type,...
Fs,f(2),f(3),f(4),f(5));
end
if any(passbandChange==0)
minstop = -Rs.value;
% update L2 xdata and ydata
switch type
case 1 % lowpass
set(L2,'xdata',[f(3:4)],'ydata',[minstop minstop])
case 2 % highpass
set(L2,'xdata',[f(1:2)],'ydata',[ minstop minstop])
case 3 % bandpass
set(L2,'xdata',[f(1:2) NaN f(5:6)],...
'ydata',[ minstop minstop NaN minstop minstop])
case 4 % bandstop
set(L2,'xdata',[f(3:4)],'ydata',[minstop minstop])
end
end
%fdutil('updateRanges',fchange_ind,f1,f2,f3,f4)
set(f1,'range',[0 Fs/2])
set(f2,'range',[0 Fs/2])
set(f3,'range',[0 Fs/2])
set(f4,'range',[0 Fs/2])
function [f1,f2,f3,f4] = setupFrequencyObjects(type,module,pbobjects,...
sbobjects,f,Fs,ax,setValueFlag)
if nargin<8
setValueFlag = 1;
end
switch type
case 1 % lowpass
f1 = pbobjects(1);
f2 = sbobjects(1);
f3 = sbobjects(2);
f4 = pbobjects(2);
pbobjects(2).visible = 'off';
sbobjects(2).visible = 'off';
set(f1,'label','Fp')
set(f2,'label','Fs')
case 2 % highpass
f1 = sbobjects(1);
f2 = pbobjects(1);
f3 = pbobjects(2);
f4 = sbobjects(2);
pbobjects(2).visible = 'off';
sbobjects(2).visible = 'off';
set(f1,'label','Fs')
set(f2,'label','Fp')
case 3 % bandpass
f1 = sbobjects(1);
f2 = pbobjects(1);
f3 = pbobjects(2);
f4 = sbobjects(2);
pbobjects(2).visible = 'on';
sbobjects(2).visible = 'on';
set(f1,'label','Fs1')
set(f2,'label','Fp1')
set(f3,'label','Fp2')
set(f4,'label','Fs2')
case 4
f1 = pbobjects(1);
f2 = sbobjects(1);
f3 = sbobjects(2);
f4 = pbobjects(2);
pbobjects(2).visible = 'on';
sbobjects(2).visible = 'on';
set(f1,'label','Fp1')
set(f2,'label','Fs1')
set(f3,'label','Fs2')
set(f4,'label','Fp2')
end
if setValueFlag
if type < 3
set(f1,'value',f(2)*Fs/2,'range',[0 f(3)]*Fs/2)
set(f2,'value',f(3)*Fs/2,'range',[f(2) 1]*Fs/2)
else
set(f1,'value',f(2)*Fs/2,'range',[0 f(3)*Fs/2])
set(f2,'value',f(3)*Fs/2,'range',[f(2) f(4)]*Fs/2)
set(f3,'value',f(4)*Fs/2,'range',[f(3) f(5)]*Fs/2)
set(f4,'value',f(5)*Fs/2,'range',[f(4) 1]*Fs/2)
end
ax.xlimPassband = fdutil('xlimpassband',type,...
Fs,f1.value,f2.value,f3.value,f4.value);
end
set(f1,'range',[0 Fs/2])
set(f2,'range',[0 Fs/2])
set(f3,'range',[0 Fs/2])
set(f4,'range',[0 Fs/2])
f1.callback = [module '(''fchange'',1)'];
f2.callback = [module '(''fchange'',2)'];
f3.callback = [module '(''fchange'',3)'];
f4.callback = [module '(''fchange'',4)'];
function [Rp,Rs,f1,f2,f3,f4] = ...
setupMeasurementObjects(specStruc,Fs,order,order1,stopframe1,ax,...
pbmeasures,sbmeasures,sbspecs,Rp,Rs,Fs1m,Fs2m,f1,f2,f3,f4)
% set values of MEASUREMENTS objects ... assumes specStruct is current
setOrderFlag = specStruc.setOrderFlag;
type = specStruc.type;
f = specStruc.f;
Rpass = specStruc.Rp;
Rstop = specStruc.Rs;
Fstop = specStruc.Fstop;
N = specStruc.order;
if ~setOrderFlag % estimate order
set(order1,'visible','on')
set(pbmeasures(1),'visible','off')
set(pbmeasures(2),'visible','off')
set(pbmeasures(3),'visible','off')
set(sbmeasures(3),'visible','off')
set(Fs1m,'visible','on','value',Fstop(1)*Fs/2,...
'format','%1.4g')
if type > 2
set(Fs1m,'label','Actual Fs1')
set(Fs2m,'visible','on','value',Fstop(2)*Fs/2,...
'format','%1.4g','label','Actual Fs2')
else
set(Fs1m,'label','Actual Fs')
set(Fs2m,'visible','off')
end
order.value = N;
else
set(order1,'visible','off')
stopframe1.visible = 'on';
pbmeasures(1).visible = 'on';
sbmeasures(1).visible = 'on';
[f1,f2,f3,f4] = setupFrequencyObjects(type,'fdcheby2',pbmeasures,...
sbspecs,f,Fs,ax,0);
Rp = pbmeasures(3);
set(Rp,'value',Rpass,'label','Rp',...
'visible','on','callback','fdcheby2(''Rpchange'')')
set(Fs1m,'visible','off')
set(Fs2m,'visible','off')
end
for i=1:3
set(pbmeasures(i),'enable','on')
set(sbmeasures(i),'enable','on')
end
set(order1,'enable','on')
function [Rp,Rs,f1,f2,f3,f4,specStruc] = ...
measureFilt(objSetupFlag,specStruc,Fs,order,order1,stopframe1,ax,...
pbmeasures,sbmeasures,sbspecs,Rp,Rs,Fs1m,Fs2m,f1,f2,f3,f4,...
ff,Hlog,L1,L2)
if objSetupFlag
[Rp,Rs,f1,f2,f3,f4] = ...
setupMeasurementObjects(specStruc,Fs,order,order1,stopframe1,ax,...
pbmeasures,sbmeasures,sbspecs,Rp,Rs,Fs1m,Fs2m,f1,f2,f3,f4);
end
n = specStruc.order;
f = specStruc.f;
setOrderFlag = specStruc.setOrderFlag;
Fstop = specStruc.Fstop;
set(f1,'range',[0 Fs/2])
set(f2,'range',[0 Fs/2])
set(f3,'range',[0 Fs/2])
set(f4,'range',[0 Fs/2])
if ~setOrderFlag
order.value = n;
Fs1m.value = Fstop(1) * Fs/2;
if length(Fstop)>1
Fs2m.value = Fstop(2) * Fs/2;
end
%[maxpass,minpass,minstop] = getMagMeasurements(ff,Hlog,specStruc.type,...
% f1.value,f2.value,f3.value,f4.value);
%Rpm.value = maxpass - minpass;
else
fm = getFreqMeasurements(ff,Hlog,specStruc.type,...
Rp.value,Rs.value,Fstop*Fs/2);
f1.value = fm(1); f2.value = fm(2);
if length(fm)>2
f3.value = fm(3); f4.value = fm(4);
end
%fdutil('updateRanges',1:length(fm),f1,f2,f3,f4) % update ranges
f = [0 fm(:)' Fs/2 0]; % for updating L1 and L2 later;
% extra zero is for call to xlimpassband when
% type == 1 or 2
ax.xlimPassband = fdutil('xlimpassband',specStruc.type,...
Fs,f(2),f(3),f(4),f(5));
f = f*2/Fs;
specStruc.f = f;
end
maxpass = 0; minpass = -Rp.value; minstop = -Rs.value;
ylim = [-Rp.value 0];
dyl = (ylim(2)-ylim(1))*.15;
ax.ylimPassband = ylim + [-dyl/2 dyl/2];
% update L1 and L2 xdata and ydata, pointers, dragmodes
fdutil('setLines','fdcheby2',L1,L2,0,...
specStruc.type,f(:)',Fs,minpass,maxpass,minstop)
function f = getFrequencyValues(type,f1,f2,f3,f4,Fs);
if type < 3 % low or high pass
f = [0 f1.value f2.value Fs/2]*2/Fs;
else
f = [0 f1.value f2.value f3.value f4.value Fs/2]*2/Fs;
end
function [setOrderFlag_init, type_init, f_init, Rp_init, Rs_init, ...
order_init, Fstop_init] = initSpecs(filt)
%initSpecs Initial specifications for cheby2 filter, from
% filt input
%Switches off of filt.currentModule and if it finds any of
% fdcheby1, fdbutter, fdellip, fdremez, fdfirls, or fdkaiser
% retains the type, order, band edge, and any other relevant
% parameters
% first define default values
setOrderFlag_init = 0; % by default, estimate order
type_init = 1; % 1=lowpass, 2=highpass, 3=bandpass, 4=bandstop
f_init = [0 .2 .25 1];
Rp_init = 3;
Rs_init = 20;
order_init = 30;
Fstop_init = .22;
switch filt.specs.currentModule
case {'fdcheby1','fdbutter','fdellip','fdremez','fdkaiser','fdfirls'}
s = eval(['filt.specs.' filt.specs.currentModule]);
setOrderFlag_init = s.setOrderFlag;
type_init = s.type;
f_init = s.f;
Rp_init = s.Rp;
Rs_init = s.Rs;
order_init = s.order;
switch filt.specs.currentModule
case 'fdcheby1'
Fstop_init = s.Fpass;
case 'fdbutter'
Fstop_init = s.w3db;
case 'fdellip'
Fstop_init = s.Fpass;
case {'fdremez','fdfirls'}
switch s.type
case {1,2}
Fstop_init = s.f(3);
case 3
Fstop_init = s.f([2 5]);
case 4
Fstop_init = s.f(3:4);
end
case 'fdkaiser'
Fstop_init = s.Wn;
end
if any(strcmp(filt.specs.currentModule,...
{'fdremez','fdkaiser','fdfirls'}))
order_init = ceil(order_init/10);
% FIR filters are much higher order than IIR
end
case 'fdcheby2'
if isfield(filt.specs,'fdcheby2')
setOrderFlag_init = filt.specs.fdcheby2.setOrderFlag;
type_init = filt.specs.fdcheby2.type;
f_init = filt.specs.fdcheby2.f;
Rp_init = filt.specs.fdcheby2.Rp;
Rs_init = filt.specs.fdcheby2.Rs;
order_init = filt.specs.fdcheby2.order;
Fstop_init = filt.specs.fdcheby2.Fstop;
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -