Main Content

islinphase

Determine whether filter has linear phase

    Description

    flag = islinphase(b,a) returns a logical output equal to 1 if the specified filter is linear phase. Specify a filter with numerator coefficients b and denominator coefficients a.

    flag = islinphase(B,A,"ctf") returns 1 if the filter specified as Cascaded Transfer Functions (CTF) with numerator coefficients B and denominator coefficients A is linear phase. (since R2024b)

    example

    flag = islinphase({B,A,g},"ctf") returns 1 if the filter specified in CTF format is linear phase. Specify the filter with numerator coefficients B, denominator coefficients A, and scaling values g across filter sections. (since R2024b)

    example

    flag = islinphase(d) returns 1 if the digital filter d is linear phase.

    example

    flag = islinphase(sos) returns 1 if the filter specified by the second-order sections matrix sos is linear phase.

    example

    flag = islinphase(___,tol) specifies a tolerance tol to determine when two numbers are close enough to be considered equal.

    Examples

    collapse all

    Use the window method to design a tenth-order lowpass FIR filter with normalized cutoff frequency 0.55. Verify that the filter has linear phase.

    d = designfilt("lowpassfir",DesignMethod="window", ...
        FilterOrder=10,CutoffFrequency=0.55);
    flag = islinphase(d)
    flag = logical
       1
    
    
    [phs,w] = phasez(d);
    
    plot(w/pi,phs)
    xlabel("Normalized Frequency (\times\pi rad/sample)")
    ylabel("Phase (radians)")

    Figure contains an axes object. The axes object with xlabel Normalized Frequency ( times pi blank rad/sample), ylabel Phase (radians) contains an object of type line.

    IIR filters in general do not have linear phase. Verify the statement by constructing eighth-order Butterworth, Chebyshev, and elliptic filters with similar specifications.

    ord = 8;
    Wcut = 0.35;
    atten = 20;
    rippl = 1;
    
    [zb,pb,kb] = butter(ord,Wcut);
    sosB = zp2sos(zb,pb,kb);
    
    [zc,pc,kc] = cheby1(ord,rippl,Wcut);
    sosC1 = zp2sos(zc,pc,kc);
    
    [zd,pd,kd] = cheby2(ord,atten,Wcut);
    sosC2 = zp2sos(zd,pd,kd);
    
    [ze,pe,ke] = ellip(ord,rippl,atten,Wcut);
    sosE = zp2sos(ze,pe,ke);

    Plot the phase responses of the filters. Determine whether they have linear phase.

    phasez(sosB)
    hold on
    phasez(sosC1)
    phasez(sosC2)
    phasez(sosE)
    hold off
    ylim([-14 2])
    legend("Butterworth","Chebyshev I", ...
        "Chebyshev II","Elliptic",Location="best")

    Figure contains an axes object. The axes object with title Phase Response, xlabel Normalized Frequency ( times pi blank rad/sample), ylabel Phase (radians) contains 4 objects of type line. These objects represent Butterworth, Chebyshev I, Chebyshev II, Elliptic.

    phs = [islinphase(sosB) islinphase(sosC1) ...
           islinphase(sosC2) islinphase(sosE)]
    phs = 1×4 logical array
    
       0   0   0   0
    
    

    Since R2024b

    Design a 40th-order lowpass Chebyshev type II digital filter with a stopband edge frequency of 0.4 and stopband attenuation of 50 dB. Verify that the filter has linear phase using the filter coefficients in the CTF format.

    [B,A] = cheby2(40,50,0.4,"ctf");
    
    flag = islinphase(B,A,"ctf")
    flag = logical
       0
    
    

    Design a 30th-order bandpass elliptic digital filter with passband edge frequencies of 0.3 and 0.7, passband ripple of 0.1 dB, and stopband attenuation of 50 dB. Verify that the filter has linear phase using the filter coefficients and gain in the CTF format.

    [B,A,g] = ellip(30,0.1,50,[0.3 0.7],"ctf");
    flag = islinphase({B,A,g},"ctf")
    flag = logical
       0
    
    

    Input Arguments

    collapse all

    Transfer function coefficients, specified as a vector. The values of b and a represent the numerator and denominator polynomial coefficients, respectively.

    Example: [b,a] = cheby2(5,30,0.7) creates a digital 5th-order Butterworth lowpass filter with coefficients b and a, having a normalized 3 dB frequency of 0.7π rad/sample and 30 dB attenuation at stopband.

    Data Types: single | double
    Complex Number Support: Yes

    Since R2024b

    Cascaded transfer function (CTF) coefficients, specified as scalars, vectors, or matrices. B and A list the numerator and denominator coefficients of the cascaded transfer function, respectively.

    B must be of size L-by-(m + 1) and A must be of size L-by-(n + 1), where:

    • L represents the number of filter sections.

    • m represents the order of the filter numerators.

    • n represents the order of the filter denominators.

    For more information about the cascaded transfer function format and coefficient matrices, see Specify Digital Filters in CTF Format.

    Note

    If any element of A(:,1) is not equal to 1, then islinphase normalizes the filter coefficients by A(:,1). In this case, A(:,1) must be nonzero.

    Data Types: double | single
    Complex Number Support: Yes

    Since R2024b

    Scale values, specified as a real-valued scalar or as a real-valued vector with L + 1 elements, where L is the number of CTF sections. The scale values represent the distribution of the filter gain across sections of the cascaded filter representation.

    The islinphase function applies a gain to the filter sections using the scaleFilterSections function depending on how you specify g:

    • Scalar — The function distributes the gain uniformly across all filter sections.

    • Vector — The function applies the first L gain values to the corresponding filter sections and distributes the last gain value uniformly across all filter sections.

    Data Types: double | single

    Digital filter, specified as a digitalFilter object. Use designfilt to generate d based on frequency-response specifications.

    Example: designfilt("lowpassfir",FilterOrder=10,CutoffFrequency=0.55) generates a digitalFilter object for a 10th order FIR lowpass filter with a normalized 3 dB frequency of 0.55π rad/sample.

    Data Types: digitalFilter

    Second-order section representation, specified as an L-by-6 matrix, where L is the number of second-order sections. The matrix

    sos=[b01b11b211a11a21b02b12b221a12a22b0Lb1Lb2L1a1La2L]

    represents the second-order sections of H(z):

    H(z)=k=1LHk(z)=k=1Lb0k+b1kz1+b2kz21+a1kz1+a2kz2.

    Example: [z,p,k] = butter(3,1/32); sos = zp2sos(z,p,k) specifies a third-order Butterworth filter with a normalized 3 dB frequency of π/32 rad/sample.

    Data Types: single | double
    Complex Number Support: Yes

    Tolerance to distinguish between close numbers, specified as a positive scalar. The tolerance value determines when two numbers are close enough to be considered equal.

    Data Types: single | double

    Output Arguments

    collapse all

    Linear phase flag, returned as a logical scalar. The function returns 1 when the input is a minimum phase filter.

    More About

    collapse all

    Tips

    • You can obtain filters in CTF format, including the scaling gain. Use the outputs of digital IIR filter design functions, such as butter, cheby1, cheby2, and ellip. Specify the "ctf" filter-type argument in these functions and specify to return B, A, and g to get the scale values. (since R2024b)

    References

    [1] Lyons, Richard G. Understanding Digital Signal Processing. Upper Saddle River, NJ: Prentice Hall, 2004.

    Version History

    Introduced in R2013a

    expand all