Skip to content

Instantly share code, notes, and snippets.

@poulpe
Created January 21, 2016 00:15
Show Gist options
  • Save poulpe/b9f944cd949ca6e50647 to your computer and use it in GitHub Desktop.
Save poulpe/b9f944cd949ca6e50647 to your computer and use it in GitHub Desktop.
/*
fft_adc_serial.pde
guest openmusiclabs.com 7.7.14
example sketch for testing the fft library.
it takes in data on ADC0 (Analog0) and processes them
with the fft. the data is sent out over the serial
port at 115.2kb.
*/
#define LOG_OUT 1 // use the log output function
#define FFT_N 256 // set to 256 point fft
#define OFFSET_THRESH 0 //Set to 0 if not using the adder offset circuit, 30 else
#define N_LED 12 //Number of neopixel leds
#define MAX_AMP 110 //Maximum amplitude of frequency components
#include <FFT.h> // include the library
void setup()
{
//Serial.begin(115200); // use the serial port
TIMSK0 = 0; // turn off timer0 for lower jitter
ADCSRA = 0xe5; // set the adc to free running mode
ADMUX = 0x40; // use adc0
DIDR0 = 0x01; // turn off the digital input for adc0
}
void loop()
{
while(1)
{ // reduces jitter
cli(); // UDRE interrupt slows this way down on arduino1.0
for (int i = 0 ; i < 512 ; i += 2)
{ // save 256 samples
while(!(ADCSRA & 0x10)); // wait for adc to be ready
ADCSRA = 0xf5; // restart adc
byte m = ADCL; // fetch adc data
byte j = ADCH;
int k = (j << 8) | m; // form into an int
k -= 0x0200; // form into a signed int
k <<= 6; // form into a 16b signed int
fft_input[i] = k; // put real data into even bins
fft_input[i+1] = 0; // set odd bins to 0
}
fft_window(); // window the data for better frequency response
fft_reorder(); // reorder the data before doing the fft
fft_run(); // process the data in the fft
fft_mag_log(); // take the output of the fft
sei();
//Serial.println("start");
// Send order to led i according to the amplitude of the frequency component (eyes)
for (uint8_t i = 0 ; i <= 10 ; i++)
{
//Serial.println(fft_log_out[i]); // send out the data
leds(i, (uint8_t)((fft_log_out[10*i] - OFFSET_THRESH)/10)); //
}
// Send order to mouth leds (number 11), for average drum kick frequency value (nearly 100Hz)
leds(11, (uint8_t)((fft_log_out[4] - OFFSET_THRESH)/10));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment