Next: , Previous: Example 1, Up: Tutorial

2.3 Example 2

In this example, we introduce the concept of weight. Recall that in most cases, the desired frequency response can only be approximated. It turns out that the “optimal” approximation exhibits a ripple around the desired frequency response. Using weights, you can decrease the amplitude of the ripple within certain bands at the cost of a larger ripple amplitude in other bands. Specifically in this example, we want to reduce the approximation error in the passband at the expense of a larger error in the stopband, in such a way that the maximum error in the passband is one fifth of the maximum error in the stopband. This goal can be attained with the following specification file.

     ; parameters as in Example 1
     (title "A simple filter II")
     (verbose #t)
     (filter-length 10)
     (sampling-frequency 60)
     (output-file "example-2.coef")
     (plot-file "example-2.plot")
     ; new specifications
     (limit-= (band 0 10) 1 .2)   ; .2 is the weight
     (limit-= (band 20 30) 0)     ; no weight specified ==> weight = 1

A graph of the frequency response follows.


Intuitively, this specification says that the passband [0..10] has weight .2, and therefore the passband error will be one fifth of the error in the stopband [20..30], where the weight is 1. gmeteor always finds the filter that minimizes the error over the whole frequency range. Unless you specify weights explicitly, gmeteor distributes the error uniformly over all bands. If you do specify weights, however, gmeteor spreads the error in each band according to its weight.

The previous intuitive explanation suffices for simple cases, but we need a more precise definition of a weight in order to design more complicated filters. To this extent, we now discuss the operation of gmeteor in more detail.

gmeteor's ultimate task is to find a frequency response H(f) that satisfies certain upper- and lower-bound constraints. For example, we might specify that H([0..10]) <= 1.1 and that H([0..10]) >= 0.9. Whenever you specify equality constraints with the limit-= command, gmeteor internally converts them into a pair of inequality constraints. In our example, gmeteor converts the specifications into the four constraints H([0..10]) <= 1, H([0..10]) >= 1, H([20..30]) <= 0, and H([20..30]) >= 0. Since these constraints are impossible to satisfy exactly with a FIR filter, gmeteor somewhat relaxes these constraints in order to compute the “optimal” approximation.

The constraint-relaxation algorithm works by introducing a deviation parameter, denoted by y. Specifically in our example, gmeteor rewrites the four constraints in this way: H([0..10]) + w[1] y <= 1, H([0..10]) - w[2] y >= 1, H([20..30]) + w[3] y <= 0, and H([20..30]) - w[4] y >= 0. (Note that the sign in front of w[i] y depends on the sense of the inequality.) The parameters w[i] are the weights. In our example, w[1] = w[2] = .2 and w[3] = w[4] = 1.

The optimal filter is defined as the one that maximizes y.

The optimal y is negative whenever constraints are violated, as in our example. Since the absolute value of y denotes the maximum weighted distance between the desired and the actual frequency responses, maximizing y produces a filter with the minimum error, which is what we want. Designs where the optimal y is negative are instances of the approximation design style. (In Example 6, we show an example of a limit-style design where the constraints are not violated and y is positive. Even in that case, maximizing y turns out to be the right design criterion.)