Volume Based High pass Filter

Hello, I am new to this and am trying to use a wondom amplifier with adau1701 built in to make a speaker with dsp. Basically I wanted to shift a high pass filters center frequency from 12Hz at the lowest volume up to 55Hz at full volume but I am not sure this is possible. The only examples I can find online are using the DC input/integer values to change the between 2 filter options (i won't lie i do not fully understand this) but I would like it to be a more gradual loss of low frequency information rather than just starting off with the 55hz highpass.

Thank you so much for any help, this looks like a very powerful tool if I can learn it. If there are useful links that could also help me get started to understand things like the look up tables etc please attach those links... I am going to school for mechanical engineering and programming is not my strong suit. :)

  • +1
    •  Super User 
    on Dec 9, 2019 3:05 AM 11 months ago

         Hello Marcello,

         Welcome to SigmaDSP and the forum!  You're right, you can do rather amazing things with these chips.  Often the first place to find help with the various signal processing blocks available in SigmaStudio is the wiki:

    https://wiki.analog.com/resources/tools-software/sigmastudio

         ADI's Dynamic Bass module can do what you're looking for -- in addition to a sliding bass boost, it includes a sharp highpass filter you can set to the lowest frequency your woofer can handle -- to keep subsonic stuff from shaking it apart.  Besides the wiki, some additional info on how it performs is available here:

    Dynamic Bass Basics

        You can certainly make your own sliding filter by combining a few smaller blocks.  You could, for example, set up an Envelope Follower to measure your audio level, converting it to a DC level suitable to feed a lookup table.  Then the table output would drive an Index Selectable Filter which you can program with a number of curves to achieve your variable response.  The Index Filter's control input requires an integer index (28.0 format in the ADAU1701), while signals generally are in decimal (5.23 format) -- for help with this, please see:

    https://ez.analog.com/dsp/sigmadsp/w/documents/5169/what-are-the-number-formats-for-sigmadsp

         There's a few examples of sliding filters here,  Yet, you'll have more fun figuring it out for yourself.  Go ahead and make the usual beginners' mistakes as others have before you, and enjoy the ride!

         Best regards,

         Bob

  • WOW thank you so much you responded so quickly!

    I will be diving deep into all those links you sent me, the sliding filters seem to be the exact thing I was looking for, those are beautiful schematics you have made for so many people 

    :D

  • Hi Bob,

    Sorry to bother you but I am not sure what I'm doing wrong. I finally got around to messing with the DSP amp and speakers. I am trying to make the volume based (from aux input signal/phone volume not a potentiometer) tracking/sliding  high-pass filter work and I set the center frequencies of the index filters far enough apart that I should audibly be able to tell missing lower frequencies at higher volumes but it sounds like it's just sticking with index filter 0 the whole time, not changing between index filter 0-11 according to volume. I attached the project, its modified from other ones you posted

    Thank you so much,
    Marcello

    1701Loudness modified.zip

  • +1
    •  Super User 
    on Dec 28, 2019 3:17 PM 11 months ago in reply to Marcello441

         Hello Marcello,

         You're well on your way to making your project work.  Thank you for attaching your project, since a screenshot wouldn't have shown a fatal yet easily fixed difficulty.  It's the Table inside the Log LUT -- click it and you'll see it's filled with its default 1's.  Thus no matter its input, the LUT outputs 1.0, in turn the Index Filters see integer 1 and you always get the same curve.  I edited the table to include numbers from 0 to 10.  Of course you're free to make the table do what you need.

         In addition it's necessary to place one of the Envelope Follower blocks between the HP filter and your Log LUT, as shown below.  The idea is to generate a new signal that follows the envelope (the overall loudness) of the audio input to your device, without tracing all its AC pluses and minuses.  It works much like a full-wave rectifier and filter.  Without it, your Log LUT dutifully follows the audio waveform, producing a wildly varying output.  The Index Filter's slew action attempts to average this out, yet it's far better to do this earlier in the process.  Out of the available Envelope blocks, I chose the Peak External Decay version.  It instantly shifts to the peak input level to protect your woofer, then gradually reduces after the peak goes away.  Select how fast the decrease happens by adjusting the attached Gain block -- the higher the small fractional number, the quicker its decay.  Why use an External Decay Peak Block and feedback?  It produces an exponential decay. -- please see this post for why this may be important.  You can substitute a different Envelope block as desired.

         Finally, I also added a Readback so you can observe the Filter's index input without having to make the filter audibly obvious.  Hope this helps.

         Best regards,

         Bob

    1701Loudness modified-2.zip

  • Bob, YOU ARE AMAZING!

    I have been messing around with it changing values and it has been working great for my purposes so far, I still need to go in depth to try and understand it all better but I can't thank you enough. You are an invaluable help to DIYers like me, I could not find this specific circuit online and there are not many videos on sigmastudio (and the ones that exist are very basic). This file has already solved my original problem/worry of people raising the volume too loud and blowing out the speakers and allowed me to provide music to a small get-together because of your help.

    Happy New Years!
    Marcello