www.gusucode.com > signal 工具箱matlab源码程序 > signal/@dfilt/@abstractcascadeallpass/iirxform.m

    function [Ht,anum,aden] = iirxform(Hd,fun,varargin)
%IIRXFORM IIR Transformations
%
%   Inputs:
%       Hd - Handle to original filter
%       fun - function handle to transformation
%
%   Outputs:
%       Hout - Transformed filter
%       anum - Allpass numerator
%       aden - Allpass denominator

%   Author(s): R. Losada
%   Copyright 1988-2006 The MathWorks, Inc.

c = coefficients(Hd);
ns = nsections(Hd);
allpassden = cell(ns,1);
isre = true;
isneg = false;
for k = 1:ns,
    a = [1 c{k}];
    b = fliplr(a);
    [num,den,anum,aden] = feval(fun,b,a,varargin{:});
    if isreal(num),
        if sign(num(end)) ~= sign(den(1)),
            isneg = true;
        end
        allpassden{k} = den(2:end);
    else
        isre = false;
        allpassden{k} = dfilt.df2(num,den);
    end
end

if isre,
    if isneg,
        Ht = cascade(dfilt.scalar(-1),feval(class(Hd),allpassden{:}));
    else        
        Ht = feval(class(Hd),allpassden{:});
    end
else
    % Complex case; cannot use dfilt.allpass
    if ns > 1,
        Ht  = cascade(allpassden{:});
    else
        Ht = allpassden{1};
    end
end