


% Compute the group delay of a filter.
%
% [g, w] = grpdelay(b)
% returns the group delay g of the FIR filter with coefficients b.
% The response is evaluated at 512 angular frequencies between 0 and
% pi. w is a vector containing the 512 frequencies.
% The group delay is in units of samples. It can be converted
% to seconds by multiplying by the sampling period (or dividing by
% the sampling rate fs).
%
% [g, w] = grpdelay(b,a)
% returns the group delay of the rational IIR filter whose numerator
% has coefficients b and denominator coefficients a.
%
% [g, w] = grpdelay(b,a,n)
% returns the group delay evaluated at n angular frequencies. For fastest
% computation n should factor into a small number of small primes.
%
% [g, w] = grpdelay(b,a,n,'whole')
% evaluates the group delay at n frequencies between 0 and 2*pi.
%
% [g, f] = grpdelay(b,a,n,Fs)
% evaluates the group delay at n frequencies between 0 and Fs/2.
%
% [g, f] = grpdelay(b,a,n,'whole',Fs)
% evaluates the group delay at n frequencies between 0 and Fs.
%
% [g, w] = grpdelay(b,a,w)
% evaluates the group delay at frequencies w (radians per sample).
%
% [g, f] = grpdelay(b,a,f,Fs)
% evaluates the group delay at frequencies f (in Hz).
%
% grpdelay(...)
% plots the group delay vs. frequency.
%
% If the denominator of the computation becomes too small, the group delay
% is set to zero. (The group delay approaches infinity when
% there are poles or zeros very close to the unit circle in the z plane.)
%
% Theory: group delay, g(w) = -d/dw [arg{H(e^jw)}], is the rate of change of
% phase with respect to frequency. It can be computed as:
%
% d/dw H(e^-jw)
% g(w) = -------------
% H(e^-jw)
%
% where
% H(z) = B(z)/A(z) = sum(b_k z^k)/sum(a_k z^k).
%
% By the quotient rule,
% A(z) d/dw B(z) - B(z) d/dw A(z)
% d/dw H(z) = -------------------------------
% A(z) A(z)
% Substituting into the expression above yields:
% A dB - B dA
% g(w) = ----------- = dB/B - dA/A
% A B
%
% Note that,
% d/dw B(e^-jw) = sum(k b_k e^-jwk)
% d/dw A(e^-jw) = sum(k a_k e^-jwk)
% which is just the FFT of the coefficients multiplied by a ramp.
%
% As a further optimization when nfft>>length(a), the IIR filter (b,a)
% is converted to the FIR filter conv(b,fliplr(conj(a))).
% For further details, see
% http://ccrma.stanford.edu/~jos/filters/Numerical_Computation_Group_Delay.html