Main Content


Filter data using user-defined passbands, general filters, or Butterworth filters


Zf = idfilt(Z,filter)
Zf = idfilt(Z,filter,causality)
Zf = idfilt(Z,filter,'FilterOrder',NF)
Zf = idfilt(___,Name,Value)


Zf = idfilt(Z,filter) filters data using user-defined passbands, general filters, or Butterworth filters.

Z contains time-domain or frequency-domain input/output data. Z can be in the form of a timetable, a comma-separated pair of numeric matrices, or an iddata object.

Zf contains the filtered data in the same form as Z.

The filter can be defined in three ways:

  • As an explicit system that defines the filter.

    filter = idm or filter = {num,den} or filter = {A,B,C,D}

    idm can be any SISO identified linear model or LTI model object. Alternatively the filter can be defined as a cell array {A,B,C,D} of SISO state-space matrices or as a cell array {num,den} of numerator/denominator filter coefficients.

  • As a vector or matrix that defines one or several passbands.

    filter=[[wp1l,wp1h];[ wp2l,wp2h]; ....;[wpnl,wpnh]]

    The matrix is n-by-2, where each row defines a passband. A filter is constructed that gives the union of these passbands. For time-domain data, it is computed as cascaded Butterworth filters or order NF. The default value of NF is 5.

    • For time-domain data — The passbands are in units of rad/TimeUnit, where TimeUnit is the time units of the estimation data.

    • For frequency-domain data — The passbands are in the frequency units (FrequencyUnit property) of the estimation data.

    For example, to define a stopband between ws1 and ws2, use

    filter = [0 ws1; ws2,Nyqf]

    where Nyqf is the Nyquist frequency.

  • For frequency-domain data, only the frequency response of the filter can be specified.

    filter = Wf

    Here Wf is a vector of possibly complex values that define the filter's frequency response, so that the inputs and outputs at frequency Z.Frequency(kf) are multiplied by Wf(kf). Wf is a column vector of length = number of frequencies in Z. If the data object has several experiments, Wf is a cell array of length = # of experiments in Z.

Zf = idfilt(Z,filter,causality) specifies causality. For time-domain data, the filtering is carried out in the time domain as causal filtering as default. This corresponds to a last argument causality = 'causal'. With causality = 'noncausal', a noncausal, zero-phase filter is used for the filtering (corresponding to filtfilt in the Signal Processing Toolbox™ product).

For frequency-domain data, the signals are multiplied by the frequency response of the filter. With the filters defined as passband, this gives ideal, zero-phase filtering (“brickwall filters”). Frequencies that have been assigned zero weight by the filter (outside the passband, or via the frequency response) are removed from the iddata object Zf.

Zf = idfilt(Z,filter,'FilterOrder',NF) specifies the filter order. The time domain filters in the pass-band case are calculated as cascaded Butterworth pass-band and stop-band filters. The orders of these filters are 5 by default, which can be changed to an arbitrary integer NF.

It is common practice in identification to select a frequency band where the fit between model and data is concentrated. Often this corresponds to bandpass filtering with a passband over the interesting breakpoints in a Bode diagram. For identification where a disturbance model is also estimated, it is better to achieve the desired estimation result by using the 'WeightingFilter' option of the estimation command than just to prefilter the data. The values for 'WeightingFilter' are the same as the argument filter in idfilt.

Zf = idfilt(___,Name,Value) uses additional model options specified by one or more name-value arguments.

The available arguments consist of:

  • InputName and OutputName — Input and output channel names. Use these arguments especially when data is a timetable that has more variables than you want to use, or when there. Also use OutputName to identify the output channels when the timetable data contains more than one output variable. Otherwise, the software interprets only the last variable as an output channel.

    For example, specify the input and output signal variable names using sys = idfilt(data,'InputName',["u1","u3"],'OutputName',"y1"). You can use this syntax with any of the previous input-argument combinations.

  • Ts and TimeUnit — Sample time and time units. Use these arguments especially when you are data contains numeric matrices, which do not provide sample-time information.


The Butterworth filter is the same as butter in the Signal Processing Toolbox product. Also, the zero-phase filter is equivalent to filtfilt in that toolbox.


Ljung (1999), Chapter 14.

Version History

Introduced before R2006a

expand all

See Also