krfilter2ksig, iM, iN, ib0, ib1, ..., ibM, ia1, ia2, ..., iaN arfilter2asig, iM, iN, ib0, ib1, ..., ibM, ia1, ia2, ..., iaN arzfilter2asig, kdamp, kfreq, iM, iN, ib0, ib1, ..., ibM, ia1,ia2, ..., iaN

General purpose custom filter with time-varying pole control. The filter coefficients implement the following difference equation:

(1)*y(n) = b0*x[n] + b1*x[n-1] +...+ bM*x[n-M] - a1*y[n-1] -...- aN*y[n-N]

the system function for which is represented by:

B(Z) b0 + b1*Z^{-1}+ ... + bM*Z^{-M+1}H(Z) = ---- = -------------------------- A(Z) 1 + a1*Z^{-1}+ ... + aN*Z^{-N}

At initialization the number of zeros and poles of the filter are specified along with the corresponding zero and pole coefficients. The coefficients must be obtained by an external filter-design application such as Matlab and specified directly or loaded into a table via **GEN01**. With **zfilter2,** the roots of the characteristic polynomials are solved at initialization so that the pole-control operations can be implemented efficiently.

The** filter2** opcodes perform filtering using a transposed form-II digital filter lattice with no time-varying control. **zfilter2** uses the additional operations of radial pole-shearing and angular pole-warping in the Z plane.

Pole shearing increases the magnitude of poles along radial lines in the Z-plane. This has the affect of altering filter ring times. The k-rate variable *kdamp* is the damping parameter. Positive values (0.01 to 0.99) increase the ring-time of the filter (hi-Q), negative values (-0.01 to -0.99) decrease the ring-time of the filter, (lo-Q).

Pole warping changes the frequency of poles by moving them along angular paths in the Z plane. This operation leaves the shape of the magnitude response unchanged but alters the frequencies by a constant factor (preserving 0 and p). The k-rate variable *kfreq* determines the frequency warp factor. Positive values (0.01 to 0.99) increase frequencies toward p and negative values (-0.01 to -0.99) decrease frequencies toward 0.

Since **filter2** implements generalized recursive filters, it can be used to specify a large range of general DSP algorithms. For example, a digital waveguide can be implemented for musical instrument modeling using a pair of **delayr** and **delayw** opcodes in conjunction with the **filter2** opcode.

A first-order linear-phase lowpass linear-phase FIR filter operating on a k-rate signal:

k1filter2ksig, 2, 0, 0.5, 0.5 ;; k-rate FIR filter

A controllable second-order IIR filter operating on an a-rate signal:

a1zfilter2asig, kdamp, kfreq, 1, 2, 1, ia1, ia2 ; controllable a-rate ; IIR filter

The k-rate version of **filter2** was originally called **kfilter2**. As of Csound version 3.493, this name is deprecated. **filter2** should be used instead of **kfilter2**. The opcode determines its rate from the output argument.

Michael A. Casey

M.I.T.

Cambridge, Mass.

1997