Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 5 of 5

Thread: Audio Equalizer using Teensy

  1. #1
    Junior Member
    Join Date
    Jan 2015
    Posts
    11

    Audio Equalizer using Teensy

    Hi there!

    I've tried writing a audio equalizer using matlab. So, now i wanted to try using Teensy 3.1. I wanted to add gain to some specific frequencies to enhance my music. I've been trying to use the example Filter_FIR as a base. From what i understand, i can use the mixer gain function to increase the db for specific frequencies, but I have no idea how should i add the gain to the individual filter in the program.

    My codes:
    Code:
    /*
    c
      - released
    b
    - Use FIR filters with fast_fft option
    
    The audio board uses the following pins.
     6 - MEMCS
     7 - MOSI
     9 - BCLK
    10 - SDCS
    11 - MCLK
    12 - MISO
    13 - RX
    14 - SCLK
    15 - VOL
    18 - SDA
    19 - SCL
    22 - TX
    23 - LRCLK
    */
    
    //#include <arm_math.h>
    #include <Audio.h>
    #include <Wire.h>
    #include <SD.h>
    #include <SPI.h>
    #include <Bounce.h>
    #include "filters.h"
    
    // If this pin is grounded the FIR filter is turned off
    // which just passes the audio sraight through
    // Don't use any of the pins listed above
    #define PASSTHRU_PIN 1
    // If this pin goes low the next FIR filter in the list
    // is switched in.
    #define FILTER_PIN 0
    
    // debounce the passthru and filter switching pins
    Bounce b_passthru = Bounce(PASSTHRU_PIN,15);
    Bounce b_filter   = Bounce(FILTER_PIN,15);
    
    //const int myInput = AUDIO_INPUT_MIC;
    const int myInput = AUDIO_INPUT_LINEIN;
    
    
    AudioInputI2S       audioInput;         // audio shield: mic or line-in
    AudioFilterFIR      myFilterL;
    AudioFilterFIR      myFilterR;
    AudioMixer4          mixer1;
    AudioMixer4          mixerLeft;
    AudioMixer4          mixerRight;
    AudioOutputI2S      audioOutput;        // audio shield: headphones & line-out
    
    // Create Audio connections between the components
    // Route audio into the left and right filters
    AudioConnection c1(audioInput, 0, myFilterL, 0);
    AudioConnection c2(audioInput, 1, myFilterR, 0);
    // Route the output of the filters to their respective channels
    AudioConnection c3(myFilterL, 0, mixer1, 0);
    AudioConnection c4(myFilterR, 0, mixer1, 1);
    AudioConnection c5(mixer1, 0, mixerLeft, 0);
    AudioConnection c6(mixer1, 0, mixerRight, 0);
    AudioConnection c7(myFilterL, 0, audioOutput, 0);
    AudioConnection c8(myFilterR, 0, audioOutput, 1);
    AudioControlSGTL5000 audioShield;
    
    
    struct fir_filter {
      short *coeffs;
      short num_coeffs;
    };
    
    // index of current filter. Start with the low pass.
    int fir_idx = 0;
    struct fir_filter fir_list[] = {
      {low_pass , 100},    // low pass with cutoff at 1kHz and -60dB at 2kHz
      {band_pass, 100},    // bandpass 1200Hz - 1700Hz
      {NULL,      0}
    };
    
    
    void setup() {
      Serial.begin(9600);
      delay(300);
    
      pinMode(PASSTHRU_PIN, INPUT_PULLUP);
      pinMode(FILTER_PIN, INPUT_PULLUP);
    
      // allocate memory for the audio library
      AudioMemory(8);
    
      mixerLeft.gain(3, 0.36);
      mixerRight.gain(0, 0.36);
      mixer1.gain(1, 0.36);
      
      audioShield.enable();
      audioShield.inputSelect(myInput);
      audioShield.volume(0.5);
      
      // Warn that the passthru pin is grounded
      if(!digitalRead(PASSTHRU_PIN)) {
        Serial.print("PASSTHRU_PIN (");
        Serial.print(PASSTHRU_PIN);
        Serial.println(") is grounded");
      }
    
      // Warn that the filter pin is grounded
      if(!digitalRead(FILTER_PIN)) {
        Serial.print("FILTER_PIN (");
        Serial.print(FILTER_PIN);
        Serial.println(") is grounded");
      }  
      // Initialize the filter
      myFilterL.begin(fir_list[0].coeffs, fir_list[0].num_coeffs);
      myFilterR.begin(fir_list[0].coeffs, fir_list[0].num_coeffs);
      Serial.println("setup done");
    }
    
    // index of current filter when passthrough is selected
    int old_idx = -1;
    
    // audio volume
    int volume = 0;
    unsigned long last_time = millis();
    
    void loop()
    {
      // Volume control
      int n = analogRead(15);
      if (n != volume) {
        volume = n;
        //uncomment this line if your audio shield has the volume pot
        //audioShield.volume((float)n / 1023);
      }
      
      // update the two buttons
      b_passthru.update();
      b_filter.update();
      
      // If the passthru button is pushed, save the current
      // filter index and then switch the filter to passthru
      if (b_passthru.fallingEdge()) {
        old_idx = fir_idx;
        myFilterL.begin(FIR_PASSTHRU, 0);
        myFilterR.begin(FIR_PASSTHRU, 0);
      }
      
      // If passthru button is released, restore previous filter
      if (b_passthru.risingEdge()) {
        if(old_idx != -1) {
          myFilterL.begin(fir_list[fir_idx].coeffs, fir_list[fir_idx].num_coeffs);
          myFilterR.begin(fir_list[fir_idx].coeffs, fir_list[fir_idx].num_coeffs);
        }
        old_idx = -1;
      }
      
      // switch to next filter in the list
      if (b_filter.fallingEdge()) {
        fir_idx++;
        if (fir_list[fir_idx].num_coeffs == 0) fir_idx = 0;
        myFilterL.begin(fir_list[fir_idx].coeffs, fir_list[fir_idx].num_coeffs);
        myFilterR.begin(fir_list[fir_idx].coeffs, fir_list[fir_idx].num_coeffs);
      }
    
      // print information about resource usage
      // Proc = 18 (18),  Mem = 4 (5)
      if (millis() - last_time >= 2500) {
        Serial.print("Proc = ");
        Serial.print(AudioProcessorUsage());
        Serial.print(" (");    
        Serial.print(AudioProcessorUsageMax());
        Serial.print("),  Mem = ");
        Serial.print(AudioMemoryUsage());
        Serial.print(" (");    
        Serial.print(AudioMemoryUsageMax());
        Serial.println(")");
        last_time = millis();
      }
    
    
    }

  2. #2
    Senior Member
    Join Date
    Jan 2015
    Location
    frisia
    Posts
    285
    You know that the audio codec already includes a predefined 7-band equalizer?

  3. #3
    Junior Member
    Join Date
    Jan 2015
    Posts
    11
    Oh? I have no idea about it. How can I make use of it to include in the source code?

  4. #4
    Senior Member
    Join Date
    Jan 2015
    Location
    frisia
    Posts
    285
    For a 7-band equalizer, you have to calculate the filters yourself. A five band equalizer is the easiest.
    Have a look at the datasheet of the SGTL5000, it has all kind of possibilities. It is more than just a simple ADC/DAC.

    unsigned short AudioControlSGTL5000::eqSelect(uint8_t n) // 0=NONE, 1=PEQ (7 IIR Biquad filters), 2=TONE (tone), 3=GEQ (5 band EQ)
    void AudioControlSGTL5000::eqBands(float bass, float mid_bass, float midrange, float mid_treble, float treble)

  5. #5
    Senior Member
    Join Date
    Nov 2012
    Location
    Boston, MA, USA
    Posts
    1,111
    Before diving into the datasheet, a quick look at the online documentation in the GUI may be helpful. (scroll down. lots. Audio Processor is the section you need.)
    http://www.pjrc.com/teensy/gui/?info...ontrolSGTL5000

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •