Created
January 21, 2016 00:15
-
-
Save poulpe/b9f944cd949ca6e50647 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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