| @@ -0,0 +1,108 @@ | |||
| /* .fir file parameters which generated these coefficients | |||
| 100 1 3 16 32768 44100 | |||
| 0 500 1200 1700 2300 | |||
| 0.0000 1.0000 0.0000 | |||
| 70.0000 1.0000 70.0000 | |||
| */ | |||
| (short)0xFFAA, | |||
| (short)0xFFC5, | |||
| (short)0xFFB6, | |||
| (short)0xFFA7, | |||
| (short)0xFF9B, | |||
| (short)0xFF94, | |||
| (short)0xFF93, | |||
| (short)0xFF9A, | |||
| (short)0xFFAA, | |||
| (short)0xFFC4, | |||
| (short)0xFFE9, | |||
| (short)0x0017, | |||
| (short)0x004F, | |||
| (short)0x008E, | |||
| (short)0x00D1, | |||
| (short)0x0115, | |||
| (short)0x0155, | |||
| (short)0x018F, | |||
| (short)0x01BC, | |||
| (short)0x01D9, | |||
| (short)0x01E2, | |||
| (short)0x01D3, | |||
| (short)0x01AB, | |||
| (short)0x0168, | |||
| (short)0x010A, | |||
| (short)0x0095, | |||
| (short)0x000B, | |||
| (short)0xFF72, | |||
| (short)0xFED1, | |||
| (short)0xFE2E, | |||
| (short)0xFD92, | |||
| (short)0xFD06, | |||
| (short)0xFC92, | |||
| (short)0xFC3D, | |||
| (short)0xFC0D, | |||
| (short)0xFC08, | |||
| (short)0xFC30, | |||
| (short)0xFC85, | |||
| (short)0xFD06, | |||
| (short)0xFDAF, | |||
| (short)0xFE79, | |||
| (short)0xFF5C, | |||
| (short)0x004D, | |||
| (short)0x0143, | |||
| (short)0x0231, | |||
| (short)0x030D, | |||
| (short)0x03CB, | |||
| (short)0x0463, | |||
| (short)0x04CC, | |||
| (short)0x0502, | |||
| (short)0x0502, | |||
| (short)0x04CC, | |||
| (short)0x0463, | |||
| (short)0x03CB, | |||
| (short)0x030D, | |||
| (short)0x0231, | |||
| (short)0x0143, | |||
| (short)0x004D, | |||
| (short)0xFF5C, | |||
| (short)0xFE79, | |||
| (short)0xFDAF, | |||
| (short)0xFD06, | |||
| (short)0xFC85, | |||
| (short)0xFC30, | |||
| (short)0xFC08, | |||
| (short)0xFC0D, | |||
| (short)0xFC3D, | |||
| (short)0xFC92, | |||
| (short)0xFD06, | |||
| (short)0xFD92, | |||
| (short)0xFE2E, | |||
| (short)0xFED1, | |||
| (short)0xFF72, | |||
| (short)0x000B, | |||
| (short)0x0095, | |||
| (short)0x010A, | |||
| (short)0x0168, | |||
| (short)0x01AB, | |||
| (short)0x01D3, | |||
| (short)0x01E2, | |||
| (short)0x01D9, | |||
| (short)0x01BC, | |||
| (short)0x018F, | |||
| (short)0x0155, | |||
| (short)0x0115, | |||
| (short)0x00D1, | |||
| (short)0x008E, | |||
| (short)0x004F, | |||
| (short)0x0017, | |||
| (short)0xFFE9, | |||
| (short)0xFFC4, | |||
| (short)0xFFAA, | |||
| (short)0xFF9A, | |||
| (short)0xFF93, | |||
| (short)0xFF94, | |||
| (short)0xFF9B, | |||
| (short)0xFFA7, | |||
| (short)0xFFB6, | |||
| (short)0xFFC5, | |||
| (short)0xFFAA, | |||
| @@ -0,0 +1,8 @@ | |||
| #include "filters.h" | |||
| short low_pass[NUM_COEFFS] = { | |||
| #include "lopass_4000_44100.h" | |||
| }; | |||
| short band_pass[NUM_COEFFS] = { | |||
| #include "bandp_1200_1700.h" | |||
| }; | |||
| @@ -0,0 +1,5 @@ | |||
| // Number of coefficients | |||
| #define NUM_COEFFS 100 | |||
| extern short low_pass[]; | |||
| extern short band_pass[]; | |||
| @@ -0,0 +1,149 @@ | |||
| /* | |||
| 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 which | |||
| // makes just pass through the audio | |||
| // 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 | |||
| 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 myFilter; | |||
| AudioOutputI2S audioOutput; // audio shield: headphones & line-out | |||
| // Create Audio connections between the components | |||
| // Both channels of the audio input go to the FIR filter | |||
| AudioConnection c1(audioInput, 0, myFilter, 0); | |||
| AudioConnection c2(audioInput, 1, myFilter, 1); | |||
| // both channels from the FIR filter go to the audio output | |||
| AudioConnection c3(myFilter, 0, audioOutput, 0); | |||
| AudioConnection c4(myFilter, 1, 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); | |||
| while (!Serial) ; | |||
| delay(3000); | |||
| pinMode(PASSTHRU_PIN,INPUT_PULLUP); | |||
| pinMode(FILTER_PIN,INPUT_PULLUP); | |||
| // It doesn't work properly with any less than 8 | |||
| AudioMemory(8); | |||
| audioShield.enable(); | |||
| audioShield.inputSelect(myInput); | |||
| audioShield.volume(50); | |||
| // 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 | |||
| myFilter.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; | |||
| void loop() | |||
| { | |||
| // Volume control | |||
| int n = analogRead(15); | |||
| if (n != volume) { | |||
| volume = n; | |||
| audioShield.volume((float)n / 10.23); | |||
| } | |||
| // 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; | |||
| myFilter.begin(FIR_PASSTHRU,0); | |||
| } | |||
| // If passthru button is released, restore previous filter | |||
| if(b_passthru.risingEdge()) { | |||
| if(old_idx != -1)myFilter.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; | |||
| myFilter.begin(fir_list[fir_idx].coeffs,fir_list[fir_idx].num_coeffs); | |||
| } | |||
| } | |||
| @@ -0,0 +1,109 @@ | |||
| /* .fir file parameters which generated these coefficients | |||
| 100 1 2 16 32768 44100 | |||
| 0 1000 2000 | |||
| 1.0000 0.0000 | |||
| 1.0000 70.0000 | |||
| */ | |||
| (short)0x0015, | |||
| (short)0x0011, | |||
| (short)0x0017, | |||
| (short)0x001E, | |||
| (short)0x0025, | |||
| (short)0x002C, | |||
| (short)0x0032, | |||
| (short)0x0037, | |||
| (short)0x003B, | |||
| (short)0x003C, | |||
| (short)0x003B, | |||
| (short)0x0036, | |||
| (short)0x002E, | |||
| (short)0x0021, | |||
| (short)0x000F, | |||
| (short)0xFFF9, | |||
| (short)0xFFDE, | |||
| (short)0xFFBF, | |||
| (short)0xFF9C, | |||
| (short)0xFF76, | |||
| (short)0xFF4F, | |||
| (short)0xFF27, | |||
| (short)0xFF02, | |||
| (short)0xFEDF, | |||
| (short)0xFEC2, | |||
| (short)0xFEAC, | |||
| (short)0xFEA0, | |||
| (short)0xFE9F, | |||
| (short)0xFEAC, | |||
| (short)0xFEC8, | |||
| (short)0xFEF4, | |||
| (short)0xFF31, | |||
| (short)0xFF7F, | |||
| (short)0xFFDF, | |||
| (short)0x0050, | |||
| (short)0x00D0, | |||
| (short)0x015E, | |||
| (short)0x01F8, | |||
| (short)0x029A, | |||
| (short)0x0341, | |||
| (short)0x03EA, | |||
| (short)0x0491, | |||
| (short)0x0532, | |||
| (short)0x05CA, | |||
| (short)0x0653, | |||
| (short)0x06CC, | |||
| (short)0x0731, | |||
| (short)0x077F, | |||
| (short)0x07B4, | |||
| (short)0x07CF, | |||
| (short)0x07CF, | |||
| (short)0x07B4, | |||
| (short)0x077F, | |||
| (short)0x0731, | |||
| (short)0x06CC, | |||
| (short)0x0653, | |||
| (short)0x05CA, | |||
| (short)0x0532, | |||
| (short)0x0491, | |||
| (short)0x03EA, | |||
| (short)0x0341, | |||
| (short)0x029A, | |||
| (short)0x01F8, | |||
| (short)0x015E, | |||
| (short)0x00D0, | |||
| (short)0x0050, | |||
| (short)0xFFDF, | |||
| (short)0xFF7F, | |||
| (short)0xFF31, | |||
| (short)0xFEF4, | |||
| (short)0xFEC8, | |||
| (short)0xFEAC, | |||
| (short)0xFE9F, | |||
| (short)0xFEA0, | |||
| (short)0xFEAC, | |||
| (short)0xFEC2, | |||
| (short)0xFEDF, | |||
| (short)0xFF02, | |||
| (short)0xFF27, | |||
| (short)0xFF4F, | |||
| (short)0xFF76, | |||
| (short)0xFF9C, | |||
| (short)0xFFBF, | |||
| (short)0xFFDE, | |||
| (short)0xFFF9, | |||
| (short)0x000F, | |||
| (short)0x0021, | |||
| (short)0x002E, | |||
| (short)0x0036, | |||
| (short)0x003B, | |||
| (short)0x003C, | |||
| (short)0x003B, | |||
| (short)0x0037, | |||
| (short)0x0032, | |||
| (short)0x002C, | |||
| (short)0x0025, | |||
| (short)0x001E, | |||
| (short)0x0017, | |||
| (short)0x0011, | |||
| (short)0x0015, | |||