Description of the included Matlab scripts

 

Compkautz.m

S=compkautz(a,N,x) produces tap-output signals of a complex Kautz filter, defined by a pole vector a, |a|<1, and excited by an input signal vector x. N is the desired length of the tap-output signals if N > length(x). Tap-output signals are the columns of the signal matrix S. Notice that S is real valued only in the case of real poles.

For example:

Mixkautz1.m

S=mixkautz1(a,N,x) produces tap-output signals of a real Kautz filter, defined by a pole vector a, excited by an input signal vector x, using a particular mixed structure for real and complex conjugate pole pairs. N is the desired length of the output, if N > length(X). Poles with imag(a)<0 are disregarded to avoid duplication produced by complex conjugate poles in a.

Mixkautz1.m works like compkautz.m (see the above examples), except for the filter order induced by the pole vector a. However, for a distribution of real and complex conjugate pair poles it is length(a).

For example:

Kautzapprx1.m

[c,E,h]=kautzapprx1(a,x) composes an approximation of a given response x using mixkautz1.m. The vector c contains the least-square optimal filter coefficients for approximating x with h=G*c, where G=mixkautz1(a,N,1) are the corresponding tap-output impulse responses, and N=length(x). E is the normalized root-mean-square error of the error signal x-h.

Coefficients c are the true orthonormal series-expansion coefficients (, the Fourier coefficient,) corresponding to the chosen Kautz structure. This fact is utilized in the evaluation of the coefficient: c’=S(N,:), S=mixkautz1(a,N,x(N:-1:1)), i.e., the convolution sums defining the coefficient are evaluated by filtering the time-inverted x and reading the tap-outputs at time N. Notice that the convolutions are in general infinite summations, but they can be implemented by finite filtering operations. This can be seen as a generalization of rectangular-window FIR filter design.

For example:

Kautzapprx2.m

[c,e ,h]=kautzapprx2(a,M,x) approximates x with the impulse response h of a real Kautz filter with M identical blocks, each block defined by the pole vector a. It produces the same h as kautzapprx1.m with a=a*ones(1,M), a=a(:), but it preserves the structure of identical blocks , i.e., the order in the coefficient vector c. This is a way to essentially separate the pole optimization procedure and the model order selection. According to the orthogonality, we get the approximation error associated to the number of block used in the approximation, i=1,…,M, in the form e(i)=x’*x – c(1:p*i)’*c(1:p*i), where p is the order of one block. Observing e(i), i=1,…,M, gives a trivial way to perform model reduction with respect to a fixed substructure defined by a

For example:

Braun1.m

An iterative method to optimize the pole positions defining a real Kautz filter. We have adopted this algorithm to the context of Kautz filters from a pure FIR-to-IIR filter conversion method proposed by Brandenstein and Unbehauen [1]. It resembles a lot the Steiglitz-McBride method of pole-zero modeling, but it genuinely optimizes the pole positions of the orthonormal representation, and not just the poles of a coupled rational overall structure. Furthermore, it produces always stable (and theoretically globally optimal) poles.

[e,Q]=braun1(N,I,x) uses I iterations to search for an Nth order Kautz structure to approximate x. Q(i,:) are the (Kautz filter common demonimator) polynomial coefficient and e(i) is the approximation (RMS) error as a function of the iterations, i=1,…,I. For sufficient I, we use roots(Q(k,:)), corresponding to minimum e from [m,k]=min(e), as the Kautz filter poles. Notice that this method doesn’t require intermediate evaluation of polynomial roots.

 For high orders N, and/or long signals x, braun1.m will cause warnings and take time. The error e may peak to NaN and Inf, but we should still get reasonable results. In our experience the algorithm works surprisingly well, even for really tough cases.

 For example:

Kautzdemo1.m

Kautzdemo1 is a demonstration of all the above Matlab functions. There is quite a lot of reading and at some points you may have to wait a while. One could argue that it would really need some chopping, but we have grabbed to this unique opportunity to awaken your interest in Kautz filters.

After an introduction, the user is requested to choose a pole distribution to work with. The consequent time and frequency responses produced by compkautz.m and mixkautz1.m are demonstrated. Kautzapprx1.m and kautzapprx2.m are presented using a measured acoustic guitar body response as the target response. The utilization of barun1.m is demonstrated in many ways.

Kautzdemo2.m

Kautzdemo2 is a case study type of Kautz filter design example concerning loudspeaker equalization. A pre-designed target response for the equalizer is used so the example deals with pure magnitude response equalization. The functions demonstrated are braun1.m and kautzapprx1.m, the latter implying the use of mixkautz1.m.

After presenting the measured, target equalized and equalizer responses, some straightforward FIR equalizers are presented for comparison. Results for Laguerre and two-pole Kautz equalizers are demonstrated for comparable filter orders. These are the most time-consuming calculations. Distributed pole set for the Kautz equalizers are composed using braun1.m. To really flatten a sharp and local deviation in the middle frequencies, 3 to 4 pole pairs are tuned manually and appended to the pole sets proposed by braun1.m. Finally the whole Kautz equalizer structure defined by 10 complex conjugate pole pairs is tuned manually. Equalization results accomplished during the process are compared those attained by Laguerre and FIR filtering.