📄 fdutil.m
字号:
set(L2,'xdata',[f(1:2)]*Fs/2,'ydata',[minstop minstop])
if ~setOrderFlag
set(L2,...
'vertexdragmode',{'none' 'lr'},...
'vertexdragcallback',...
{'' [module '(''L2drag'',2,2)']},...
'vertexpointer',{'' 'lrdrag'})
end
case 3 % bandpass
set(L1,'xdata',[f(3:4) NaN f(3:4)]*Fs/2,...
'ydata',[maxpass maxpass NaN minpass minpass])
if ~setOrderFlag
set(L1,...
'vertexdragmode',{'lr' 'lr' 'none' 'lr' 'lr'},...
'vertexdragcallback',...
{[module '(''L1drag'',3,1)'] [module '(''L1drag'',3,2)'] '' ...
[module '(''L1drag'',3,4)'] [module '(''L1drag'',3,5)']},...
'vertexpointer',{'lrdrag' 'lrdrag' '' 'lrdrag' 'lrdrag'})
end
set(L2,'xdata',[f(1:2) NaN f(5:6)]*Fs/2,...
'ydata',[ minstop minstop NaN minstop minstop])
if ~setOrderFlag
set(L2,...
'vertexdragmode',{'none' 'lr' 'none' 'lr' 'none'},...
'vertexdragcallback',...
{'' [module '(''L2drag'',3,2)'] '' ...
[module '(''L2drag'',3,4)'] ''},...
'vertexpointer',{'' 'lrdrag' '' 'lrdrag' ''})
end
case 4 % bandstop
set(L1,'xdata',[f(1:2) NaN f(1:2) NaN f(5:6) NaN f(5:6)]*Fs/2,...
'ydata',[ maxpass maxpass NaN minpass minpass NaN ...
maxpass maxpass NaN minpass minpass])
if ~setOrderFlag
set(L1,...
'vertexdragmode',{'none' 'lr' 'none' 'none' 'lr' 'none'...
'lr' 'none' 'none' 'lr' 'none'},...
'vertexdragcallback',...
{'' [module '(''L1drag'',4,2)'] '' '' ...
[module '(''L1drag'',4,5)'] '' ...
[module '(''L1drag'',4,7)'] '' '' ...
[module '(''L1drag'',4,10)'] ''},...
'vertexpointer',{'' 'lrdrag' '' '' 'lrdrag' '' 'lrdrag' '' '' ...
'lrdrag' ''})
end
set(L2,'xdata',[f(3:4)]*Fs/2,'ydata',[minstop minstop])
if ~setOrderFlag
set(L2,...
'vertexdragmode',{'lr' 'lr'},...
'vertexdragcallback',...
{[module '(''L2drag'',4,1)'] [module '(''L2drag'',4,2)']},...
'vertexpointer',{'lrdrag' 'lrdrag'})
end
end
if setOrderFlag
set(L1,'vertexdragmode',{'none'},'vertexpointer',{''})
set(L2,'vertexdragmode',{'none'},'vertexpointer',{''})
end
switch type
case 1 % lowpass
if ~dragUpperPassband
set(L1,'segmentdragmode',{'none' 'none' 'none' 'ud'},...
'segmentdragcallback',...
{'' '' '' [module '(''Rpdrag'',1,4)']},...
'segmentpointer',{'' '' '' 'uddrag'})
else
set(L1,'segmentdragmode',{'ud' 'none' 'none' 'ud'},...
'segmentdragcallback',...
{[module '(''Rpdrag'',1,1)'] '' ...
'' [module '(''Rpdrag'',1,4)']},...
'segmentpointer',{'uddrag' '' '' 'uddrag'})
end
set(L2,'segmentdragmode',{'ud'},...
'segmentdragcallback',{[module '(''Rsdrag'',1,1)']},...
'segmentpointer',{'uddrag'})
case 2 % highpass
if ~dragUpperPassband
set(L1,'segmentdragmode',{'ud'},...
'segmentdragcallback',...
{'' '' '' [module '(''Rpdrag'',2,4)']},...
'segmentpointer',{'' '' '' 'uddrag'})
else
set(L1,'segmentdragmode',{'ud'},...
'segmentdragcallback',...
{[module '(''Rpdrag'',2,1)'] '' ...
'' [module '(''Rpdrag'',2,4)']},...
'segmentpointer',{'uddrag' '' '' 'uddrag'})
end
set(L2,'segmentdragmode',{'ud' 'none' 'none' 'ud'},...
'segmentdragcallback',{[module '(''Rsdrag'',2,1)']},...
'segmentpointer',{'uddrag'})
case 3 % bandpass
if ~dragUpperPassband
set(L1,'segmentdragmode',{'none' 'none' 'none' 'ud'},...
'segmentdragcallback',...
{'' '' '' [module '(''Rpdrag'',3,4)']},...
'segmentpointer',{'' '' '' 'uddrag'})
else
set(L1,'segmentdragmode',{'ud' 'none' 'none' 'ud'},...
'segmentdragcallback',...
{[module '(''Rpdrag'',3,1)'] '' ...
'' [module '(''Rpdrag'',3,4)']},...
'segmentpointer',{'uddrag' '' '' 'uddrag'})
end
set(L2,'segmentdragmode',{'ud' '' '' 'ud'},...
'segmentdragcallback',...
{[module '(''Rsdrag'',3,1)'] '' '' [module '(''Rsdrag'',3,4)']},...
'segmentpointer',{'uddrag' '' '' 'uddrag'})
case 4 % bandstop
if ~dragUpperPassband
set(L1,'segmentdragmode',{'none' 'none' 'none' 'ud' 'none' 'none'...
'none' 'none' 'none' 'ud'},...
'segmentdragcallback',...
{'' '' '' ...
[module '(''Rpdrag'',4,4)'] '' '' ...
'' '' '' ...
[module '(''Rpdrag'',4,10)']},...
'segmentpointer',{'' '' '' 'uddrag' '' '' '' '' '' 'uddrag'})
else
set(L1,'segmentdragmode',{'ud' 'none' 'none' 'ud' 'none' 'none'...
'ud' 'none' 'none' 'ud'},...
'segmentdragcallback',...
{[module '(''Rpdrag'',4,1)'] '' '' ...
[module '(''Rpdrag'',4,4)'] '' '' ...
[module '(''Rpdrag'',4,7)'] '' '' ...
[module '(''Rpdrag'',4,10)']},...
'segmentpointer',{'' '' '' 'uddrag' '' '' '' '' '' 'uddrag'})
end
set(L2,'segmentdragmode',{'ud'},...
'segmentdragcallback',{[module '(''Rsdrag'',4,1)']},...
'segmentpointer',{'uddrag'})
end
function [newfilt, errstr] = callModuleApply(module,filt,msg,varargin)
% wrapper for feval of module's apply function, in case it errors out
newfilt = filt; % in case of error, return same filter that was passed in
errstr = ''; % assume no error
apply_err = 0;
eval('[newfilt, errstr]=feval(module,''apply'',filt,msg,varargin{:});',...
'apply_err = 1;')
if apply_err
errstr = lasterr;
end
function pokeFilterMeasurements(module,type,f1,f2,f3,f4,Rp,Rs,Fs)
% This function is called by the modules
% fdkaiser fdbutter fdcheby1 fdcheby2
% after a measurement has been edited (or a red line dragged).
% This will update the filter spec in the filter designer
% according to the new values of the measurements. Note that
% the filter will NOT be imported into the SPTool, until it has
% been redesigned.
fig = get(f1,'parent');
ud = get(fig,'userdata');
f = getFrequencyValues(type,f1,f2,f3,f4,Fs);
moduleSpecs = getfield(ud.filt.specs,module);
moduleSpecs.f = f;
moduleSpecs.Rp = get(Rp,'value');
moduleSpecs.Rs = get(Rs,'value');
ud.filt.specs = setfield(ud.filt.specs,module,moduleSpecs);
set(fig,'userdata',ud)
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 newspecs = updateSpecStruc(specs)
% update version '1.0' filter design structure to version '2.0'
if isempty(specs)
newspecs = specs;
return
end
% first get common fields
moduleSpecs.setOrderFlag = (specs.ordermode == 2);
moduleSpecs.type = specs.type;
moduleSpecs.f = [0; specs.f(:); 1];
moduleSpecs.Rp = specs.Rp;
moduleSpecs.Rs = specs.Rs;
if specs.ordermode == 1
moduleSpecs.order = specs.order.auto;
else
moduleSpecs.order = specs.order.manual;
end
if specs.specialparamsmode == 1
special = specs.special.auto;
else
special = specs.special.manual;
end
switch specs.method
case 1
newspecs.currentModule = 'fdremez';
newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
if specs.type == 1 | specs.type == 4
newspecs.fdremez.wt = special([1 2]);
else
newspecs.fdremez.wt = special([2 1]);
end
case 2
newspecs.currentModule = 'fdfirls';
newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
newspecs.fdfirls.setOrderFlag = 1;
if specs.type == 1 | specs.type == 4
newspecs.fdfirls.wt = special([1 2]);
else
newspecs.fdfirls.wt = special([2 1]);
end
case 3
newspecs.currentModule = 'fdkaiser';
newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
newspecs.fdkaiser.Wn = special(2:end);
newspecs.fdkaiser.Beta = special(1);
newspecs.fdkaiser.wind = kaiser(newspecs.fdkaiser.order+1,newspecs.fdkaiser.Beta);
case 4
newspecs.currentModule = 'fdbutter';
newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
newspecs.fdbutter.w3db = special;
case 5
newspecs.currentModule = 'fdcheby1';
newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
newspecs.fdcheby1.Fpass = special;
case 6
newspecs.currentModule = 'fdcheby2';
newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
newspecs.fdcheby2.Fstop = special;
case 7
newspecs.currentModule = 'fdellip';
newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
newspecs.fdellip.Fpass = special;
end
function y = rmax(x)
% Y=RMAX(X) RUNNING MAXIMUM
y = x;
[ind,peaks] = findpeaks(y);
[sortPeak,sortPeakInd] = sort(peaks);
ind = ind(sortPeakInd);
for i = 1:length(ind)
if i < length(ind)
nextPeakInd = min(ind(i+1:end))-1;
jkl = find(y(ind(i):nextPeakInd) <= sortPeak(i));
y(ind(i):(ind(i)+length(jkl)-1)) = sortPeak(i);
else
y(ind(i):end) = sortPeak(i);
end
end
function y = rmin(x)
% Y=RMIN(X) RUNNING MINIMUM
y = -rmax(-x);
function showBandConfigWindow(fig,h)
% Put up a figure to help people understand how the parameters
% describe the filter specifications
cfig = findobj(allchild(0),'tag','BandConfigWindow');
if isempty(cfig)
% create figure
cfig = figure('name','Band Configurations','tag','BandConfigWindow');
end
figure(cfig)
co = get(0,'defaultaxescolororder');
filt1 = [
0.017943
0.030958
-0.018458
-0.1084
-0.081255
0.15304
0.40953
0.40953
0.15304
-0.081255
-0.1084
-0.018458
0.030958
0.017943];
filt2 = [
-0.0033438
-0.011265
0.049015
-0.05273
-0.027279
0.092079
0.032446
-0.31319
0.46599
-0.31319
0.032446
0.092079
-0.027279
-0.05273
0.049015
-0.011265
-0.0033438];
filt3 = [
0.013158
-0.015591
-0.034564
0.018044
0.0080384
0.048938
0.10829
-0.18719
-0.25071
0.2891
0.2891
-0.25071
-0.18719
0.10829
0.048938
0.0080384
0.018044
-0.034564
-0.015591
0.013158];
filt4 = [
-0.038718
-4.2476e-06
-0.10237
-1.6168e-05
-0.0014099
-2.6903e-05
0.31052
-3.1884e-05
0.50141
-3.1884e-05
0.31052
-2.6903e-05
-0.0014099
-1.6168e-05
-0.10237
-4.2476e-06
-0.038718];
warnsave = warning;
warning off % turn off in case log of 0 shows up
% LOWPASS
subplot(2,2,1)
h1=plot([0 .4 NaN 0 .4 NaN .6 1],[2 2 NaN -2 -2 NaN -40 -40]);
set(h1,'color',co(2,:),'linewidth',2)
set(gca,'xtick',[0 .4 .6 1],'xticklabel',{'0','Fp','Fs','Fsamp/2'})
set(gca,'ytick',[-40 -2 2],'yticklabel',{'-Rs','',''})
t1=text(0,0,'Rp \{ ');
set(t1,'horizontalalignment','right','clipping','off')
title('Lowpass')
grid on
[H,f]=freqz(filt1,1,300);
hold on, plot(f/pi,20*log10(abs(H))); hold off
set(gca,'ylim',[-60 10],'xlim',[0 1])
% HIGHPASS
subplot(2,2,2)
h1=plot([.6 1 NaN .6 1 NaN 0 .4],[2 2 NaN -2 -2 NaN -40 -40]);
set(h1,'color',co(2,:),'linewidth',2)
set(gca,'xtick',[0 .4 .6 1],'xticklabel',{'0','Fs','Fp','Fsamp/2'})
set(gca,'ytick',[-40 -2 2],'yticklabel',{'-Rs','',''})
t1=text(0,0,'Rp \{ ');
set(t1,'horizontalalignment','right','clipping','off')
title('Highpass')
grid on
[H,f]=freqz(filt2,1,300);
hold on, plot(f/pi,20*log10(abs(H))); hold off
set(gca,'ylim',[-60 10],'xlim',[0 1])
% BANDPASS
subplot(2,2,3)
h1=plot([0 .2 NaN .35 .65 NaN .35 .65 NaN .8 1],[-40 -40 NaN 2 2 NaN -2 -2 NaN -40 -40]);
set(h1,'color',co(2,:),'linewidth',2)
set(gca,'xtick',[0 .2 .35 .65 .8 1],...
'xticklabel',{'0','Fs1','Fp1','Fp2','Fs2','Fsamp/2'})
set(gca,'ytick',[-40 -2 2],'yticklabel',{'-Rs','',''})
t1=text(0,0,'Rp \{ ');
set(t1,'horizontalalignment','right','clipping','off')
title('Bandpass')
grid on
[H,f]=freqz(filt3,1,300);
hold on, plot(f/pi,20*log10(abs(H))); hold off
set(gca,'ylim',[-60 10],'xlim',[0 1])
% BANDSTOP
subplot(2,2,4)
h1=plot([0 .2 NaN 0 .2 NaN .35 .65 NaN .8 1 NaN .8 1],...
[2 2 NaN -2 -2 NaN -40 -40 NaN 2 2 NaN -2 -2]);
set(h1,'color',co(2,:),'linewidth',2)
set(gca,'xtick',[0 .2 .35 .65 .8 1],...
'xticklabel',{'0','Fp1','Fs1','Fs2','Fp2','Fsamp/2'})
set(gca,'ytick',[-40 -2 2],'yticklabel',{'-Rs','',''})
t1=text(0,0,'Rp \{ ');
set(t1,'horizontalalignment','right','clipping','off')
title('Bandstop')
grid on
[H,f]=freqz(filt4,1,300);
hold on, plot(f/pi,20*log10(abs(H))); hold off
set(gca,'ylim',[-60 10],'xlim',[0 1])
warning(warnsave)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -