You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
4.2 KiB
105 lines
4.2 KiB
/* TestEqualizer1Audio.ino Bob Larkin 18 May 2020
|
|
* This is a test of the Filter Equalizer using the Audette OpenAudio_ArduinoLibrary.
|
|
* Runs two different equalizers, switching every 5 seconds to demonstrate
|
|
* dynamic filter changing.
|
|
*/
|
|
|
|
#include "Audio.h"
|
|
#include "OpenAudio_ArduinoLibrary.h"
|
|
#include "DSP_TeensyAudio_F32.h"
|
|
#include <Audio.h>
|
|
|
|
// Signals from ADC to Equalizer to DAC using Teensy Audio Adaptor
|
|
AudioInputI2S i2sIn;
|
|
AudioConvert_I16toF32 convertItoF1;
|
|
AudioConvert_I16toF32 convertItoF2;
|
|
AudioFilterEqualizer_F32 equalize1;
|
|
AudioFilterEqualizer_F32 equalize2;
|
|
AudioConvert_F32toI16 convertFtoI1;
|
|
AudioConvert_F32toI16 convertFtoI2;
|
|
AudioOutputI2S i2sOut;
|
|
AudioConnection patchCord1(i2sIn, 0, convertItoF1, 0);
|
|
AudioConnection patchCord3(i2sIn, 1, convertItoF2, 0);
|
|
AudioConnection_F32 patchCord5(convertItoF1, 0, equalize1, 0);
|
|
AudioConnection_F32 patchCord7(convertItoF2, 0, equalize2, 0);
|
|
AudioConnection_F32 patchCord9(equalize1, 0, convertFtoI1, 0);
|
|
AudioConnection_F32 patchCordB(equalize2, 0, convertFtoI2, 0);
|
|
AudioConnection patchCordD(convertFtoI1, 0, i2sOut, 0);
|
|
AudioConnection patchCordF(convertFtoI2, 0, i2sOut, 1);
|
|
AudioControlSGTL5000 codec;
|
|
|
|
// Some sort of octave band equalizer as a one alternative, 10 bands
|
|
float32_t fBand1[] = { 40.0, 80.0, 160.0, 320.0, 640.0, 1280.0, 2560.0, 5120.0, 10240.0, 22058.5};
|
|
float32_t dbBand1[] = {10.0, 2.0, -2.0, -5.0, -2.0, -4.0, -10.0, 6.0, 10.0, -100};
|
|
|
|
// To contrast, put a strange bandpass filter as an alternative, 5 bands
|
|
float32_t fBand2[] = { 300.0, 500.0, 800.0, 1000.0, 22058.5};
|
|
float32_t dbBand2[] = {-60.0, 0.0, -20.0, 0.0, -60.0};
|
|
|
|
float32_t equalizeCoeffs[200];
|
|
int16_t k = 0;
|
|
|
|
void setup(void) {
|
|
AudioMemory(5);
|
|
AudioMemory_F32(10);
|
|
Serial.begin(300); delay(1000);
|
|
Serial.println("*** Test Audio Equalizer ***");
|
|
codec.enable();
|
|
codec.inputSelect(AUDIO_INPUT_LINEIN);
|
|
codec.adcHighPassFilterDisable(); // necessary to suppress noise
|
|
codec.lineInLevel(2);
|
|
codec.volume(0.8);
|
|
|
|
// Initialize the equalizer with 10 bands, fBand1[] 199 FIR coefficients
|
|
// -65 dB sidelobes, 16384 Max coefficient value
|
|
uint16_t eq = equalize1.equalizerNew(10, &fBand1[0], &dbBand1[0], 30, &equalizeCoeffs[0], 60.0);
|
|
if (eq == ERR_EQ_BANDS)
|
|
Serial.println("Equalizer failed: Invalid number of frequency bands.");
|
|
else if (eq == ERR_EQ_SIDELOBES)
|
|
Serial.println("Equalizer failed: Invalid sidelobe specification.");
|
|
else if (eq == ERR_EQ_NFIR)
|
|
Serial.println("Equalizer failed: Invalid number of FIR coefficients.");
|
|
else
|
|
Serial.println("Equalizer initialized successfully.");
|
|
|
|
eq = equalize2.equalizerNew(10, &fBand1[0], &dbBand1[0], 30, &equalizeCoeffs[0], 60.0);
|
|
if (eq == ERR_EQ_BANDS)
|
|
Serial.println("Equalizer failed: Invalid number of frequency bands.");
|
|
else if (eq == ERR_EQ_SIDELOBES)
|
|
Serial.println("Equalizer failed: Invalid sidelobe specification.");
|
|
else if (eq == ERR_EQ_NFIR)
|
|
Serial.println("Equalizer failed: Invalid number of FIR coefficients.");
|
|
else
|
|
Serial.println("Equalizer initialized successfully.");
|
|
// for (k=0; k<200; k++) Serial.println(equalizeCoeffs[k]);
|
|
}
|
|
|
|
void loop(void) {
|
|
#if 0 // Change between two filters every 10 seconds.
|
|
|
|
// To run with just the 10-band equalizer, comment out the entire loop with "/* ... */"
|
|
|
|
if(k == 0) {
|
|
k = 1;
|
|
equalize1.equalizerNew(10, &fBand1[0], &dbBand1[0], 200, &equalizeCoeffs[0], 65.0);
|
|
equalize2.equalizerNew(10, &fBand1[0], &dbBand1[0], 200, &equalizeCoeffs[0], 65.0);
|
|
}
|
|
else { // Swap back and forth
|
|
k = 0;
|
|
equalize1.equalizerNew(5, &fBand2[0], &dbBand2[0], 100, &equalizeCoeffs[0], 40.0);
|
|
equalize2.equalizerNew(5, &fBand2[0], &dbBand2[0], 100, &equalizeCoeffs[0], 40.0);
|
|
}
|
|
#endif
|
|
delay(10000); // Interrupts will keep the audio going
|
|
Serial.print("Proc = ");
|
|
Serial.print(AudioProcessorUsage());
|
|
Serial.print(" (");
|
|
Serial.print(AudioProcessorUsageMax());
|
|
Serial.print("), Mem = ");
|
|
Serial.print(AudioMemoryUsage());
|
|
Serial.print(" (");
|
|
Serial.print(AudioMemoryUsageMax());
|
|
Serial.println(")");
|
|
AudioProcessorUsageMaxReset();
|
|
AudioMemoryUsageMaxReset();
|
|
}
|
|
|