www.gusucode.com > signal 工具箱matlab源码程序 > signal/+fspecs/@bscutoffwbwp/cheby1.m

    function Hd = cheby1(this, varargin)
%CHEBY1 Chebyshev Type I digital filter design.

%   Copyright 1988-2012 The MathWorks, Inc.

N = this.FilterOrder;

nfreq = this.NormalizedFrequency;
normalizefreq(this, true);

Fc1 = this.F3dB1;
Fc2 = this.F3dB2;
BWp = this.BWpass;

normalizefreq(this, nfreq);

[isvalid, errmsg, errid] = checkincfreqs(this,{'F3dB1','F3dB2'});
if ~isvalid
    error(message(errid,errmsg));
end

% If design comes from a filter designer object, convert propNames to valid
% designer object names.
propNames = {'BWp','F3dB2','F3dB1'};
if isprop(this,'FromFilterDesigner') && this.FromFilterDesigner
  propNames = signal.internal.filterdesigner.convertpropnames(propNames);
elseif isprop(this,'FromDesignfilt') && this.FromDesignfilt
  propNames = signal.internal.DesignfiltProcessCheck.convertpropnames(propNames,'fdesignToDesignfilt');  
end

if BWp < (Fc2-Fc1),
    error(message('signal:fspecs:bscutoffwbwp:cheby1:invalidBWSpec', propNames{1}, [propNames{2} '-' propNames{3}]));
end

% Make up a 3dB point for digital lowpass (arbitrarily)
Fc = (Fc1+Fc2)/2; 

% Compute alpha
alpha = cos((Fc2+Fc1)*pi/2)/cos((Fc2-Fc1)*pi/2); 
% Compute k
k = tan(Fc*pi/2)*tan((Fc2-Fc1)*pi/2);

% Compute theoretical lowpass passband edge
Wc = tan(pi*Fc/2);

% Determine lowpass passband edge
Fp = 2*atan(k/tan(BWp*pi/2))/pi;

% Determine analog lowpass passband edge
Wp = tan(pi*Fp/2);

% Find epass, Apass
ep = 1/cosh((N/2)*acosh(Wc/Wp));
Ap = 10*log10(ep^2+1);

c1 = 2*alpha/(k+1);
c2 = (1-k)/(1+k);

% Solve LP to BS inverse Constantinides (Antoniou p.243)
j = complex(0,1);
z = exp(j*Fp*pi);
b = c1*(z-1);
ax2 = 0.5/(c2*z-1);
b2_4ac = sqrt(c1^2*(1-z)^2-4*(c2*z-1)*(z-c2));
Fp1 = abs(real(log(ax2*(b - b2_4ac))/(j*pi)));
Fp2 = abs(real(log(ax2*(b + b2_4ac))/(j*pi)));

% Convert to bandstop with passband-edge specifications
hs = fspecs.bspass(N,Fp1,Fp2,Ap);

Hd = cheby1(hs,varargin{:});

% [EOF]