📄 fdcheby1.m
字号:
end
if type > 2
fchange_ind = (i==(1:4)) * [1 4; 2 3; 2 3; 1 4];
else
fchange_ind = i;
end
updateLines(0,type,fchange_ind,f1,f2,f3,f4,Rp,Rs,Fs)
fdutil('pokeFilterMeasurements','fdcheby1',type,f1,f2,f3,f4,Rp,Rs,Fs)
function RChangeMeas(passbandChange,type,Fs,Lresp,L1,L2,f1,f2,f3,f4,Rp,Rs)
%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 cheby1, only dragging Rs is allowed in this fashion, so
% passbandChange is assumed 0 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;
Rs_val = get(Rs,'value');
[Fstop,Rs_val1] = getFreqMeasurements(ff,Hlog,type,Rp.value,Rs_val);
if Rs_val ~= Rs_val1
set(Rs,'value',Rs_val1)
end
%Fstop = getFreqMeasurements(ff,Hlog,type,Rp.value,Rs.value);
i = []; % which frequencies have changed
switch type
case 1
f2.value = Fstop;
i = [i 2];
case 2
f1.value = Fstop;
i = [1 i];
case 3 % bandpass - update f2 f3
f1.value = Fstop(1);
f4.value = Fstop(2);
i = [1 i 4];
case 4 % bandstop - update f1 f4
f2.value = Fstop(1);
f3.value = Fstop(2);
i = sort([i 2 3]);
end
updateLines(passbandChange,type,i,f1,f2,f3,f4,Rp,Rs,Fs)
fdutil('pokeFilterMeasurements','fdcheby1',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,Fstop,Fs,order,order1,stopframe1,ax,...
pbmeasures,sbmeasures,pbspecs,...
sbspecs,Rp,Rs,Fs1m,Fs2m,f1,f2,f3,f4)
%function setupMeasurementObjects(specStruc,Fstop,Fs,...
% order1,sbmeasures,Fs1m,Fs2m)
% set values of MEASUREMENTS objects ... assumes specStruct is current
setOrderFlag = specStruc.setOrderFlag;
type = specStruc.type;
f = specStruc.f;
Rpass = specStruc.Rp;
Rstop = specStruc.Rs;
Fpass = specStruc.Fpass;
N = specStruc.order;
if ~setOrderFlag % estimate order
set(order1,'visible','on')
fdutil('changeToText',sbmeasures(1:2))
set(sbmeasures(3),'visible','off')
set(Fs1m,'visible','on','value',Fstop(1),...
'format','%1.4g')
if type > 2
set(Fs1m,'label','Actual Fs1')
set(Fs2m,'visible','on','value',Fstop(2),...
'format','%1.4g','label','Actual Fs2')
else
set(Fs1m,'label','Actual Fs')
set(Fs2m,'visible','off')
end
order1.value = N;
else % set order
set(order1,'visible','off')
set(sbspecs(1),'visible','off')
set(sbspecs(2),'visible','off')
set(sbspecs(3),'visible','off')
fdutil('changeToEdit',sbmeasures(1:2))
set(sbmeasures(3),'visible','on')
[f1,f2,f3,f4] = setupFrequencyObjects(type,'fdcheby1',pbspecs,...
sbmeasures,f,Fs,ax,0);
set(sbmeasures(1),'value',Fstop(1))
if type > 2
set(sbmeasures(2),'value',Fstop(2))
end
Rs = sbmeasures(3);
set(Rs,'value',Rstop,'label','Rs',...
'visible','on','callback','fdcheby1(''Rschange'')')
end
for i=1:3
set(sbmeasures(i),'enable','on')
end
set(order1,'enable','on')
%function specStruc = measureFilt(objSetupFlag,specStruc,Fs,order1,...
% sbmeasures,Fs1m,Fs2m,ff,Hlog,L1,L2,ax)
function [Rp,Rs,f1,f2,f3,f4,specStruc] = ...
measureFilt(objSetupFlag,specStruc,Fs,order,order1,stopframe1,ax,...
pbmeasures,sbmeasures,pbspecs,sbspecs,Rp,Rs,Fs1m,Fs2m,f1,f2,f3,f4,...
ff,Hlog,L1,L2);
n = specStruc.order;
setOrderFlag = specStruc.setOrderFlag;
Fpass = specStruc.Fpass*Fs/2;
[Fstop,Rs_val] = getFreqMeasurements(ff,Hlog,specStruc.type,...
specStruc.Rp,specStruc.Rs);
Rs.value = Rs_val;
if objSetupFlag
[Rp,Rs,f1,f2,f3,f4] = ...
setupMeasurementObjects(specStruc,Fstop,Fs,order,order1,stopframe1,ax,...
pbmeasures,sbmeasures,pbspecs,sbspecs,...
Rp,Rs,Fs1m,Fs2m,f1,f2,f3,f4);
%setupMeasurementObjects(specStruc,Fstop,Fs,...
% order1,sbmeasures,Fs1m,Fs2m)
else
set(Fs1m,'value',Fstop(1))
if specStruc.type > 2
set(Fs2m,'value',Fstop(2))
end
if ~setOrderFlag
order1.value = n;
end
end
if setOrderFlag
% Update stopband edges in specStruc frequency vector:
switch specStruc.type
case 1
f = [0 Fpass Fstop Fs/2];
case 2
f = [0 Fstop Fpass Fs/2];
case 3
f = [0 Fstop(1) Fpass(:)' Fstop(2) Fs/2];
case 4
f = [0 Fpass(1) Fstop(:)' Fpass(2) Fs/2];
end
specStruc.f = f*2/Fs;
else
f = specStruc.f*Fs/2;
end
maxpass = 0; minpass = -specStruc.Rp; minstop = -specStruc.Rs;
% update L1 and L2 xdata and ydata, pointers, dragmodes
fdutil('setLines','fdcheby1',L1,L2,0,...
specStruc.type,specStruc.f(:)',...
Fs,minpass,maxpass,minstop)
% update [ylim/xlim] passband limits
ylim = [minpass maxpass];
dyl = (ylim(2)-ylim(1))*.15;
set(ax,'ylimPassband',ylim + [-dyl/2 dyl/2]);
ax.xlimPassband = fdutil('xlimpassband',specStruc.type,...
Fs,f(2),f(3),f(end-2),f(end-1));
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, Fpass_init] = initSpecs(filt)
%initSpecs Initial specifications for cheby 1 filter, from
% filt input
%Switches off of filt.currentModule and if it finds any of
% fdellip, fdbutter, fdcheby2, 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;
Fpass_init = .22;
switch filt.specs.currentModule
case {'fdellip','fdbutter','fdcheby2','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 'fdellip'
Fpass_init = s.Fpass;
case 'fdbutter'
Fpass_init = s.w3db;
case 'fdcheby2'
Fpass_init = s.Fstop;
case {'fdremez','fdfirls'}
switch s.type
case {1,2}
Fpass_init = s.f(3);
case 3
Fpass_init = s.f([2 5]);
case 4
Fpass_init = s.f(3:4);
end
case 'fdkaiser'
Fpass_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 'fdcheby1'
if isfield(filt.specs,'fdcheby1')
setOrderFlag_init = filt.specs.fdcheby1.setOrderFlag;
type_init = filt.specs.fdcheby1.type;
f_init = filt.specs.fdcheby1.f;
Rp_init = filt.specs.fdcheby1.Rp;
Rs_init = filt.specs.fdcheby1.Rs;
order_init = filt.specs.fdcheby1.order;
Fpass_init = filt.specs.fdcheby1.Fpass;
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -