Why is controlling filter frequency with envelope causing distortion?

Hey, hoping someone can help as it’s beyond me. I have tried to use ABS into some LPFs to create a guitar envelope to control the cutoff of a filter, basically an autowah kind of effect. Whilst it works it sounds very distorted and i cannot for the life of me figure out why. Using teensy 4.0 with audio shield FYI


Code:
#include "effect_abs.h"
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>

// GUItool: begin automatically generated code
AudioInputI2S            i2s1;           //xy=89.88888931274414,110.66666793823242
AudioEffectAbs           abs1;           //xy=210,35.555556297302246
AudioFilterBiquad        biquad1;        //xy=350.00002670288086,38.88889026641846
AudioFilterBiquad        biquad2;
AudioFilterBiquad        biquad3;
AudioFilterBiquad        biquad4;
AudioAmplifier           amp1;
AudioFilterStateVariable filter2;        //xy=354.44444274902344,110.00000381469727
AudioOutputI2S           i2s2;           //xy=528.2222518920898,57.33333969116211
AudioConnection          patchCord1(i2s1, 0, abs1, 0);
AudioConnection          patchCord2(i2s1, 0, filter2, 0);
AudioConnection          patchCord3(abs1, 0, biquad1, 0);
AudioConnection          patchCord6(biquad1, 0, biquad2, 0);
AudioConnection          patchCord7(biquad2, 0, biquad3, 0);
AudioConnection          patchCord8(biquad3, 0, biquad4, 0);
AudioConnection          patchCord4(amp1, 0, filter2, 1);
AudioConnection          patchCord9(biquad4, 0, amp1, 0);

AudioConnection          patchCord5(filter2, 1, i2s2, 0);
AudioControlSGTL5000     sgtl5000_1;     //xy=716.5555725097656,208.22222709655762
// GUItool: end automatically generated code


void setup() {
  AudioMemory(60);

    biquad1.setLowpass(0, 200, 0.53);
    biquad1.setLowpass(1, 200, 0.707);
    biquad1.setLowpass(2, 60, 0.53);
    biquad1.setLowpass(3, 160, 0.707);

    biquad2.setLowpass(0, 200, 0.53);
    biquad2.setLowpass(1, 200, 0.707);
    biquad2.setLowpass(2, 60, 0.53);
    biquad2.setLowpass(3, 160, 0.707);

    biquad3.setLowpass(0, 200, 0.53);
    biquad3.setLowpass(1, 200, 0.707);
    biquad3.setLowpass(2, 60, 0.53);
    biquad3.setLowpass(3, 160, 0.707);

    biquad4.setLowpass(0, 200, 0.53);
    biquad4.setLowpass(1, 200, 0.707);
    biquad4.setLowpass(2, 60, 0.53);
    biquad4.setLowpass(3, 160, 0.707);

  filter2.frequency(100);
  filter2.resonance(5);
  filter2.octaveControl(7);

  amp1.gain (6);
}

void loop() {
}


Thanks!
 
Sorry, I am not familiar with the "ABS" effect/object that you are using. What is it, what is it supposed to do, & can you please post where you got the library/code for it ??

Mark J Culross
KD5RXT
 
So your path is i2s -> abs ->biquad -> etc.

The abs is a non-linear operation (all negatitv values are flipped to positive) and therefore is generating an infinite amount of distortions.
 
Yes that’s where i found the ABS, thanks for linking.

So your path is i2s -> abs ->biquad -> etc.

The abs is a non-linear operation (all negatitv values are flipped to positive) and therefore is generating an infinite amount of distortions.

The impression i got from that thread was that the abs is doing some kind of rectification in order to create an envelope detector, other people seemed to have good results with it but how you describe it makes sense in terms of generating distortion, it’s kind of how some analog octaving effects work right?

What i don’t understand is why this distortion is making it into the output. That envelope detection part is only used as a frequency control for the filter, the ‘clean’ signal should just go straight from input, to filter, to output no?
 
From the AudioFilterStateVariable description:
resonance(Q);
Set the filter's resonance. Q ranges from 0.7 to 5.0. Resonance greater than 0.707 will amplify the signal near the corner frequency. You must attenuate the signal before input to this filter, to prevent clipping.
 
From the AudioFilterStateVariable description:
Well what good timing, that’s actually exactly what i just tried doing, as well as adding some more biquad filters and it seems to be sounding a lot cleaner now. Thanks for quoting that, nice to have some confirmation for what i accidentally stumbled across ha.

In case it’s helpful to anyone in the future i’ll post the code as it is. amp values may beed tweaking to taste:




Code:
#include "effect_abs.h"
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>

// GUItool: begin automatically generated code
AudioInputI2S            i2s1;           //xy=89.88888931274414,110.66666793823242
AudioEffectAbs           abs1;           //xy=210,35.555556297302246
AudioFilterBiquad        biquad1;        //xy=350.00002670288086,38.88889026641846
AudioFilterBiquad        biquad2;
AudioFilterBiquad        biquad3;
AudioFilterBiquad        biquad4;
AudioFilterBiquad        biquad5;
AudioFilterBiquad        biquad6;
AudioFilterBiquad        biquad7;
AudioFilterBiquad        biquad8;
AudioFilterBiquad        biquad9;
AudioFilterBiquad        biquad10;
AudioFilterBiquad        biquad11;
AudioFilterBiquad        biquad12;

AudioAmplifier           amp1;
AudioAmplifier           amp2;
AudioAmplifier           amp3;
AudioFilterStateVariable filter2;        //xy=354.44444274902344,110.00000381469727
AudioOutputI2S           i2s2;           //xy=528.2222518920898,57.33333969116211
AudioConnection          patchCord1(i2s1, 0, amp2, 0);
AudioConnection          patchCord2(amp2, 0, abs1, 0);
AudioConnection          patchCord3(i2s1, 0, filter2, 0);
AudioConnection          patchCord4(abs1, 0, biquad1, 0);
AudioConnection          patchCord5(biquad1, 0, biquad2, 0);
AudioConnection          patchCord6(biquad2, 0, biquad3, 0);
AudioConnection          patchCord7(biquad3, 0, biquad4, 0);
AudioConnection          patchCord8(biquad3, 0, biquad4, 0);
AudioConnection          patchCord9(biquad4, 0, biquad5, 0);
AudioConnection          patchCord10(biquad5, 0, biquad6, 0);
AudioConnection          patchCord11(biquad6, 0, biquad7, 0);
AudioConnection          patchCord12(biquad7, 0, biquad8, 0);
AudioConnection          patchCord13(biquad8, 0, biquad9, 0);
AudioConnection          patchCord14(biquad9, 0, biquad10, 0);
AudioConnection          patchCord15(biquad10, 0, biquad11, 0);
AudioConnection          patchCord16(biquad11, 0, biquad12, 0);
AudioConnection          patchCord17(amp1, 0, filter2, 1);
AudioConnection          patchCord18(biquad12, 0, amp1, 0);
AudioConnection          patchCord19(filter2, 1, amp3, 0);
AudioConnection          patchCord20(amp3, 0, i2s2, 0);
AudioControlSGTL5000     sgtl5000_1;     //xy=716.5555725097656,208.22222709655762
// GUItool: end automatically generated code


void setup() {
  AudioMemory(60);

    biquad1.setLowpass(0, 200, 0.53);
    biquad1.setLowpass(1, 200, 0.707);
    biquad1.setLowpass(2, 60, 0.53);
    biquad1.setLowpass(3, 160, 0.707);

    biquad2.setLowpass(0, 200, 0.53);
    biquad2.setLowpass(1, 200, 0.707);
    biquad2.setLowpass(2, 60, 0.53);
    biquad2.setLowpass(3, 160, 0.707);

    biquad3.setLowpass(0, 200, 0.53);
    biquad3.setLowpass(1, 200, 0.707);
    biquad3.setLowpass(2, 60, 0.53);
    biquad3.setLowpass(3, 160, 0.707);

    biquad4.setLowpass(0, 200, 0.53);
    biquad4.setLowpass(1, 200, 0.707);
    biquad4.setLowpass(2, 60, 0.53);
    biquad4.setLowpass(3, 160, 0.707);

    biquad5.setLowpass(0, 200, 0.53);
    biquad5.setLowpass(1, 200, 0.707);
    biquad5.setLowpass(2, 60, 0.53);
    biquad5.setLowpass(3, 160, 0.707);

    biquad6.setLowpass(0, 200, 0.53);
    biquad6.setLowpass(1, 200, 0.707);
    biquad6.setLowpass(2, 60, 0.53);
    biquad6.setLowpass(3, 160, 0.707);

    biquad7.setLowpass(0, 200, 0.53);
    biquad7.setLowpass(1, 200, 0.707);
    biquad7.setLowpass(2, 60, 0.53);
    biquad7.setLowpass(3, 160, 0.707);

    biquad8.setLowpass(0, 200, 0.53);
    biquad8.setLowpass(1, 200, 0.707);
    biquad8.setLowpass(2, 60, 0.53);
    biquad8.setLowpass(3, 160, 0.707);

    biquad9.setLowpass(0, 200, 0.53);
    biquad9.setLowpass(1, 200, 0.707);
    biquad9.setLowpass(2, 60, 0.53);
    biquad9.setLowpass(3, 160, 0.707);

    biquad10.setLowpass(0, 200, 0.53);
    biquad10.setLowpass(1, 200, 0.707);
    biquad10.setLowpass(2, 60, 0.53);
    biquad10.setLowpass(3, 160, 0.707);

    biquad11.setLowpass(0, 200, 0.53);
    biquad11.setLowpass(1, 200, 0.707);
    biquad11.setLowpass(2, 60, 0.53);
    biquad11.setLowpass(3, 160, 0.707);

    biquad12.setLowpass(0, 200, 0.53);
    biquad12.setLowpass(1, 200, 0.707);
    biquad12.setLowpass(2, 60, 0.53);
    biquad12.setLowpass(3, 160, 0.707);

  filter2.frequency(360);
  filter2.resonance(5);
  filter2.octaveControl(7);

  amp1.gain (5);
  amp2.gain (0.8);
  amp3.gain (1.5);
}

void loop() {
}

Thanks for all the help. Please let me know if i’m doing anything weird in this code, seems to be sounding good though
 
Last edited:
Back
Top