If a software-equalizer possesses GUI controls that correspond to approximate octaves, or repeated 1-2-5 sequences, it is entirely likely to be implemented as a set of bandpass filters acting in parallel. However, the simplistic bandpass filters I was contemplating, would also have required that the signal be multiplied by a factor of 4, to achieve unit gain where their low-pass and high-pass cutoff frequencies join, as I described in this posting.

(Edit 03/23/2017:

Actually, the parameters which define each digital filter, are non-trivial to compute, but nevertheless computable when the translation into the digital domain has been carried out correctly. And so a type of equalizer can be achieved, based on derived bandpass-filters, on the basis that each bandpass-filter has been tuned correctly.

If the filters cross over at their -6db point, then one octave lower or higher, one filter will reach its -3db point, while the other will reach its -12db point. So instead of -12db, this combination would yield -15db.

The fact that the signal which has wandered into one adjacent band is at -3db with respect to the center of that band, does not lead to a simple summation, because there is also a phase-shift between the frequency-components that wander across.

I suppose that the user should be aware, that in such a case, the gain of the adjacent bands has not dropped to zero, at the peak of the current band, so that perhaps the signal will simplify, if the corner-frequencies have been corrected. This way, a continuous curve will result from discrete settings.

Now, if the intention is to design a digital bandpass filter with greater than 6 db /Octave falloff curves, the simplistic approach would be just to put two of the previous stages in series – into a pipeline resulting in second-order filters.

Also, the only way then to preserve the accuracy of the input samples, is to convert them into floating-point format first, for use in processing, after which they can be exported to a practical audio-format again. )

(Edit 03/25/2017 :

The way simplistic high-pass filters work, they phase-shift the signal close to +90⁰ far down along the part of the frequency-response-curve, which represents their roll-off. And simplistic low-pass filters will phase-shift the signal close to -90⁰ under corresponding conditions.

OTOH, Either type of filter is supposed to phase-shift their signal ±45⁰, at their -3db point.

What this means is that if the output from several band-pass filters is taken in parallel – i.e. summed – then the center-frequency of one band will be along the roll-off part of the curve of each adjacent band, which combined with the -3db point from either its high-pass or its low-pass component. But then if the output of this one central band is set to zero, the output from the adjacent bands will be 90⁰ apart from each other. )

(Edit 03/29/2017 :

A further conclusion of this analysis would seem to be, that even to implement an equalizer with 1 slider /Octave properly, requires that each bandpass-filter be a second-order filter instead. That way, when the signals wander across to the center-frequency of the slider for the next octave, they will be at -6db relative to the output of that slider, and 180⁰ phase-shifted with respect to each other. Then, setting the center slider to its minimum position will cause the adjacent ones to form a working Notch Filter, and will thus allow any one band to be adjusted arbitrarily low.

And, halfway between the slider-center-frequencies, the gain of each will again be -3db, resulting in a phase-shift of ±90 with respect to the other one, and achieving flat frequency-response, when all sliders are in the same position.

The problem becomes, that if a 20-band equalizer is attempted, because the 1 /Octave example already required second-order bandpass-filters, the higher one will require 4th-order filters by same token, which would be a headache to program… )

(Edited 02/28/2017 : But what I think more likely, is that what was difficult in analog technology has become easy with digital technology, and vice-verso. An equalizer GUI that has widgets corresponding to ‘some other spacing of frequencies’, can be implemented as an equalizer function with an equal spacing of frequencies, which gets put through a Type 1 Discrete Cosine Transform, the sampling interval of which is just longer, according to how close the closest spacing of frequencies is – which is then also a constant spacing. This DCT will lead to a time-domain set of weights, that can be used as a convolution. )

I suspect that the hardest part of the coding would then be, how asynchronous code changes the set of weights, while other, time-critical code is using them in real-time. The easier part of that exercise would be, only to compute and apply the convolution once, when the user lets go of the widget he is adjusting.

But what can easily be implemented with software, is that the uniform terms of the equalizer function can follow from an interpolation, of the settings of GUI widgets. And then the main question which remains, if the GUI widgets are spaced logarithmically, would be whether the interpolation should also be logarithmic, or whether that can be linear for the sake of simplifying the Math. But even a logarithmic interpolation does not complicate Math too much.


a = ( log(s/u1) / log(u2/u1) )
LogLin(s) = ((1 - a) * F(u1)) + (a * F(u2))
E(s) = ((1 - a) * log(F(u1))) + (a * log(F(u2)))
LogLog(s) = exp(E(s))




(Edit 03/15/2017 : )

I think that back in the analog days, a circuit-block which was widely used, was a State-Variable Filter, precisely because that design allowed for an arbitrarily high , without having to add multiple stages to accomplish that.

Further, once this possibility was discovered, an immediate design decision by the electronics industry was also, to replace graphical equalizers with parametric equalizers, the feature of the latter being, that each filter could be adjusted by the listener to assume an arbitrary center-frequency, as well as to associate attenuation or gain with that, and to allow the listener to set the frequency-width of that one stage – i.e. the value of .

The more important advantage of that was, that fewer circuit-blocks could solve playback-issues which listeners would run in to, which a graphical equalizer represented overkill in solving. For example, a listener might have noticed some small amount of interference at one exact frequency, and might have wanted to suppress that one frequency really. And then, to shell out the cash for a 20-band graphical equalizer, would not only have represented overkill, but would also have delivered a device more-difficult to operate.

In the digital era, we can have a complex DAW module that approximates a State-Variable Filter. But I would not recommend putting 10 of those into our DAW project.

Further, if it was our intention to implement a graphical equalizer in software, using the approach I wrote about above, a fact to bear in mind would be that the lowest-frequency-band also sets the uniform separation in frequencies all the way to 20kHz (+). And while this is doable, it means that a lengthy buffer must be assigned for one equalizer, thereby no longer offering a low-latency approach.

If numerous band-pass filters are being used, the result is quite low-latency.

I suppose that one question which a reader might have about State-Variable Filters, which he might not find a satisfactory answer to within the article I linked to above, could be of the form ‘Two of the stages within the feedback loop are integrators. Why, then, is it possible for the signal tapped from the input of the earlier integrator, to form a high-pass filter?’

I think that the answer lies in linear combination of the outputs, and feedback. If negative feedback from a later stage causes the amplitude of the signal to level off there, then the integrator which precedes it is still applying potentially infinite gain to it, depending on how far below the unity-gain-point its frequency is as input to the preceding integrator. This also means, that the amplitude diminishes in the preceding stage.

With an SVF, there is not one integrator but two. So it follows in a roundabout way, that high-pass, band-pass and low-pass taps can be taken from it.

However, I have just fallen prey to the risk of misinterpreting a visual, circuit diagram. In the linked article, each integrator is known to be an inverting circuit. But closer inspection of the circuit shows, that the output from the second integrator (the 3rd tap), which is positive with respect to the output of the summing amplifier (the 1st tap), is in fact added negatively, while the output from the 2nd tap is also added negatively – if we take into account, that the 1st integrator is also an inverting one.

Because each integrator by its nature phase-shifts its signal by -90⁰, the negative feedback from the second one implies positive feedback somewhere. And that is where a higher can come from, even though I myself, would not have recommended adding positive feedback there. This gets offset by the negative feedback from the 2nd tap.

(Edit 03/17/2017 : Follows as the reciprocal of twice the Damping Factor, which follows as the negative amount of feedback applied to the 2nd tap. I do not see any reason, why the feedback applied to the 3rd tap should be anything other than (-1), and also ignore for the moment that the DC gain could be other than (1). )

There did exist one application in which something akin to an SVF offered useful low-pass and high-pass outputs: The Bass and Treble controls of an amplifier. That application also saw a much wider band-pass range, meaning that its examples were likely better-behaved than ones with narrow pass-bands. The feedback of the 2nd integrator, taken from the 3rd tap, would determine that we wanted the Bass canceled as output from the 2nd tap, and constant negative feedback from the 2nd tap, which was also the output from the 1st integrator, stabilized the gain of the band-pass range, and canceled it from the (1st) Treble tap. The signal at the 1st tap defined Treble.

The time-constant of each integrator defines, below what frequency its output-amplitude equals its input-amplitude. And the time-constant of the first should be equal to that of the second. I now suspect, that the first example of an SVF which is studied, has (-1) feedback from the 2nd tap, and from the 3rd tap.

I am no expert in SVFs, but if this were true, then again it would not genuinely be the case, that the selectivity of such a filter could be made arbitrarily high. But what happens instead, in serious applications, is that the specifications of the summing amplifier, define to be something better than 6db /Octave.

The question which ensues is, whether we would want the other parts of the spectrum included in the output, or only the part of the spectrum actually selected by this hypothetical band-pass filter. If this component was meant to be used as a parametric equalizer module, so that what follows its output can perform other processing on the signal, then the answer will be the former.

(Edit 03/18/2017 : The main problem against any attempt to mix the output from the 2nd tap with the original signal, will be hampered by the fact that it is phase-shifted -90⁰ at the 2nd tap, in spite of the feedback. Thus, the parametric equalizer function is best implemented as a linear combination of the original signal, with the Notch Filter function. )

(Edit 03/17/2017 : If it was our goal to implement a pure Notch Filter, then the best way to do that would be by summing the values from the 1st and 3rd tap. )

(Content Deleted 03/17/2017. )

(Edit 03/17/2017 : )

One of the reasons for which the link I cited above, about the SVF, can be confusing, has to do with how a single operational amplifier can act to form arbitrary sums with positive and negative weights, on an arbitrary number of inputs.

Doing so results in multipliers which are both the fractions and sums of the resistances, in non-obvious ways. Computationally, the SVF can be understood simply in terms of the multipliers, but the cited exercise bogs slightly, on determining what resistor-values should follow.

Dirk