Forum
    • Categories
    • Register
    • Login

    [DEVLOG] Pro EQ

    Scheduled Pinned Locked Moved C++ Development
    7 Posts 5 Posters 44 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • griffinboyG
      griffinboy
      last edited by griffinboy

      Over the last year, I've been doing heavy R&D to design the perfect EQ.
      My initial goal was to "beat" Fabfilter's ProQ4 product.

      I was successful,
      and I'd like to share some of my findings!


      First of all, what's this all about? Why do I want to make a better EQ than ProQ? What's wrong with ProQ?

      a few things.

      1. ProQ's frequency response gets warped near nyquist (high frequencies)
      2. ProQ cannot be modulated for synthesis (the modulation is full of artefacts)

      But before correcting these issues,
      I wanted to first create an EQ that at least matches with ProQ.
      After I've achieved that, then I can create the technology to improve upon it. Right?

      Well, I was not expecting this first step to be so difficult!

      The first thing I did was analyze the ProQ shapes (minimum phase mode) and I discovered instantly that none of them are "standard" EQ shapes. They are all custom shapes, even the normal bell shapes are not what we call "cookbook" shapes. They are all unique shapes that Fabfilter invented. So right off the bat, we can cross off using normal EQ filter shapes that can be found on the internet.

      It makes sense that ProQ would be using custom shapes though.
      If you look at ProQ, the shapes can get super wild. No normal EQ is capable of such high Q!

      freaking steep!

      7af99685-8ecd-4f22-bb9c-79d96e0a3f94-image.png

      And so the first thing I tried was stacking multiple minimum phase filters in series, to try and get the same shapes. Basically I created a cascade of bells, slopes, etc.
      And this paid off, I managed to create a decent "sloped bell" shape and other steep shapes, by combining filters in series.

      However - as soon as I moved the cutoff of all these filters together, we got artefacts. Little inconsistencies would appear, and it turned out that cascading minimum phase filters is actually a little bit delicate. The shape gets warped subtly at different cutoffs, and so the overall filter ended up having weird spikes and nasty shape issues at different cutoffs...!

      ProQ actually does have this issue too - but to a smaller degree compared to my filter cascade.

      The solution was a little devious. This is how I believe ProQ works:


      The EQ is essentially an "analog-prototype digitizer".
      When a Bell is created, the DSP constructs what is called an "Analog Prototype".
      This is an "ideal frequency response" target. In other words it imagines the shape it
      wants to create.

      It then digitizes each part of the shape separately so that we get a cascade of filters
      that match the target when ran in series (same as my initial idea).
      But the important part is that it gives extra weight to "perceptually important points"
      on the filter frequency response target. The solver that creates the matching filters, makes sure
      that the filters will pass through the most important points. This prevents wobble and weird spikes.
      Basically, every time you move the cutoff, the DSP recalculates the entire shape, it creates the
      Analog Prototype frequency response target, and creates the fitted filters that match that shape as close as possible.

      Basically it's adjusting the cascade of filters every time you touch a parameter. Self-correcting itself every time to try and match the "target" frequency response.

      An amazing advantage of this technique is that you can then reduce the amount that you fit to "impossible" parts of the target frequency response. For example doing filtering near nyquist (the top end of the sample rate) you can reduce the amount that you weight towards those parts (trying to fit a filter to ultrasonic frequencies will cause the rest of the filter response to warp and bend) meaning we fit only to the important audible parts and keep the filter response stable.

      The side effect of this, is that you can't really do true modulation. Because you're recalculating the filters every time. So ProQ does crossfades instead, when it recalculates the filters it crossfades from the old ones to the new ones.


      After doing the above, my own EQ filter could match with ProQ4:

      0a2d532f-017e-41eb-a247-015a3c1734bb-image.png

      That was much more complex than I'd imagined!
      They are definitely worthy of the name "Fabfilter" with this kind of effort.

      But...
      🎵I want to be the very best, like noone ever was 🎵

      So I set out on my year long journey to invent a better EQ.
      The final solution involved creating a solver that can be modulated at audio rate, doesn't ever use crossfades, and matches the analog response target as closely as possible. Making the realtime solver smooth so that changing frequency didn't create inconsistencies was the hardest challenge. I present the end result of my research:


      GriffinFilter matches Fabfilter for all the "easy" shapes:

      e2d9b2bd-9a42-4f92-b277-7d3f6199932c-figure.png


      Where Fabfilter warps, GriffinFilter does not:

      91df47a5-cc72-4c9d-bd90-b6be75b6eddd-image.png

      --

      100Q anyone?
      That's twice as steep Q as Fabfilter can manage.

      3a30032f-03f1-4eeb-a36f-00df84fa100d-figure.png

      --

      And we can modulate cleanly, at audio rate
      Here's the printed specs:

      aeaff815-ae79-498b-a6fa-2a468e06d68a-image.png

      CPU usage is currently higher for GriffinEQ.
      But the good news is that the GriffinEQ project is still under development!
      This is the next obstacle for me to tackle. The aim is to get GriffinEQ performance matched with ProQ4.


      And now, for the all important question:
      Q: Do these EQ improvements really matter?
      A: In some ways, no, not really!

      Musicians already use multiple EQ bands. They stack whatever number of bands they want, to get the sound that they want.
      You mix with your ears, not with your eyes.
      And for ordinary EQ situations ProQ4 matches the ideal shape really closely. It only gets warped at the highest frequencies, which are practically inaudible.

      So why go through this enormous effort to improve it?
      The answer is synthesis.
      I love using EQ to create new sounds. And I commonly stack lots of EQ bands ontop of each other and modulate them around like crazy to make wild phasing effects!
      And so the limits of ProQ started to matter to me. I wanted something that was as precise as ProQ, capable of those really steep filter shapes, but I also needed it to modulate smooth and consistent, so that I can do big modulated sweeps that reach right up into the high frequencies! Without unintentional weird spikes or warping. Which is an issue that ProQ still suffers from.

      In scientific terms it's better, and in musical terms it's different.

      Maybe it doesn't hurt to have just one more EQ to choose from? : )


      I plan to make this DSP available in the upcoming Hise Asset Store for free.

      a2bea007-b44f-44a0-9e3f-9b7ba26926f8-image.png

      Custom C++ DSP (for commission)

      dannytaurusD ChazroxC lalalandsynthL ustkU 4 Replies Last reply Reply Quote 10
      • dannytaurusD
        dannytaurus @griffinboy
        last edited by

        @griffinboy That's incredibly impressive! 👏

        HISE dev latest / super.engineering + Claude Fable / Figma + Affinity
        Meat Beats: https://meatbeats.com
        Klippr Video: https://klippr.video

        1 Reply Last reply Reply Quote 0
        • ChazroxC
          Chazrox @griffinboy
          last edited by

          @griffinboy Great job! Fabfilter eq's are currently my go-to's in my workflow. This is a crazy accomplishment! Respect! ⚡

          1 Reply Last reply Reply Quote 0
          • lalalandsynthL
            lalalandsynth @griffinboy
            last edited by

            @griffinboy Just wow...

            https://trikk.studio/
            https://www.instagram.com/trikkstudio/

            1 Reply Last reply Reply Quote 0
            • ustkU
              ustk @griffinboy
              last edited by

              @griffinboy Wow man... 😱

              Hise made me an F5 dude, any other app just suffers...

              griffinboyG 1 Reply Last reply Reply Quote 0
              • griffinboyG
                griffinboy @ustk
                last edited by

                @ustk
                @lalalandsynth
                @Chazrox
                @dannytaurus

                Thanks for your kind comments!
                I've done some optimization today and the EQ now uses 1.5x the CPU of ProQ4.
                Happy progress.

                -You'll have to wait for the Hise Asset store, for me to release this for free, but consider this my gift to all of you fantastic people in the Hise Community. My humble beginnings took place on this platform and forum, and now I code DSP fulltime as my living.

                Custom C++ DSP (for commission)

                lalalandsynthL 1 Reply Last reply Reply Quote 0
                • lalalandsynthL
                  lalalandsynth @griffinboy
                  last edited by

                  @griffinboy said in [DEVLOG] Pro EQ:

                  My humble beginnings took place on this platform and forum, and now I code DSP fulltime as my living.

                  That is just awesome :)

                  https://trikk.studio/
                  https://www.instagram.com/trikkstudio/

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  25

                  Online

                  2.5k

                  Users

                  13.9k

                  Topics

                  121.1k

                  Posts