Hello all,

I am a novice and I am trying to implement FFT (Fast Fourier Transform) on Arduino. I am using this shield

http://www.openmusiclabs.com/projects/codec-shield/I uploaded the following example code on Arduino and tried to get the spectrum of an audio file. I played the file in my computer and sent the signal from the headphone jack to the line_in using a male-male audio cable. Could this be the problem?

Then I opened the serial monitor, set the baud rate to the one specified in the code, but I did not see any data except some characters flashing across. After a while the IDE froze.

I am inexperienced so I will appreciate it if you could tell me where I am making a mistake. Thanks in advance.

The following code is provided by the manufacturer along with the necessary libraries on their website

#define SAMPLE_RATE 44 // 44.1Khz

#define ADCS 0 // no ADCs are being used

#define LOG_OUT 1 // use the log output function

#define FFT_N 256 // set to 256 point fft

// include necessary libraries

#include "FFT.h"

#include <Wire.h>

#include <SPI.h>

#include <AudioCodec.h>

// create data variables for audio transfer

int left_in = 0x0000;

int left_out = 0x0000;

int right_in = 0x0000;

int right_out = 0x0000;

unsigned int count = 0;

volatile byte flag = 1;

void setup() {

Serial.begin(115200); // use serial port

AudioCodec_init();

}

void loop() {

while(1) { // reduces clock jitter

while(flag); // wait for samples to be collected

fft_window(); // window the data

fft_reorder(); // reorder for fft input

fft_run(); // process fft

fft_mag_log(); // take output of fft

Serial.write(255); // send out a start byte

Serial.write(fft_log_out, FFT_N/2); // send out data bytes

flag = 1; // tell the codec that processing is done

}

}

// timer1 interrupt routine - data collected here

ISR(TIMER1_COMPA_vect) { // store registers (NAKED removed)

// &'s are necessary on data_in variables

AudioCodec_data(&left_in, &right_in, left_out, right_out);

left_out = left_in; // pass audio through

right_out = right_in;

if (flag) { // check if the fft is ready for more data

fft_input[count] = left_in; // put real data into even bins

fft_input[count + 1] = 0; // put zeros in odd bins

count += 2; // increment to next bin

if (count >= FFT_N*2) { // check if all bins are full

flag = 0; // tell the fft to start running

count = 0; // reset the bin counter

}

}

}